【MQL5】MathArcsin関数について

MQL5リファレンス
スポンサーリンク
スポンサーリンク

MathArcsin関数の働き・役割

MathArcsin関数は、指定した値の逆正弦(アークサイン)をラジアン単位で計算するために使用されます。この関数は、三角関数の一つである正弦関数逆関数を計算し、結果を角度(-π/2 ~ π/2 ラジアン)として返します。MathArcsin関数を利用することで、-1以上1以下の範囲内にある値に対して対応する角度を求めることができます。

正弦関数とは

正弦関数は、数学において三角形の角度とその辺の比率を表す関数です。中でも直角三角形で使われることが多く、特に角度とその対辺(角度の向かい側にある辺)、斜辺(三角形の一番長い辺)の長さの関係を示します。

例えば、ある直角三角形があったとき、ある角度を「θ(シータ)」とします。このとき、正弦(サイン)は次のように定義されます。

正弦(サイン)= 対辺 ÷ 斜辺

つまり、角度「θ」の向かい側の辺(対辺)の長さを、三角形の一番長い辺(斜辺)の長さで割った値が正弦関数(サイン)の値です。この値は、-1から1の間に収まるようになっています。小さな角度ではサインの値も小さくなり、角度が90度に近づくとサインの値は1に近づきます。

また、三角関数では角度をラジアンという単位で測ることがよくあり、MQL5ではラジアン単位で角度を扱います。

逆正弦とは

逆正弦とは、正弦(サイン)の値から角度を求める計算のことです。正弦(サイン)は角度に対する値を計算するものでしたが、逆正弦ではその反対に、値から角度を求めます。例えば、「サインの値が0.5になる角度は何度か?」といった問いに答えるために使います。

通常、サインの値は-1から1の間にしかなりません。そのため、逆正弦で角度を求める場合も、-1から1の範囲の値に対してしか計算できません。そして、この計算で得られる角度は、ラジアンという単位で表され、範囲は-π/2(-90度)からπ/2(90度)までです。

つまり、逆正弦は「値に対応する角度を見つけるための計算」であり、正弦関数の逆の働きをします。

MathArcsin関数の引数について

double  MathArcsin(
  double  val      // -1<value<1
  );

MathArcsin関数には以下の引数が1つ必要です。

引数1
val
この引数は、逆正弦(サインの値から角度を求める計算)を計算したい値を指定します。valの値は-1以上1以下でなければなりません。-1未満または1より大きい値を指定した場合、MathArcsin関数はNaN(不定値)を返します。これは、逆正弦が計算できない範囲の値が指定されたことを示します。

MathArcsin関数の戻り値について

MathArcsin関数は、指定された値の逆正弦(サインの値から角度を求める計算)をラジアン(角度の単位で、円周を2πとする単位)単位で返します。戻り値の範囲は-π/2(-90度)からπ/2(90度)までです。この範囲内で、指定された値に対する角度が計算されます。

また、引数valに-1未満や1より大きい値が指定された場合、MathArcsin関数は計算を行わず、NaN(不定値)を返します。これは、逆正弦を計算できる範囲外の値が入力されたことを意味します。

MathArcsin関数を使う際の注意点

MathArcsin関数はasin関数と同じ機能を持つため、必要に応じてasin関数を代わりに使用できます。また、大量のデータやループで頻繁に使う場合は、計算のコストに注意し、効率化のためにキャッシュや事前計算を検討してください。

MathArcsin関数を使ったサンプルコード

#define GRAPH_WIDTH 750  // グラフの幅を指定
#define GRAPH_HEIGHT 350 // グラフの高さを指定

#include <Graphics\Graphic.mqh> // グラフ描画用のライブラリをインクルード

CGraphic ExtGraph; // グラフインスタンスを宣言

//+------------------------------------------------------------------+
//| スクリプトプログラムの開始関数                                      |
//+------------------------------------------------------------------+
void OnStart()
 {
  // deltaベクトルを作成し、101個の要素に2π/1000の値を格納する
  vector delta=vector::Full(101,2*M_PI/1000);
  delta[0]=-1; // deltaの最初の値を-1に設定

  //--- deltaの累積和でXベクトルを作成し、-1〜2πの101個の値を取得する
  vector X=delta.CumSum();

  //--- Xベクトルの各値の逆正弦値を計算し、Yベクトルに格納
  vector Y=MathArcsin(X);

  //--- 計算されたXとYの値を配列に転送
  double x_array[],y_array[];
  X.Swap(x_array); // Xベクトルの内容をx_array配列に転送
  Y.Swap(y_array); // Yベクトルの内容をy_array配列に転送

  //--- 計算されたデータを使ってグラフを描画
  CurvePlot(x_array,y_array,clrDodgerBlue);

  //--- ESCキーまたはPgDnキーが押されるまで待機
  while(!IsStopped())
    {
    if(StopKeyPressed()) // 停止キーが押されているか確認
        break; // 押されていればループを抜けて終了
    Sleep(16); // 少し待機して次の確認へ
    }

  //--- グラフのクリーンアップ
  ExtGraph.Destroy(); // グラフインスタンスを破棄してメモリを解放
 }

