【MQL5】MathArctan2関数について

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

MathArctan2関数の働き・役割

MathArctan2関数は、指定された2つの値の商(割り算の結果)を使って角度(ラジアン単位)を計算し、その結果を返すための関数です。この関数は、平面上の点のY座標とX座標から、その点が原点(座標の中心点)から見てどの角度に位置するかを求める際に使用します。角度は-π(円周率、約3.14159)からπの範囲で計算されるため、すべての方向に対応しています。

MathArctan関数との違い

MathArctan2関数MathArctan関数の大きな違いは、計算に使用する座標の数です。MathArctan関数は1つの値から角度を求めますが、MathArctan2関数では2つの座標、つまりX座標とY座標の情報を使って角度を計算します。これにより、MathArctan2関数は座標がどの象限(一つの平面を4つに分けた領域)にあるか(第1象限から第4象限まで)も考慮して、正しい角度を返します。

具体的には、MathArctan関数はX方向の情報のみで角度を計算するのに対し、MathArctan2関数はX座標とY座標の位置関係から、-πからπまでの正確な角度が得られます。これにより、MathArctan2関数は平面上の位置関係を正確に把握したい場合に適しています。

MathArctan2関数の引数について

double MathArctan2(
double y     // 点のy座標
double x     // 点のx座標
 );

MathArctan2関数には、Y座標とX座標の2つの引数が必要です。

  • y
    Y座標を示す数値です。プラスの場合はY軸の上方向、マイナスの場合は下方向を表します。
  • x
    X座標を示す数値です。プラスの場合はX軸の右方向、マイナスの場合は左方向を表します。

これらの引数に基づいて、MathArctan2関数は、指定した点が原点から見たときの角度を返します。

MathArctan2関数の戻り値について

MathArctan2関数は、指定されたY座標とX座標に対して、-π(円周率、約3.14159)からπの範囲内で角度をラジアン単位で返します。この戻り値は、点が原点から見てどの方向にあるかを示す角度です。たとえば、点がX軸の正の方向にある場合、戻り値は0となります。

また、点がどの象限(一つの平面を4つに分けた領域)にあるかによって、次のように角度が変わります。

  • 第1象限(X正、Y正)では、角度は0からπ/2の間の値を返します。
  • 第2象限(X負、Y正)では、π/2からπの間の値を返します。
  • 第3象限(X負、Y負)では、-πから-π/2の間の値を返します。
  • 第4象限(X正、Y負)では、-π/2から0の間の値を返します。

座標が軸上にある場合には、以下のような特定の角度が返されます。

  • Yが0でXが正の場合は0
  • Yが0でXが負の場合はπ
  • Yが正でXが0の場合はπ/2
  • Yが負でXが0の場合は-π/2
  • Yが0でXも0の場合は0

これにより、MathArctan2関数はあらゆる座標位置に対して正確な角度を返します。

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

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

#include <Graphics\Graphic.mqh>    // グラフィックスライブラリのヘッダーファイルをインクルード

CGraphic ExtGraph;    // グラフィックインスタンスを作成

//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                      |
//+------------------------------------------------------------------+
void OnStart()
 {
  // ベクトルdeltaを10個の要素に初期化し、各要素を10ずつ増加させて設定
  vector delta = vector::Full(10, 10);
  delta[0] = 0;    // deltaの最初の要素を0に設定

  //--- deltaベクトルの各要素を累積して、-1から2πまでの範囲の値を取得
  vector X = delta.CumSum();    // 各要素の累積和でXベクトルを作成
  vector Y = delta.CumSum();    // 同様にYベクトルを作成

  //--- ベクトルの内容をエキスパートログに出力して確認
  Print("vector delta = \n", delta);
  Print("vector X = \n", X);
  Print("vector Y = \n", Y);

  //--- 計算結果のベクトルを配列に転送
  double x_array[];    // Xの値を格納する配列
  double y_array[];    // Yの値を格納する配列
  X.Swap(x_array);     // Xベクトルをx_array配列に変換
  Y.Swap(y_array);     // Yベクトルをy_array配列に変換

  //--- 配列からMathArctan2関数を用いて角度を計算
  double array[10];    // 計算した角度を格納する配列
  for(int i = 0; i < 10; i++)
    {
    array[i] = MathArctan2(y_array[i], x_array[i]);    // 各点の角度を計算してarrayに格納
    }

  //--- 計算された配列の値を用いてグラフを描画
  CurvePlot(x_array, y_array, clrDodgerBlue);   // x_arrayとy_arrayを使って曲線を描画

  //--- EscapeキーまたはPgDnキーが押されるまで待機して、押された場合にグラフを削除して終了
  while(!IsStopped())
    {
    if(StopKeyPressed())    // 停止キーが押されたらループを抜ける
        break;
    Sleep(16);    // ループを少し待機して、CPU負荷を軽減
    }

  //--- グラフィックインスタンスのクリーンアップ(メモリの解放など)
  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_arrayとy_arrayの配列データを使って曲線を追加し、指定された色で描画
  ExtGraph.CurveAdd(x_array, y_array, ColorToARGB(colour), CURVE_LINES);
  
  // グラフの上側に少し余白を作る
  ExtGraph.IndentUp(30);
  
  // 追加された全曲線をプロット
  ExtGraph.CurvePlotAll();
  
  // グラフに表示するテキストを追加
  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));   // ESCキー用のテキスト
  ExtGraph.TextAdd(54, 21, text2, ColorToARGB(clrBlack));  // PgDnキー用のテキスト

  // 更新してテキストとグラフを表示
  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;    // 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);    // スクリーンショットが正常に保存されたかを返す
 }

