- MathArcsinh関数の働き・役割
- 双曲線逆正弦とは
- MathArcsinh関数の引数について
- MathArcsinh関数の戻り値について
- MathArcsinh関数を使ったサンプルコード
- サンプルコード解説1: グローバル領域での定義
- サンプルコード解説2:OnStart関数の中その1
- サンプルコード解説3:OnStart関数の中その2
- サンプルコード解説4:OnStart関数部分その3
- サンプルコード解説5: StopKeyPressed関数(オリジナル関数)部分
- サンプルコード解説6:CurvePlot関数(オリジナル関数)部分
- サンプルコード解説7:MakeAndSaveScreenshot関数(オリジナル関数)部分
- MathArcsinh関数を使ってEAを作る際のアイディア
MathArcsinh関数の働き・役割
MathArcsinh関数は、指定された数値の双曲線逆正弦(双曲線(ある数値の指数関数的増加・減少を示す曲線)に基づく逆関数)を計算し、その結果を返します。この関数は、数値の双曲線における角度を取得するために使用され、数学的には次のような式で表されます。
asinh(x) = log(x + sqrt(x*x + 1))
MathArcsinh関数は、数学的な計算や統計処理において、データの変換や非線形(比例関係を持たない)補間、フィルタリングなどに使用されることが多いです。また、MQL5では、MathArcsinh関数の代わりにasinh関数を利用することも可能です。どちらの関数も同様の結果を返しますが、用途に応じて使い分けることができます。
双曲線逆正弦とは
双曲線逆正弦(そうきょくせんぎゃくせいげん)は、数学において数値を特定の関数に変換する方法の一つです。まず、「双曲線」とは、ある数値が指数関数的に増減する曲線の形のことです。この双曲線を利用して、入力した数値に応じた「角度」を求めるのが双曲線逆正弦です。
例えば、普通の三角形で「正弦」が角度から長さを計算するのと似た考え方ですが、双曲線逆正弦は三角形の代わりに双曲線を基にして計算します。
双曲線逆正弦の計算式と計算例
双曲線逆正弦は「asinh(アーシン)」と表記され、計算式としては次のように書きます:
asinh(x) = log(x + sqrt(x*x + 1))
ここで使用される「log」は、自然対数(底が e の対数)です。e はネイピア数/オイラー数という定数であり、おおよそ 2.718 の値を持ちます。
この式に、具体的な数値を当てはめて計算の流れを見てみると、
たとえば、x = 1 の場合の計算は次のようになります。
- まず、xx + 1 の部分を計算します。ここでは x が 1 なので、11 + 1 = 2 になります。
- 次に、その平方根(sqrt)を計算します。sqrt(2) の値はおおよそ 1.414 です。
- 続いて、x に平方根を足します。つまり、1 + 1.414 = 2.414 となります。
- 最後に、その値の自然対数 log(2.414) を計算します。log(2.414) の値はおおよそ 0.881 です。
したがって、x = 1 の場合、asinh(1) の値はおおよそ 0.881 となります。
別の例として x = 2 の場合
- xx + 1 の計算を行うと、22 + 1 = 5 です。
- 次に、その平方根を求めると、sqrt(5) はおおよそ 2.236 です。
- x に平方根を足して 2 + 2.236 = 4.236 となります。
- 最後に log(4.236) を計算すると、おおよそ 1.446 となります。
したがって、x = 2 の場合、asinh(2) の値はおおよそ 1.446 です。
双曲線逆正弦の用途
双曲線逆正弦は、データが急激に変化するような状況で、その変化をなだらかに表示したり、正確な変化を測定したりする際に使われます。また、音量の変化やデータのスムージング(平滑化)にも応用されることがあります。
MathArcsinh関数の引数について
MathArcsinh関数は、1つの引数として数値を受け取ります。この数値には、任意の実数を指定でき、負の値や0も含めて計算可能です。引数には例えば 1 や -2.5 のような小数も指定できます。
引数 value の詳細と性質
引数value
は、双曲線逆正弦を計算したい元の数値を表します。MathArcsinh関数にこの value
を与えることで、双曲線逆正弦の計算が行われます。
双曲線逆正弦は、与えられた数値から「双曲線」に基づく「角度」を算出する処理です。たとえば、通常の三角形で「正弦」関数が角度を長さに変換するのと似たように、双曲線逆正弦は、数値の変化に対してなだらかな変化を伴った「角度」を計算します。
具体例:MathArcsinh関数の計算例
MathArcsinh関数を使用する際、数値を引数として入力すると、その数値に基づいて「双曲線の角度」を返します。
例1: value に 1 を指定した場合
MathArcsinh(1) を計算すると、次のようになります。
value
が 1 の場合、MathArcsinh関数では、まず 1*1 + 1 の部分を計算し、その結果が 2 となります。- 次に、その平方根(sqrt)を計算すると、sqrt(2) はおおよそ 1.414 です。
- 続いて、この平方根に
value
を足します。1 + 1.414 = 2.414 です。 - 最後にこの 2.414 の自然対数 log(2.414) を計算すると、結果はおおよそ 0.881 になります。
したがって、MathArcsinh(1) の戻り値は約 0.881 です。これは、1 という数に対応する双曲線の「角度」を意味しています。
例2: value に 0 を指定した場合
MathArcsinh(0) では、次のように計算されます。
value
が 0 のため、まず 0*0 + 1 を計算すると 1 になります。- その平方根 sqrt(1) は 1 です。
value
(0)に 1 を足すと、0 + 1 = 1 です。- 最後に log(1) を計算すると、結果は 0 となります。
したがって、MathArcsinh(0) の戻り値は 0 です。これは、双曲線逆正弦において、値が 0 の場合に対応する角度が 0 であることを示しています。
例3: value に -2 を指定した場合
MathArcsinh(-2) では、次のように計算されます。
value
が -2 のため、まず -2*-2 + 1 を計算すると 5 になります。- その平方根 sqrt(5) は約 2.236 です。
value
(-2)に平方根を足すと、-2 + 2.236 = 0.236 です。- 最後に log(0.236) を計算すると、おおよそ -1.44 となります。
したがって、MathArcsinh(-2) の戻り値は約 -1.44 です。この場合、-2 の数に対して、双曲線逆正弦がどの角度に対応するかを表しています。
MathArcsinh関数の戻り値について
MathArcsinh関数は、引数として与えた数値の「双曲線逆正弦」を計算し、その結果を実数として返します。この戻り値は、指定した数値に対して「双曲線に基づいた角度」を示すもので、一般的にはデータの変化や成長をなだらかに観察したいときに役立ちます。
なお、MathArcsinh関数の戻り値は「ラジアン」単位で表されます。したがって、度数での角度を求めたい場合は、ラジアンを度数に変換する必要があります。ラジアンを度に変換するには、結果に180/π(おおよそ 57.2958度)を掛けます。
戻り値の具体例
- MathArcsinh(1) の場合、戻り値は約 0.881 ラジアンです。これは、数値 1 に対する双曲線上の「角度」を表します。
- MathArcsinh(0) の場合、戻り値は 0 ラジアンです。これは、数値 0 に対応する角度が 0 であることを示しています。
- MathArcsinh(-2) の場合、戻り値は約 -1.44 ラジアンです。これは、数値 -2 が双曲線上でどの角度に対応するかを表します。
MathArcsinh関数の戻り値は、入力した数値がどの程度の変化や傾きを持つかを、双曲線を使って確認するための指標として役立ちます。
MathArcsinh関数を使ったサンプルコード
#define GRAPH_WIDTH 750 // グラフの幅を750ピクセルに設定
#define GRAPH_HEIGHT 350 // グラフの高さを350ピクセルに設定
#include <Graphics\Graphic.mqh> // グラフィック描画のためのライブラリをインクルード
CGraphic ExtGraph; // グラフ描画オブジェクトのインスタンスを作成
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数 |
//+------------------------------------------------------------------+
void OnStart()
{
// vectorオブジェクトdeltaを作成し、101個の値を-31から2π間隔で配置する
vector delta = vector::Full(101, 2 * M_PI / 10);
delta[0] = -31; // deltaの初期値を-31に設定
// delta内の各ステップ値を累積してXベクトルを生成
vector X = delta.CumSum();
// Xベクトルの各値に対して双曲線逆正弦値を計算してYベクトルに格納
vector Y = MathArcsinh(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);
// EscapeキーまたはPgDnキーが押されるまでループして待機
while (!IsStopped())
{
// StopKeyPressed関数でキーの状態をチェックし、終了条件を満たしたらループを抜ける
if (StopKeyPressed())
break;
Sleep(16); // 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);
// ESCキーもPgDnキーも押されていない場合、「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();
// 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));
// グラフを更新して表示
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); // スクリーンショットの成功/失敗を返す
}
このコードは、-31から2πの範囲で生成された101個の数値の双曲線逆正弦を計算し、その結果をグラフとして描画します。描画されたグラフには、ESCキーでグラフを削除しスクリプトを終了する、またはPgDnキーでスクリーンショットを保存してから終了するよう指示が表示されます。スクリプトはこれらのキーが押されるまでループを継続し、停止が指示されるとグラフを削除して終了します。
サンプルコード解説1: グローバル領域での定義
#define GRAPH_WIDTH 750 // グラフの幅を設定
#define GRAPH_HEIGHT 350 // グラフの高さを設定
#include <Graphics\Graphic.mqh> // グラフィック描画用のライブラリをインクルード
CGraphic ExtGraph; // CGraphicクラスのインスタンスを作成
定義の詳細
グラフの幅と高さの定義
グラフの幅を750ピクセル(デジタル画像を構成する最小の単位)に、グラフの高さを350ピクセルに設定しています。defineディレクティブを使用して定数を定義することで、コード内でこれらの値を使用する際に参照できるようになります。
グラフィックライブラリのインクルード
includeディレクティブを使用して、グラフィック関連の機能を提供するライブラリファイル「Graphic.mqh」をインクルードしています。このライブラリには、グラフの描画や曲線の追加など、グラフィック操作に必要な関数やクラスが定義されています。
グラフィックオブジェクトの作成
CGraphicクラスのインスタンスであるExtGraphオブジェクトを作成しています。このインスタンスは、グラフの描画や操作に使用されます。
クラスはオブジェクト指向プログラミングの基本要素であり、特定の機能を持つオブジェクト(変数や配列など)を作成するためのテンプレートです。
サンプルコード解説2:OnStart関数の中その1
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数 |
//+------------------------------------------------------------------+
void OnStart()
{
// vectorオブジェクトdeltaを作成し、101個の値を-31から2π間隔で配置する
vector delta = vector::Full(101, 2 * M_PI / 10);
delta[0] = -31; // deltaの初期値を-31に設定
// delta内の各ステップ値を累積してXベクトルを生成
vector X = delta.CumSum();
// Xベクトルの各値に対して双曲線逆正弦値を計算してYベクトルに格納
vector Y = MathArcsinh(X);
このコードは、スクリプトの実行開始時に自動的に呼び出される OnStart関数内の一部です。ここでは、双曲線逆正弦の値を計算するための前準備として、数値のベクトルを作成し、そのベクトルに対して処理を行っています。
まず、vectorオブジェクトであるdeltaを作成し、Fullメソッドを使用して101個の値を2π(約6.28)を10で割った間隔で配置します。この間隔の値は0.628に相当し、連続する値間の差を定義しています。また、初期値として -31 を設定し、計算が負から始まるようにしています。
次に、CumSumメソッドを使用してdelta内の各値を累積し、Xベクトルを生成します。このXベクトルは、-31から始まり、間隔0.628で増加する一連の数値を持っています。
その後、MathArcsinh関数を使用して、Xベクトルの各値の双曲線逆正弦を計算し、その結果を新しいYベクトルに格納します。
サンプルコード解説3:OnStart関数の中その2
// ベクトルの計算結果を配列に転送
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ベクトルとYベクトルの計算結果を、それぞれx_arrayとy_arrayという配列に転送しています。この転送にはSwapメソッドが使用され、これによってXベクトルの内容がx_array配列に、Yベクトルの内容がy_array配列にコピーされます。
その後、CurvePlot関数を使用して、x_arrayとy_arrayの値をもとにグラフを描画しています。CurvePlot関数の引数には描画するデータの配列であるx_arrayとy_array、および色指定のためのclrDodgerBlueが渡され、指定された色でグラフが描かれます。
サンプルコード解説4:OnStart関数部分その3
//--- EscapeキーまたはPgDnキーを押してグラフを削除し、終了するまで待機
while (!IsStopped())
{
if (StopKeyPressed()) // 停止ボタンが押されているかを確認
break;
Sleep(16); // 16ミリ秒待機してから次のループへ
}
//--- グラフィックのクリーンアップ
ExtGraph.Destroy(); // ExtGraphオブジェクトを削除してメモリを解放
}
この部分のコードは、グラフを表示させたまま、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)
{
// グラフオブジェクトを作成(チャートID、名前、座標などを設定)
ExtGraph.Create(ChartID(), "Graphic", 0, 0, 0, GRAPH_WIDTH, GRAPH_HEIGHT);
// カーブ(曲線)を追加し、色とラインの種類を指定
ExtGraph.CurveAdd(x_array, y_array, ColorToARGB(colour), CURVE_LINES);
// テキストのインデント位置を少し上に設定
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));
// グラフの更新
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); // スクリーンショットが正常に保存できた場合はtrueを返す
}
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関数でチャートを再表示します。
関数の戻り値として、スクリーンショットが正常に保存されたかどうかの成否が返されます。
MathArcsinh関数を使ってEAを作る際のアイディア
MathArcsinh関数は、双曲線逆正弦を返す数学関数です。これをエキスパートアドバイザー(EA)で活用することで、価格データの変動をスムーズにしたり、非線形の傾向を検出するために役立てることができます。
市場の急激な変動を検知するフィルタリング機能の実装
MathArcsinh関数を使うことで、価格の変動を双曲線を用いてなだらかに変換し、極端な値が緩和された状態で市場の動きを観察することができます。
これにより、特定の期間内で急激な上昇や下降が発生した場合でも、過度な影響を除いた分析が可能になります。例えば、急なスパイク(価格が一時的に急上昇または急落する現象)やノイズをフィルタリングし、通常のトレンド変化を抽出するEAを構築できます。
ローソク足の値を平滑化してトレンド判定に使用
MathArcsinh関数を価格データに適用することで、ローソク足データを平滑化(データの変動をなだらかにしてノイズを抑えること)し、ノイズが少ないトレンドを把握することができます。このような平滑化処理を行うことで、小さな変動に影響されにくいトレンドラインを描くことができ、トレンドが明確になり、エントリーやエグジットの判断がより的確に行えるEAを作成できます。
インジケータの非線形スムージング
移動平均やRSIなどのインジケータに対してMathArcsinh関数を用いて非線形のスムージング(データの変動を平滑化する処理)を加え、急激な変動に敏感になりすぎないインジケータを生成することができます。これにより、エントリーサインやシグナルが過度に頻発しないよう調整したEAを作成でき、取引の精度向上に役立てることができます。
ボラティリティに応じた動的なパラメータ設定
MathArcsinh関数を使用してボラティリティ(価格の変動の激しさ)の度合いを調整し、動的にEAのパラメータを変更する手法も考えられます。たとえば、市場のボラティリティが大きい場合には、エントリーやエグジットの基準値を高め、低ボラティリティの場合には基準値を低くするように設定することができます。これにより、市場の変動状況に応じた柔軟なトレード戦略が可能となり、リスク管理に役立ちます。
MathArcsinh関数を活用することで、EAにおいて非線形なデータ処理やフィルタリング、ボラティリティ調整といった高度なロジックを実装でき、より適応力の高いトレード戦略を構築することが可能です。