//+------------------------------------------------------------------+
//| ESCが押されたら「true」を返す、PgDnが押されたらスクリーンショットを保存後「true」を返す |
//| それ以外の場合は「false」を返す                                   |
//+------------------------------------------------------------------+
bool StopKeyPressed()
 {
  //--- ESCキーが押された場合に「true」を返す
  if(TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE)!=0)
    return(true);

  //--- PgDnキーが押され、スクリーンショットの保存に成功したら「true」を返す
  if(TerminalInfoInteger(TERMINAL_KEYSTATE_PAGEDOWN)!=0 && MakeAndSaveScreenshot(MQLInfoString(MQL_PROGRAM_NAME)+"_Screenshot"))
    return(true);

  //--- どちらも押されていない場合は「false」を返す
  return(false);
 }

//+------------------------------------------------------------------+
//| グラフインスタンスを作成して、指定した配列のデータで曲線を描く       |
//+------------------------------------------------------------------+
void CurvePlot(double &x_array[], double &y_array[], const color colour)
 {
  // グラフインスタンスを作成
  ExtGraph.Create(ChartID(), "Graphic", 0, 0, 0, GRAPH_WIDTH, GRAPH_HEIGHT);

  // XとYの配列データを使用して曲線を描画
  ExtGraph.CurveAdd(x_array, y_array, ColorToARGB(colour), CURVE_LINES);

  // グラフの上部に30ピクセル(デジタル画像を構成する最小の単位)空白を追加
  ExtGraph.IndentUp(30);

  // 曲線をグラフに描画
  ExtGraph.CurvePlotAll();

  // ESCとPgDnの使い方の説明文をグラフに追加
  string text1="Press ESC to delete the graph and stop the script, or";
  string text2="Press PgDn to create a screen, delete the graph and stop the script";
  ExtGraph.TextAdd(54, 9, text1, ColorToARGB(clrBlack)); // 最初の説明文を追加
  ExtGraph.TextAdd(54,21, text2, ColorToARGB(clrBlack)); // 2つ目の説明文を追加

  // 描画を更新
  ExtGraph.Update();
 }

//+------------------------------------------------------------------+
//| スクリーンショットを撮影して、指定ファイル名で保存する               |
//+------------------------------------------------------------------+
bool MakeAndSaveScreenshot(const string file_name)
 {
  string file_names[]; // ファイル名リストの配列を作成
  ResetLastError(); // エラー状態をリセット

  // ファイル選択ダイアログを開き、ファイル名を指定
  int selected=FileSelectDialog("Save Picture", NULL, "All files (*.*)|*.*", FSD_WRITE_FILE, file_names, file_name+".png");

  // ファイル選択でエラーが発生した場合や、選択されなかった場合
  if(selected<1)
    {
    if(selected<0) // エラーがあればエラーメッセージを出力
        PrintFormat("%s: FileSelectDialog() function returned error %d", __FUNCTION__, GetLastError());
    return false;
    }

  // スクリーンショットを保存
  bool res=false;
  if(ChartSetInteger(0,CHART_SHOW,false)) // グラフ表示を一時的にオフにする
    res=ChartScreenShot(0, file_names[0], GRAPH_WIDTH, GRAPH_HEIGHT); // スクリーンショットを保存
  ChartSetInteger(0,CHART_SHOW,true); // グラフを再表示
  return(res); // 保存の成否を返す
 }

このサンプルコードは、まずx軸に-1から2πまでの範囲の値を生成し、各値の逆正弦をy軸に対応させて計算します。そして、計算結果をもとに画面に曲線を描画し、グラフ上に操作説明のテキストを追加します。コード実行後は、ESCキーでグラフを消去してスクリプトを停止するか、PgDnキーでスクリーンショットを撮ってグラフを削除し、スクリプトを停止します。

サンプルコード解説1:グローバル領域部分