サンプルコード解説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を10個の要素に初期化し、各要素を10ずつ増加させて設定
  vector delta = vector::Full(10, 10);
  delta[0] = 0;    // deltaの最初の要素を0に設定

  //--- deltaベクトルの各要素を累積して、-1から2πまでの範囲の値を取得
  vector X = delta.CumSum();    // 各要素の累積和でXベクトルを作成
  vector Y = delta.CumSum();    // 同様にYベクトルを作成

この部分のコードでは、MathArctan2関数を利用するために必要なXとYのデータを準備しています。ベクトルdeltaを用いて累積和を計算し、その結果をXとYに格納することで、各座標に対応する値を作成しています。

まず、Fullメソッドを使ってdeltaベクトル要素数10のベクトルとして初期化します。このメソッドにより、指定された値(ここでは10)が各要素に設定され、deltaの各要素は10ずつ増加する構成になります。次に、deltaの最初の要素に0を代入して、最初の値を0から開始するようにしています。

続いて、CumSumメソッドを使用してdeltaの累積和を計算し、その結果をXベクトルとYベクトルに格納します。CumSumメソッドは、各要素の累積和を計算し、新しいベクトルを作成する役割を持ちます。これにより、XとYには連続的に増加する値の系列が生成され、これらの値が後にMathArctan2関数で角度を計算するためのX座標とY座標として使用されます。

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

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

  //--- ベクトルの内容をエキスパートログに出力して確認
  Print("vector delta = \n", delta);
  Print("vector X = \n", X);
  Print("vector Y = \n", Y);

この部分のコードでは、delta、X、Yの各ベクトル(数値を格納したデータの集合)の内容をエキスパートログに出力し、計算結果を確認しています。Print関数を用いることで、実行中にそれぞれのベクトルの内容がエキスパートログに表示され、データが意図した通りに生成されているかをチェックすることが可能です。

ここで、deltaは初期の設定値のベクトル、XとYはそれぞれの累積和(各値を順次足して得られる和)で作成されたベクトルであり、計算や処理が正確に行われたかを確認する目的でログに出力しています。これにより、スクリプトのデバッグや動作検証が容易になります。

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

//--- 計算結果のベクトルを配列に転送
  double x_array[];    // Xの値を格納する配列
  double y_array[];    // Yの値を格納する配列
  X.Swap(x_array);     // Xベクトルをx_array配列に変換
  Y.Swap(y_array);     // Yベクトルをy_array配列に変換

この部分のコードでは、計算結果が格納されたベクトルXとYのデータを、それぞれ配列に転送しています。ベクトル配列の形式を変換することで、後続の処理や他の関数で扱いやすくしています。

まず、XベクトルとYベクトルの内容を保持するために、x_arrayとy_arrayという配列を用意します。次に、Swapメソッドを使ってXベクトルのデータをx_array配列に、Yベクトルのデータをy_array配列にそれぞれ変換しています。Swapメソッドは、指定したベクトルの内容を直接配列にコピーするためのメソッドであり、この操作により、配列としてXとYのデータが利用可能になります。これにより、後続の処理で配列としてデータを扱う際に便利です。

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

 //--- 配列からMathArctan2関数を用いて角度を計算
  double array[10];    // 計算した角度を格納する配列
  for(int i = 0; i < 10; i++)
    {
    array[i] = MathArctan2(y_array[i], x_array[i]);    // 各点の角度を計算してarrayに格納
    }

  //--- 計算された配列の値を用いてグラフを描画
  CurvePlot(x_array, y_array, clrDodgerBlue);   // x_arrayとy_arrayを使って曲線を描画

