- MathExp関数の働き・役割
- ネイピア数とは
- MathExp関数の引数について
- MathExp関数の戻り値について
- MathExp関数を使ったサンプルコード
- サンプルコード解説1: グローバル領域での定義
- サンプルコード解説2: OnStart関数の中その1
- サンプルコード解説3:OnStart関数部分その2
- サンプルコード解説4:OnStart関数部分その3
- サンプルコード解説5: VectorArange関数(オリジナル関数)部分
- サンプルコード解説6: StopKeyPressed関数(オリジナル関数)部分
- サンプルコード解説7:CurvePlot関数(オリジナル関数)部分
- サンプルコード解説8:MakeAndSaveScreenshot関数(オリジナル関数)部分
- この関数を使ってEAを作る際のアイディア
MathExp関数の働き・役割
MathExp関数は、数学定数であるネイピア数「e」を指定した指数(累乗する際の基準となる数値)で累乗(ある数を基数として複数回掛け合わせる演算)した値を計算し、その結果を返します。この関数は、複利計算(元本と利息に対して利息が重ねて加算される計算方法)や指数関数(特定の値を一定の比率で変化させる数式)を扱う計算で頻繁に利用され、特にエキスパートアドバイザー(EA)のアルゴリズムで指数関数的な計算をする場合に役立ちます。
MathExp関数は、与えられた指数の値に対して「e」の累乗を行い、計算結果を戻り値として提供します。また、関数の別名としてexpも使用できます。
ネイピア数とは
ネイピア数とは、数学で特別な意味を持つ「e」という値で、約2.718にあたります。この数は、指数関数や自然対数という計算において重要な役割を果たしています。
「e」という文字が使われている理由は、この数を導入したスイスの数学者オイラー(Euler)の名前の頭文字に由来しています。eは自然対数の底として利用され、「自然な変化」を表す計算に使われるようになりました。
ネイピア数「e」は、例えば「お金を預けて複利で増やすと、時間が経つにつれてどう増えるか」を計算する時に使われます。たとえば、1年を1回の利子の計算でなく、2回、4回、100回など、より細かく区切って利子を付けると、元の金額が増えるスピードが速くなります。この回数を無限に増やしていくと、最終的に約2.718倍になります。この時に出てくる数がネイピア数「e」です。
さらに、ネイピア数は物理や生物の分野でもよく登場し、自然界の成長や減衰を表すモデルの計算でも使われます。このため「自然な変化」を表す数として、さまざまな分野で利用される特別な数です。
MathExp関数の引数について
double MathExp(
double value // eの塁乗指数
);
MathExp関数には、1つの引数があり、指定された数値の指数でネイピア数eを累乗します。
第一引数 value
累乗指数を表す数値を指定します。この値に基づいて、ネイピア数eが累乗され、その結果が返されます。例えば、valueに1を指定するとeの1乗が計算され、約2.718が得られます。また、valueに2を指定するとeの2乗が計算され、7.389056など、指数に応じた結果が得られます。
MathExp関数の戻り値について
MathExp関数は、指定された累乗指数に対するネイピア数eの累乗結果を返します。戻り値の型はdouble型で、通常は計算結果としての数値が返されます。
ただし、極端に大きな指数が指定された場合には、計算結果が非常に大きくなり、オーバーフローが発生します。この場合、戻り値はINF(無限大)となります。一方、指数が極端に小さい場合、アンダーフローにより戻り値は0になります。
MathExp関数を利用する際は、このオーバーフローおよびアンダーフローに注意し、必要に応じて値が適切であるかのチェックを行うことが推奨されます。
MathExp関数を使ったサンプルコード
#define GRAPH_WIDTH 750 // グラフの幅を指定(ピクセル単位)
#define GRAPH_HEIGHT 350 // グラフの高さを指定(ピクセル単位)
#include <Graphics\Graphic.mqh> // グラフィック描画ライブラリをインクルード
CGraphic ExtGraph; // グラフィックオブジェクトを定義
//+------------------------------------------------------------------+
//| スクリプトプログラムの開始関数 |
//+------------------------------------------------------------------+
void OnStart()
{
// --- step 1で0〜8の9個の値を取得する
vector X(9, VectorArange); // Xベクトルに0から8までの値を設定
Print("vector X = \n", X); // Xベクトルの値をエキスパートログに出力
// --- 各Xベクトル値の「e」(オイラー数)を計算する
X = MathExp(X); // MathExp関数で各Xの値に対してeの累乗を計算
Print("MathExp(X) = \n", X); // 計算結果をエキスパートログに出力
// --- 計算された値をベクトルから配列に転送する
double y_array[]; // 結果を格納する配列を宣言
X.Swap(y_array); // Xベクトルの値をy_array配列に転送
// --- 計算されたベクトル値のグラフを描画する
CurvePlot(y_array, clrDodgerBlue); // y_arrayの値を青色でグラフに描画
// --- EscapeキーまたはPgDnキーを押してグラフを削除し、終了するまで待機
while (!IsStopped())
{
if (StopKeyPressed()) // 終了キーが押された場合ループを抜ける
break;
Sleep(16); // 16ミリ秒待機(CPU負荷を軽減)
}
// --- クリーンアップ
ExtGraph.Destroy(); // グラフィックオブジェクトを破棄して終了
}
//+------------------------------------------------------------------+
//| ベクトルに「value」を「step」単位で入力する |
//+------------------------------------------------------------------+
template<typename T>
void VectorArange(vector<T>& vec, T value = 0.0, T step = 1.0)
{
// vecの各要素にvalueからstepごとに増加した値を設定
for (ulong i = 0; i < vec.Size(); i++, value += step)
vec[i] = value; // 各要素に値を代入
}
//+------------------------------------------------------------------+
//| 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& y_array[], const color colour)
{
// グラフオブジェクトを作成して設定
ExtGraph.Create(ChartID(), "Graphic", 0, 0, 0, GRAPH_WIDTH, GRAPH_HEIGHT);
// 曲線を描画(配列データを使い、指定色で曲線を描く)
ExtGraph.CurveAdd(y_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_HEIG
このサンプルコードは、まず0から8までの数値を順番に格納したベクトルを作成し、各値に対してネイピア数eの累乗を計算します。その結果を配列に変換してグラフにプロットし、チャートに描画します。グラフは、スクリプトが終了するまで表示され、ユーザーがESCキーを押すとグラフを削除し、スクリプトが終了します。また、PgDnキーを押すとスクリーンショットを保存し、グラフを削除してスクリプトを終了します。
このコードにより、eの累乗による指数関数的な増加が視覚的に確認でき、終了時には任意に保存することが可能です。
サンプルコード解説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()
{
// --- step 1で0〜8の9個の値を取得する
vector X(9, VectorArange); // Xベクトルに0から8までの値を設定
Print("vector X = \n", X); // Xベクトルの値をエキスパートログに出力
// --- 各Xベクトル値の「e」(オイラー数)を計算する
X = MathExp(X); // MathExp関数で各Xの値に対してeの累乗を計算
Print("MathExp(X) = \n", X); // 計算結果をエキスパートログに出力
上記のOnStart関数では、まず0から8までの整数値を設定したベクトルXを作成し、その各要素に対してネイピア数eの累乗計算を行います。
まず、ベクトルXは9個の要素を持つベクトルとして生成されています。VectorArange関数というオリジナル関数を使い、Xには0から8までの整数値が順番に格納されます。この結果、Xベクトルは「0, 1, 2, 3, …, 8」のような値を持ちます。
次に、Xベクトル内の各要素に対してMathExp関数を使用し、ネイピア数eをそれぞれの要素値で累乗した結果を計算します。例えば、Xの最初の要素が0の場合、eの0乗は1となり、次の要素が1の場合、eの1乗はおおよそ2.718となります。このようにして、ベクトルXの各要素が累乗結果に置き換えられます。
最後に、計算されたベクトルXの内容をPrint関数でエキスパートログに出力し、計算結果が確認できるようにしています。このログ出力によって、累乗計算が正しく実行されたかを視覚的に確認することができます。
サンプルコード解説3:OnStart関数部分その2
// --- 計算された値をベクトルから配列に転送する
double y_array[]; // 結果を格納する配列を宣言
X.Swap(y_array); // Xベクトルの値をy_array配列に転送
// --- 計算されたベクトル値のグラフを描画する
CurvePlot(y_array, clrDodgerBlue); // y_arrayの値を青色でグラフに描画
ここでは、計算された累乗結果を格納しているベクトルXを配列に変換し、その配列を使ってグラフを描画する手順を解説します。
まず、計算されたベクトルXの値を配列に転送するために、配列y_arrayを宣言しています。この配列は、累乗計算の結果を格納するために使用されます。次に、Swapメソッドを使用してベクトルXの内容をy_arrayに転送します。この操作により、Xベクトルの値が配列y_arrayにコピーされ、ベクトル形式から配列形式へと変換が行われます。
続いて、配列y_arrayに格納された累乗結果を使ってグラフを描画しています。CurvePlot関数を用いて、y_array内のデータを曲線として描画し、その際の色として青色を指定しています。こうすることで、累乗計算の結果がグラフ上に視覚的に表示され、データの指数的な変化が確認できるようになります。
サンプルコード解説4:OnStart関数部分その3
// --- EscapeキーまたはPgDnキーを押してグラフを削除し、終了するまで待機
while (!IsStopped())
{
if (StopKeyPressed()) // 終了キーが押された場合ループを抜ける
break;
Sleep(16); // 16ミリ秒待機(CPU負荷を軽減)
}
// --- クリーンアップ
ExtGraph.Destroy(); // グラフィックオブジェクトを破棄して終了
}
この部分のコードは、グラフを表示させたまま、ESCキーまたはPgDnキーが押されるのを待機する処理です。
まず、while文でループを開始し、スクリプトが停止されていない間、つまりIsStopped関数がfalseを返す間はループが続きます。ループの中でStopKeyPressed関数が呼ばれ、ESCキーまたはPgDnキーが押されたかを確認します。もし、いずれかのキーが押されている場合、break文によってループを抜け、待機処理を終了します。これにより、ユーザーが任意のタイミングでグラフの表示を終了できるようになっています。
ループ内でSleep関数が16ミリ秒の待機を挟むことで、CPU負荷を軽減しながらキーの入力を定期的に確認します。待機処理が終了すると、グラフのクリーンアップに移ります。ExtGraphインスタンスに対してDestroyメソッドを呼び出し、グラフを破棄して使用していたメモリを解放します。これにより、スクリプトの終了時にリソースが適切に解放されます。
サンプルコード解説5: VectorArange関数(オリジナル関数)部分
//+------------------------------------------------------------------+
//| ベクトルに「value」を「step」単位で入力する |
//+------------------------------------------------------------------+
template<typename T>
void VectorArange(vector<T>& vec, T value = 0.0, T step = 1.0)
{
// vecの各要素にvalueからstepごとに増加した値を設定
for (ulong i = 0; i < vec.Size(); i++, value += step)
vec[i] = value; // 各要素に値を代入
}
ここでは、VectorArange関数がどのようにベクトルに値を設定しているのかについて解説します。VectorArange関数は、指定したベクトルに対して、一定の間隔で数値を入力するためのテンプレート関数です。引数にベクトルと2つの数値をとり、指定された数値から始めて指定の間隔で順に数値を増加させながらベクトルに入力していきます。
VectorArange関数の引数について
1つ目の引数として、ベクトルvecを参照渡しで受け取っています。参照渡しにより、関数内での操作が直接ベクトルvecに反映され、関数外のvecにも影響します。このように引数にベクトルを持たせることで、関数が任意のベクトルサイズに対応でき、さまざまな型Tに対して同じ関数を利用できる汎用性も確保されています。
※<T>
という表記は、「テンプレート引数」と呼ばれるもので、C++やMQL5では、関数やクラスをどんなデータ型にも対応させたいときに使います。通常、関数を作成する時はデータ型を「int」や「double」のように指定して、その型だけに対応するようにしますが、テンプレート引数を使うと「どの型にも対応できる」ようになります。
例えば、この<T>
は「仮のデータ型」を示していて、「まだ決まっていない型」として扱われます。関数やクラスを使う時に、初めてその「T」が具体的な型に置き換わるイメージです。このようにすることで、例えば整数でも小数でも同じ処理ができる関数やクラスを一度に作ることができます。
このコードでは、T
を使うことで、ベクトルに整数や小数を入れる場合にも同じ関数を使えるようにしているため、柔軟に利用することができます。
2つ目の引数valueは、初期値を設定するための値です。この引数にはデフォルトで0が指定されていますが、必要に応じて異なる数値を指定して開始値を変更できます。
3つ目の引数stepは、増加の間隔を指定する値です。この値にはデフォルトで1が指定されており、各ベクトルの要素にこの間隔で値を設定します。stepを大きくすれば広い間隔で、stepを小さくすれば細かい間隔で値を増加させることが可能です。
※テンプレート関数についての詳細は↓の記事をご参照ください。
関数の動作
関数内では、forループを用いて、vecのサイズ分だけ繰り返し、valueから始めてstepずつ増加させた値を順にベクトルvecに設定しています。各ループでvecの次の要素にvalueが設定され、その後valueにstepが加算され、次のループで新しい値が設定されるという流れが続きます。
このようにして、vecには0から始まって1ずつ増える数値が順に格納されることになり、たとえばvecの要素数が9であれば、0から8までの数値が1刻みで格納されます。
サンプルコード解説6: 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が押されるまでグラフを表示し、必要に応じてスクリーンショットを保存してからスクリプトを終了する動作が可能になります。
サンプルコード解説7:CurvePlot関数(オリジナル関数)部分
//+------------------------------------------------------------------+
//| グラフオブジェクトを作成して曲線を描く |
//+------------------------------------------------------------------+
void CurvePlot(double& y_array[], const color colour)
{
// グラフオブジェクトを作成して設定
ExtGraph.Create(ChartID(), "Graphic", 0, 0, 0, GRAPH_WIDTH, GRAPH_HEIGHT);
// 曲線を描画(配列データを使い、指定色で曲線を描く)
ExtGraph.CurveAdd(y_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関数は、指定されたデータを使ってグラフに曲線を描画するオリジナルの関数です。この関数では、配列内のデータを利用して曲線をグラフ上に描き、さらにグラフの説明文を表示します。
まず、グラフを描画するためにグラフィックオブジェクトを作成しています。Createメソッドを使用して、グラフのID、表示位置、サイズ(幅と高さ)を設定し、チャート上にグラフの枠を用意します。
次に、CurveAddメソッドを使って、y_array配列に格納されたデータを曲線として描画します。この際、曲線の色はcolour引数で指定され、ここでは指定された色に変換して適用しています。また、曲線は「線」として描画する設定になっています。
その後、IndentUpメソッドでグラフ全体の位置を上に少し移動させ、CurvePlotAllメソッドを使って、曲線を描画する処理を確定します。これにより、配列内のデータに基づいた曲線がグラフ上に表示されます。
また、グラフの下部にはESCキーとPgDnキーの使用説明が表示されます。TextAddメソッドで、2行にわたってテキストを追加し、色も指定しています。最後にUpdateメソッドを呼び出して、グラフとテキストの更新を実行し、最終的なグラフが表示されます。
サンプルコード解説8: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関数でチャートを再表示します。
関数の戻り値として、スクリーンショットが正常に保存されたかどうかの成否が返されます。
この関数を使ってEAを作る際のアイディア
MathExp関数とCurvePlot関数を活用することで、次のようなエキスパートアドバイザー(EA)やインジケータの作成に応用できます。
- リスク管理と損益計算の可視化
MathExp関数を用いて、リスク管理における複利効果や損益計算の視覚化が可能です。例えば、複利を加味した資産の成長シミュレーションを行い、累積的な利益の増加をグラフで表示することで、エントリーや資金管理の効果を視覚的に確認できるEAを開発できます。 - ボラティリティを反映したトレード分析
市場のボラティリティを分析するために、指数関数的な計算が有効です。MathExp関数を使用して、ボラティリティに応じた価格の変動を予測し、価格が急激に増加または減少する可能性をモデル化することで、急激なトレンドを捉えるEAやトレンド追従型のインジケータを構築できます。 - トレーリングストップの最適化
MathExp関数で計算した指数関数的な値をトレーリングストップの設定に応用し、価格が上昇するごとにトレーリングストップの移動幅を指数的に拡大することで、価格の急激な変動にも柔軟に対応できる仕組みを作成できます。この方法により、利益を最大化しつつ、トレンドの反転時には迅速に利益を確定できるEAを作成することが可能です。 - 自動トレードのパラメータ調整
MathExp関数を使い、複雑な計算を必要とするトレードパラメータの自動調整にも応用できます。特に、取引量やポジションサイズを指数関数的に変化させることで、利益の積み上げやリスクの増減を制御するEAを実現できます。市場の状況に応じて取引量を動的に変化させる機能を取り入れることで、柔軟なトレード戦略を構築できます。 - 成長率や減衰率の分析インジケータ
MathExp関数を使って価格の成長や減衰の率を分析し、その情報をグラフで表示するインジケータを作成することができます。たとえば、価格の急激な上昇や下落の局面を検出し、売買シグナルを発生させるEAとして応用することができます。このようなインジケータを使うことで、トレンドの変わり目を捉え、エントリーやエグジットの判断をサポートするEAが構築できます。