#define GRAPH_WIDTH 750  // グラフの幅を指定
#define GRAPH_HEIGHT 350 // グラフの高さを指定

#include <Graphics\Graphic.mqh> // グラフ描画用のライブラリをインクルード

CGraphic ExtGraph; // グラフインスタンスを宣言

この部分のコードは、スクリプト全体で使用されるグローバルな設定や変数の宣言を行っています。

最初に、GRAPH_WIDTHとGRAPH_HEIGHTという2つの定数を定義しています。これらの定数は、それぞれ描画するグラフの幅と高さを指定しており、この設定をもとにグラフのサイズが750ピクセル(デジタル画像を構成する最小の単位)×350ピクセルに決定されます。この定数の定義によって、コード全体でグラフのサイズが固定されるため、再利用や変更が容易です。

次に、Graphics\Graphic.mqhというヘッダーファイルをインクルードしています。このヘッダーファイルには、グラフを描画するための関数クラスが定義されており、今回のコードで利用するCGraphicクラスもその一部です。CGraphicクラスを使うことで、グラフの作成や曲線の描画といった操作が可能になります。

最後に、グラフの操作に必要なインスタンス変数)を宣言しています。CGraphic ExtGraphという形でCGraphic型のインスタンスExtGraphを定義し、このインスタンスを通じてグラフを操作します。以降のコードで、このExtGraphインスタンスを使ってグラフの作成や描画、表示内容の更新を行います。

サンプルコード解説2:OnStart関数部分その1

//+------------------------------------------------------------------+
//| スクリプトプログラムの開始関数                                      |
//+------------------------------------------------------------------+
void OnStart()
 {
  // deltaベクトルを作成し、101個の要素に2π/1000の値を格納する
  vector delta=vector::Full(101,2*M_PI/1000);
  delta[0]=-1; // deltaの最初の値を-1に設定

  //--- deltaの累積和でXベクトルを作成し、-1〜2πの101個の値を取得する
  vector X=delta.CumSum();

  //--- Xベクトルの各値の逆正弦値を計算し、Yベクトルに格納
  vector Y=MathArcsin(X);

この部分のコードでは、スクリプトが実行される際の処理として、逆正弦関数を利用した計算データを生成する手順を記述しています。

最初に、deltaというベクトル(複数の値を一つのデータとしてまとめて扱うデータ構造)を作成しています。vectorクラスのFullメソッドを用いて、deltaに101個の要素を持たせ、各要素に2π/1000の値を格納しています。

※「vector::」という表記は、vectorクラスメソッド定数を参照するための構文です。この構文により、vector型の様々なメソッド(例えばFullやCumSumなど)を呼び出すことが可能です。

このdeltaベクトルの初期化によって、-1から2πにわたる範囲で値を生成する準備をしています。例えば、Full(101, 2*M_PI/1000)により、deltaの各要素にはおおよそ0.00628(2π/1000に対応)という値が連続して入ります。

次に、deltaベクトルの最初の要素を-1に設定して範囲を調整しています。これにより、deltaは-1から始まり、以降の要素が順次0.00628ずつ増加していく値の集合になります。

次に、deltaの累積和を計算してXというベクトルに格納しています。CumSumメソッドを用いることで、deltaの各要素が累積的に加算された結果がXに保存されます。これにより、-1から2πまでの101個の値をXベクトルに持たせることができます。例えば、Xの最初の数値は-1で、次の数値は約-0.99372、その次は約-0.98744といった具合に累積された値が並びます。

最後に、MathArcsin関数を用いてXベクトルの各値に対する逆正弦を計算し、結果をYベクトルに格納しています。このYベクトルには、Xの各要素に対応した逆正弦の値が格納されることになり、これらのデータが次のグラフ描画部分で使用されます。

サンプルコード解説3:OnStart関数部分その2

  //--- 計算されたXとYの値を配列に転送
  double x_array[],y_array[];
  X.Swap(x_array); // Xベクトルの内容をx_array配列に転送
  Y.Swap(y_array); // Yベクトルの内容をy_array配列に転送

  //--- 計算されたデータを使ってグラフを描画
  CurvePlot(x_array,y_array,clrDodgerBlue);

この部分のコードでは、逆正弦計算の結果を使ってグラフ描画の準備を行っています。

まず、空の配列x_arrayとy_arrayを宣言しています。これらの配列は、それぞれXベクトルとYベクトルのデータを受け取るためのもので、後にグラフ描画で使用されます。次に、Xベクトルの内容をx_array配列に、Yベクトルの内容をy_array配列に転送するために、Swapメソッドを使用しています。Swapメソッドベクトルの内容を配列に効率的にコピーするメソッドです。

これにより、XとYの計算結果が配列形式に変換され、グラフ描画に適した形に整えられます。そして、CurvePlot関数を呼び出して、計算したデータをもとにグラフを描画しています。CurvePlot関数には、x_arrayとy_array、そしてグラフの線の色clrDodgerBlueが渡され、指定されたデータと色でグラフが描画されます。

サンプルコード解説4:OnStart関数部分その3

 //--- ESCキーまたはPgDnキーが押されるまで待機
  while(!IsStopped())
    {
    if(StopKeyPressed()) // 停止キーが押されているか確認
        break; // 押されていればループを抜けて終了
    Sleep(16); // 少し待機して次の確認へ
    }

  //--- グラフのクリーンアップ
  ExtGraph.Destroy(); // グラフインスタンスを破棄してメモリを解放
 }