この部分のコードでは、変換したx_arrayとy_arrayの値を用いてMathArctan2関数で角度を計算し、その結果をarray配列に格納しています。また、この計算結果を基にグラフを描画します。

まず、arrayという配列を宣言し、計算された角度を格納するための準備を行います。続いて、forループ内でMathArctan2関数を使用して、x_arrayとy_arrayの各要素に対応する角度を順に計算し、その結果をarray配列に保存しています。MathArctan2関数は、2つの座標から角度を計算する関数で、ここではX座標とY座標の関係から求めた角度が格納されます。

次に、CurvePlot関数を呼び出して、x_arrayとy_arrayのデータを基に曲線を描画します。clrDodgerBlueは描画色を示し、この色でグラフ上に曲線が表示されます。この処理により、計算された角度データに基づくグラフが描画され、可視化が可能となります。

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

  //--- 計算された配列の値を用いてグラフを描画
  CurvePlot(x_array, y_array, clrDodgerBlue);   // x_arrayとy_arrayを使って曲線を描画

  //--- EscapeキーまたはPgDnキーが押されるまで待機して、押された場合にグラフを削除して終了
  while(!IsStopped())
    {
    if(StopKeyPressed())    // 停止キーが押されたらループを抜ける
        break;
    Sleep(16);    // ループを少し待機して、CPU負荷を軽減
    }

  //--- グラフィックインスタンスのクリーンアップ(メモリの解放など)
  ExtGraph.Destroy();
 }

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

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

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

サンプルコード解説7: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が押されるまでグラフを表示し、必要に応じてスクリーンショットを保存してからスクリプトを終了する動作が可能になります。

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

//+------------------------------------------------------------------+
//| グラフインスタンスを作成して曲線を描く                           |
//+------------------------------------------------------------------+
void CurvePlot(double &x_array[], double &y_array[], const color colour)
 {
  // グラフインスタンスを作成(チャート上の位置、サイズを指定)
  ExtGraph.Create(ChartID(), "Graphic", 0, 0, 0, GRAPH_WIDTH, GRAPH_HEIGHT);
  
  // x_arrayとy_arrayの配列データを使って曲線を追加し、指定された色で描画
  ExtGraph.CurveAdd(x_array, y_array, ColorToARGB(colour), CURVE_LINES);
  
  // グラフの上側に少し余白を作る
  ExtGraph.IndentUp(30);
  
  // 追加された全曲線をプロット
  ExtGraph.CurvePlotAll();
  
  // グラフに表示するテキストを追加
  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));

  // 更新してテキストとグラフを表示
  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軸のデータに基づく曲線が描画され、操作の説明が表示されたグラフが完成します。

サンプルコード解説9: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;    // 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関数でチャートを再表示します。

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

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

トレンド角度に基づくエントリーとエグジット

MathArctan2関数で価格の変動角度を計算し、その角度が一定の範囲を超えたときにエントリーやエグジットのシグナルとして使用する方法です。角度が大きければ急なトレンド、小さければ緩やかなトレンドと判断できます。これにより、急激なトレンドが発生した際にトレードを行い、トレンドの持続を期待した取引を行うことが可能です。

サポート・レジスタンスの角度分析

MathArctan2関数を利用して、価格がサポートやレジスタンスに接近する際の角度を分析するEAを作成することも考えられます。サポートやレジスタンスラインに対して急な角度で接近している場合、反転の可能性があるため、反転を狙った取引を行うか、あるいはブレイクアウトの方向へポジションを取る判断ができます。

移動平均の傾きによるトレンドの方向分析

移動平均線の傾きをMathArctan2関数で計算し、その傾きが一定の角度を超えるとトレンドの発生と判断してエントリーするEAを作成する方法です。角度を閾値(基準となる値)にすることで、上昇トレンド・下降トレンドの強さを視覚的に判断し、角度に応じたロット数の調整やエントリータイミングを最適化できます。

ボラティリティの視覚化とエントリーポイントの特定

ボラティリティ(価格変動の激しさ)をMathArctan2関数で角度として捉え、ボラティリティが急激に高まるタイミングでエントリーする戦略です。たとえば、急な角度の変化が見られた場合、ボラティリティが高まっていると判断し、スキャルピングや短期トレードに活用することができます。

MathArctan2関数は、価格やインジケータの動きを角度として視覚化することで、トレンドの強さや方向性を捉えるためのシグナルとして有用です。他の指標と組み合わせることで、より高度な分析を行い、取引の精度を向上させることが期待できます。

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