- MathArctan関数の働き・役割
- MathArctan関数の引数について
- MathArctan関数の戻り値について
- MathArctan関数を使ったサンプルコード
- サンプルコード解説1:グローバル領域部分
- サンプルコード解説2:OnStart関数部分その1
- サンプルコード解説3:OnStart関数部分その2
- サンプルコード解説4:OnStart関数部分その3
- サンプルコード解説5:StopKeyPressed関数(オリジナル関数)部分
- サンプルコード解説6:CurvePlot関数(オリジナル関数)部分
- サンプルコード解説7:MakeAndSaveScreenshot関数(オリジナル関数)部分
- MathArctan関数を使ってEAを作る際のアイディア
MathArctan関数の働き・役割
MathArctan関数は、指定された値の逆正接(アークタンジェント)を計算し、その結果を返します。※逆正接とは、ある角度に対して、その接線の値が与えられたときにその角度を求める操作です。MathArctan関数は、この逆演算(値から角度を求める計算)を行うため、三角関数に関連する計算やグラフ作成、フィルタリング処理などで活用できます。
また、MathArctan関数は-π/2からπ/2の範囲内でラジアン(円周率πを基にした角度の単位)の値を返します。MQL5の標準ライブラリには、MathArctan関数の代替としてatan関数も用意されており、同様の動作を行います。
逆正接とは
逆正接は、ある比率(接線の値)から角度を求める操作です。
三角形の底辺と高さの比率が分かっているときに、その三角形の角度を求めることができます。この比率をもとに角度を求めるときに役立つのが、逆正接の概念です。
まず三角形の一部を切り取ってできる「直角三角形」を考えます。直角三角形には、底辺・高さ・斜辺の3つの辺があります。底辺をa、高さをbとすると、逆正接は「高さ b を底辺 a で割った値」から角度を求めます。この割り算の結果が、接線の値と呼ばれます。逆正接はこの値から「角度」を計算ます。
MathArctan関数を使うことで、この接線の値がわかっている場合に、そこから角度(-π/2からπ/2の範囲内で)をラジアン単位で返すことができます。ラジアンは、円周率πを基にした角度の単位で、180度がπラジアンに相当します。
MathArctan関数の引数について
double MathArctan(
double value // 逆正接を求める数値
);
MathArctan関数には、1つの引数が必要です。
- value
値の種類: double型(小数を含む数値)
説明: 逆正接を計算したい値を指定します。この値は、三角形の高さと底辺の比率に対応し、角度を求めるための接線の値を示しています。たとえば、三角形の高さが1、底辺が1の場合、valueとして1を指定すると、その比率から角度が計算されます。
MathArctan関数の戻り値について
MathArctan関数は、指定した値の逆正接を-π/2からπ/2の範囲内でラジアン(角度を表す単位)で返します。戻り値の型はdouble型で、角度を小数を含む値として取得できます。
例えば、MathArctan関数に1を指定した場合、45度に相当する0.785ラジアンが戻り値として返されます。ラジアンは円周率πを基にした角度の単位であり、1ラジアンは約57.3度に相当します。したがって、MathArctan関数を使用すると、三角形の高さと底辺の比率からラジアン単位で角度を取得することが可能です。
MathArctan関数を使ったサンプルコード
#define GRAPH_WIDTH 750 // グラフの幅を定義
#define GRAPH_HEIGHT 350 // グラフの高さを定義
#include <Graphics\Graphic.mqh> // グラフィックスライブラリのヘッダーファイルをインクルード
CGraphic ExtGraph; // グラフィックオブジェクトを作成
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数 |
//+------------------------------------------------------------------+
void OnStart()
{
// ベクトルdeltaを101個の要素に初期化し、各要素を2π/100ずつの増分で設定
vector delta=vector::Full(101,2*M_PI/100);
delta[0]=0; // deltaの最初の要素を0に設定
//--- deltaベクトルの要素を累積して、-1から2πまでの値を取得する
vector X=delta.CumSum(); // 各要素の累積和でXベクトルを作成
//--- Xベクトルの各値の逆正接(アークタンジェント)を計算し、Yベクトルに格納
vector Y=MathArctan(X);
//--- 計算結果のベクトルを配列に転送
double x_array[], y_array[]; // X, Yの値を配列に格納するための配列を定義
X.Swap(x_array); // Xベクトルをx_array配列に変換
Y.Swap(y_array); // Yベクトルをy_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));
ExtGraph.TextAdd(54, 21, text2, ColorToARGB(clrBlack));
// 更新してテキストとグラフを表示
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); // スクリーンショットが正常に保存されたかを返す
}
このコードは、指定された範囲内での値の逆正接を計算し、それをグラフとして描画します。スクリプトが開始すると、まず0から2πまでの101個の値を計算し、それぞれの逆正接を求めます。この計算結果を用いてグラフを描画し、チャート上に表示します。描画したグラフは、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π/100ずつの増分で設定
vector delta=vector::Full(101,2*M_PI/100);
delta[0]=0; // deltaの最初の要素を0に設定
//--- deltaベクトルの要素を累積して、-1から2πまでの値を取得する
vector X=delta.CumSum(); // 各要素の累積和でXベクトルを作成
//--- Xベクトルの各値の逆正接(アークタンジェント)を計算し、Yベクトルに格納
vector Y=MathArctan(X);
この部分のコードでは、スクリプトが実行される際の処理として、逆正接関数を利用した計算データを生成する手順を記述しています。
最初に、deltaというベクトル(複数の値を一つのデータとしてまとめて扱うデータ構造)を作成しています。vectorクラスのFullメソッドを用いて、deltaに101個の要素を持たせ、各要素に2π/1000の値を格納しています。
※「vector::」という表記は、vectorクラスのメソッドや定数を参照するための構文です。この構文により、vector型の様々なメソッド(例えばFullやCumSumなど)を呼び出すことが可能です。
このdeltaベクトルの初期化によって、-1から2πにわたる範囲で値を生成する準備をしています。
次に、deltaベクトルの最初の要素を0に設定して範囲を調整しています。
次に、deltaの累積和を計算してXというベクトルに格納しています。CumSumメソッドを用いることで、deltaの各要素が累積的に加算された結果がXに保存されます。これにより、-1から2πまでの101個の値をXベクトルに持たせることができます。
最後に、MathArctan関数を用いてXベクトルの各値に対する逆正接を計算し、結果をYベクトルに格納しています。このYベクトルには、Xの各要素に対応した逆正接の値が格納されることになり、これらのデータが次のグラフ描画部分で使用されます。
サンプルコード解説3:OnStart関数部分その2
//--- 計算結果のベクトルを配列に転送
double x_array[], y_array[]; // X, Yの値を配列に格納するための配列を定義
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_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
//--- 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メソッドを呼び出し、グラフを破棄して使用していたメモリを解放します。これにより、スクリプトの終了時にリソースが適切に解放されます
サンプルコード解説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_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軸のデータに基づく曲線が描画され、操作の説明が表示されたグラフが完成します。
サンプルコード解説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; // 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関数でチャートを再表示します。
関数の戻り値として、スクリーンショットが正常に保存されたかどうかの成否が返されます。
MathArctan関数を使ってEAを作る際のアイディア
MathArctan関数は、様々な角度計算やグラフ描画に活用できます。この関数を応用して、以下のようなEA(エキスパートアドバイザー)の作成が考えられます。
価格変動に基づくトレンドの方向検出
MathArctan関数を利用して、一定期間の価格変動に対する角度を計算し、トレンドの方向を可視化できます。例えば、価格の移動平均線の傾きを逆正接で求め、その角度が一定以上であれば上昇トレンド、一定以下であれば下降トレンドと判定し、トレードの判断に利用することが可能です。
ボラティリティの角度分析によるエントリータイミング
価格の急激な変動時に、ボラティリティの角度を逆正接で計算し、変動の角度が急激に上昇または下降したタイミングをエントリーポイントとするEAを作成できます。これにより、ボラティリティが高まる局面での効率的なエントリーが可能になります。
価格とインジケータの乖離分析
価格と特定のインジケータ(移動平均線など)の差を角度として計算し、その角度が一定以上の値を超えたときに、価格がインジケータに戻ろうとする反発を狙うEAが考えられます。MathArctan関数で算出した角度に基づいて、価格の乖離が大きくなったときにエントリーする戦略が構築できます。
フィルタリングとしての角度分析
ボラティリティが低いときに取引を避けるために、価格の変動角度が小さい場合にはトレードを行わないフィルタとしてMathArctan関数を利用することができます。角度が小さいときはトレンドがはっきりしていないと判断し、エントリーを避けるロジックに組み込むと、リスクを抑えた取引が可能です。
MathArctan関数は、他のインジケータと組み合わせることで、さまざまなトレードシグナルの精度を向上させるために役立ちます。特に、価格の動きの方向性を角度として捉え、直感的にトレンドやボラティリティの変化を判断するEAに適しています。