この部分のコードは、グラフを表示させたまま、ESCキーまたはPgDnキーが押されるのを待機する処理です。

まず、while文でループを開始し、スクリプトが停止されていない間、つまりIsStopped関数がfalseを返す間はループが続きます。ループの中でStopKeyPressed関数が呼ばれ、ESCキーまたはPgDnキーが押されたかを確認します。もし、いずれかのキーが押されている場合、break文によってループを抜け、待機処理を終了します。これにより、ユーザーが任意のタイミングでグラフの表示を終了できるようになっています。

ループ内でSleep関数が16ミリ秒の待機を挟むことで、CPU負荷を軽減しながらキーの入力を定期的に確認します。待機処理が終了すると、グラフのクリーンアップに移ります。ExtGraphインスタンスに対してDestroyメソッドを呼び出し、グラフを破棄して使用していたメモリを解放します。これにより、スクリプトの終了時にリソースが適切に解放されます。

サンプルコード解説5:StopKeyPressed関数(オリジナル関数)部分

//+------------------------------------------------------------------+
//| ESCが押されたら「true」を返す、PgDnが押されたらスクリーンショットを保存後「true」を返す |
//| それ以外の場合は「false」を返す                                   |
//+------------------------------------------------------------------+
bool StopKeyPressed()
 {
  //--- ESCキーが押された場合に「true」を返す
  if(TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE)!=0)
    return(true);

  //--- PgDnキーが押され、スクリーンショットの保存に成功したら「true」を返す
  if(TerminalInfoInteger(TERMINAL_KEYSTATE_PAGEDOWN)!=0 && MakeAndSaveScreenshot(MQLInfoString(MQL_PROGRAM_NAME)+"_Screenshot"))
    return(true);

  //--- どちらも押されていない場合は「false」を返す
  return(false);
 }

StopKeyPressed関数は、ESCキーやPgDnキーが押されたかどうかを検出し、特定の動作を行うためのカスタム関数です。この関数は、グラフ表示の終了条件を管理する重要な役割を持っています。

まず、TerminalInfoInteger関数を使用してESCキーの状態を確認しています。引数として、TERMINAL_KEYSTATE_ESCAPEという識別子を指定しています。この識別子は、ESCキーの押下状態を取得するために使用され、キーが押されている場合には非ゼロの値が返されます。もし非ゼロが返された場合、関数はtrueを返し、スクリプト内でグラフの表示を終了させることができます。

次に、PgDnキーが押されているかどうかを確認しています。この場合もTerminalInfoInteger関数を使用しており、引数としてTERMINAL_KEYSTATE_PAGEDOWNという識別子を指定しています。この識別子は、PgDnキーの押下状態を取得するために使用され、押されていれば非ゼロが返されます。PgDnキーが押されているときには、さらにMakeAndSaveScreenshot関数を呼び出してスクリーンショットをファイルに保存します。

MakeAndSaveScreenshot関数には、スクリーンショットのファイル名を指定するための文字列引数として渡されています。この文字列は、MQLInfoString関数を使用して生成されています。MQLInfoString関数引数には、MQL_PROGRAM_NAMEという識別子が指定されており、これによって現在のスクリプト名が取得されます。スクリーンショットのファイル名には、このスクリプト名に「_Screenshot」という文字列を追加し、ファイルが保存されます。

スクリーンショットの保存に成功した場合にはtrueが返され、PgDnキーによる終了動作とスクリーンショットの保存が同時に行われます。いずれのキーも押されていない場合にはfalseが返され、スクリプトは実行を続行します。この構造により、ESCまたはPgDnが押されるまでグラフを表示し、必要に応じてスクリーンショットを保存してからスクリプトを終了する動作が可能になります。

サンプルコード解説6:CurvePlot関数(オリジナル関数)部分

//+------------------------------------------------------------------+
//| グラフインスタンスを作成して、指定した配列のデータで曲線を描く       |
//+------------------------------------------------------------------+
void CurvePlot(double &x_array[], double &y_array[], const color colour)
 {
  // グラフインスタンスを作成
  ExtGraph.Create(ChartID(), "Graphic", 0, 0, 0, GRAPH_WIDTH, GRAPH_HEIGHT);

  // XとYの配列データを使用して曲線を描画
  ExtGraph.CurveAdd(x_array, y_array, ColorToARGB(colour), CURVE_LINES);

  // グラフの上部に30ピクセル(デジタル画像を構成する最小の単位)空白を追加
  ExtGraph.IndentUp(30);

  // 曲線をグラフに描画
  ExtGraph.CurvePlotAll();

  // ESCとPgDnの使い方の説明文をグラフに追加
  string text1="Press ESC to delete the graph and stop the script, or";
  string text2="Press PgDn to create a screen, delete the graph and stop the script";
  ExtGraph.TextAdd(54, 9, text1, ColorToARGB(clrBlack)); // 最初の説明文を追加
  ExtGraph.TextAdd(54,21, text2, ColorToARGB(clrBlack)); // 2つ目の説明文を追加

  // 描画を更新
  ExtGraph.Update();
 }

CurvePlot関数は、渡された配列データをもとにグラフを作成し、指定した色で曲線を描画するためのカスタム関数です。この関数には、x軸とy軸のデータ配列、および曲線の色を指定するための引数が含まれています。

最初に、ExtGraphインスタンスのCreateメソッドを使用してグラフを作成しています。Createメソッド引数には、ChartID、グラフの名前(”Graphic”)、座標(0, 0)、および幅と高さ(GRAPH_WIDTHとGRAPH_HEIGHT)が指定されています。ChartID関数は、現在のチャートIDを取得する関数で、これにより生成されたグラフは現在のチャートに描画されます。

次に、ExtGraphインスタンスのCurveAddメソッドを使用して、x軸とy軸の配列データをもとに曲線を追加します。CurveAddメソッド引数には、x_arrayとy_arrayの配列、指定した色をARGB形式に変換するためのColorToARGB関数、そして曲線のスタイル(CURVE_LINES)が渡されています。この処理によって、指定の色とスタイルで曲線が描画されます。

続いて、IndentUpメソッドを使用してグラフの上部に30ピクセル(デジタル画像を構成する最小の単位)の空白を追加しています。これにより、グラフ上に余白が確保され、グラフが画面に適切に配置されるようになります。

その後、CurvePlotAllメソッドを使用して、追加した曲線をグラフに描画しています。

さらに、グラフの操作方法についての説明文を追加しています。text1およびtext2という文字列には、それぞれ「ESCキーでグラフを削除してスクリプトを停止する」「PgDnキーでスクリーンショットを作成してからグラフを削除し、スクリプトを停止する」という内容の説明が含まれています。TextAddメソッドを使って、これらのテキストを画面の指定位置(x=54, y=9 と x=54, y=21)に描画し、説明が表示されるようにしています。

また、色の指定にはColorToARGB関数を使用しています。ColorToARGB関数は、指定された色をARGB(Alpha、Red、Green、Blue)形式に変換し、透過度や色の設定が反映されるようにします。これにより、TextAddメソッドで追加するテキストや曲線が指定の色で正しく表示されます。

最後に、Updateメソッドを呼び出してグラフの描画を更新し、設定したデータやテキストを反映させます。この一連の処理により、x軸とy軸のデータに基づく曲線が描画され、操作の説明が表示されたグラフが完成します。

サンプルコード解説7:MakeAndSaveScreenshot関数(オリジナル関数)部分

//+------------------------------------------------------------------+
//| スクリーンショットを撮影して、指定ファイル名で保存する               |
//+------------------------------------------------------------------+
bool MakeAndSaveScreenshot(const string file_name)
 {
  string file_names[]; // ファイル名リストの配列を作成
  ResetLastError(); // エラー状態をリセット

  // ファイル選択ダイアログを開き、ファイル名を指定
  int selected=FileSelectDialog("Save Picture", NULL, "All files (*.*)|*.*", FSD_WRITE_FILE, file_names, file_name+".png");

  // ファイル選択でエラーが発生した場合や、選択されなかった場合
  if(selected<1)
    {
    if(selected<0) // エラーがあればエラーメッセージを出力
        PrintFormat("%s: FileSelectDialog() function returned error %d", __FUNCTION__, GetLastError());
    return false;
    }

  // スクリーンショットを保存
  bool res=false;
  if(ChartSetInteger(0,CHART_SHOW,false)) // グラフ表示を一時的にオフにする
    res=ChartScreenShot(0, file_names[0], GRAPH_WIDTH, GRAPH_HEIGHT); // スクリーンショットを保存
  ChartSetInteger(0,CHART_SHOW,true); // グラフを再表示
  return(res); // 保存の成否を返す
 }

MakeAndSaveScreenshot関数は、スクリーンショットを撮影し、指定したファイル名で保存する機能を持っています。この関数は、ユーザーがPgDnキーを押した際に呼び出され、現在のチャートのスクリーンショットをファイルに保存する手順を実行します。

最初に、file_namesという空の文字列配列を作成しています。これは、ファイル選択ダイアログから選ばれたファイル名を格納するための配列です。また、ResetLastError関数を呼び出してエラー状態をリセットし、後の処理で発生するエラーが過去のエラーと混在しないようにします。

次に、FileSelectDialog関数を使って、ファイルの保存ダイアログを表示します。この関数の最初の引数にはダイアログタイトル(”Save Picture”)、次の引数にNULL、そしてファイルの種類として”All files (.)|.“を指定しています。
この”(.)|.“の形式は、ファイルダイアログでのファイルフィルターを設定するための書式です。
左側の(.)はフィルターの表示名で「すべてのファイル」を示し、右側の.はフィルターの実際の条件を指定しています。
これにより、ダイアログにすべてのファイルを表示するようになります。最後の引数には、デフォルトのファイル名として指定されたfile_nameに拡張子”.png”を追加した文字列を渡しています。FileSelectDialog関数が成功すると、選ばれたファイル名がfile_names配列に格納され、選択数が返されます。

ファイルが選択されなかった場合、またはエラーが発生した場合はfalseを返します。選択にエラーが発生した場合、GetLastError関数で取得したエラーコードをPrintFormat関数でエラーメッセージとして出力します。

スクリーンショットの保存処理では、まずChartSetInteger関数でチャート表示を一時的に非表示にします。引数には、チャート識別子として0、プロパティとしてCHART_SHOW、表示を無効にするためのfalseが指定されています。次に、ChartScreenShot関数を呼び出し、file_names配列の最初の要素に指定されたファイル名で、GRAPH_WIDTHとGRAPH_HEIGHTのサイズでスクリーンショットを保存します。最後にChartSetInteger関数でチャートを再表示します。

関数戻り値として、スクリーンショットが正常に保存されたかどうかの成否が返されます。

MathArcsin関数を使ってEAを作る際のアイディア

MathArcsin関数は、逆正弦計算により角度情報を扱うことができるため、トレードやチャート分析のEAに応用できます。以下はMathArcsin関数を活用したEAのアイディアです。

1つ目のアイディアとして、価格の変動率に基づいた角度を計算し、トレンドの傾向を分析する方法が考えられます。価格の上昇や下降の角度を逆正弦で取得し、一定の角度以上で強いトレンドとみなしてエントリーやエグジットの判断に活用できます。例えば、急な上昇角度が見られる場合に買いエントリー、急な下降角度で売りエントリーを行うような設定が可能です。

2つ目のアイディアとして、移動平均線インジケータの勾配を算出し、価格の変化のスピードを数値化することが挙げられます。MathArcsin関数で得られる角度情報を用いて、トレンドがどのくらい強いかを角度の大小で判定することが可能です。これにより、角度が急激に変わる場面でリスク管理としてポジションを調整したり、エグジットシグナルとして設定することができます。

さらに、MathArcsin関数はサイン波や周期的な動きを持つインジケータと組み合わせることで、マーケットの周期を可視化するEAの開発にも役立ちます。角度変化を周期的なタイミングの指標として使用し、一定周期での逆方向エントリーやリバースエントリーのシグナルを出すことが可能です。

これらのアイディアにより、価格変動の角度やスピードを基にしたトレンド判定、リスク管理、または周期的なエントリー・エグジットの戦略をEAに組み込むことができます。

タイトルとURLをコピーしました