- MathLog1p関数の働き・役割
- MathLog1p関数の引数について
- MathLog1p関数の戻り値について
- MathLog1p関数を使ったサンプルコード
- サンプルコード解説1: グローバル領域での定義
- サンプルコード解説2:OnStart関数の中その1
- サンプルコード解説3:OnStart関数部分その2
- サンプルコード解説4:OnStart関数部分その3
- サンプルコード解説5: VectorArange関数(オリジナル関数)部分
- サンプルコード解説6: StopKeyPressed関数(オリジナル関数)部分
- サンプルコード解説7:CurvePlot関数(オリジナル関数)部分
- サンプルコード解説8:MakeAndSaveScreenshot関数(オリジナル関数)部分
- MathLog1p関数を使ってEAを作る際のアイディア
MathLog1p関数の働き・役割
MathLog1p関数は、「1にある数 x を足した結果の自然対数(eを底(計算の基準となる数)とした対数)」を計算するための関数です。特に、 x が0に近い値の場合、通常の MathLog関数を使うよりも正確な結果を出せるように工夫されています。
自然対数とは、「ある数が e(約2.71828)の何乗で表されるか」を示す値です。この場合、MathLog1p関数は「1に小さな数 x を足した結果が、e を何乗すると得られるか」を計算し、その「何乗」の値を返します。
具体例と計算過程
例えば、x に 0.001 を入れて計算してみます。
- MathLog1p関数を使うと、まず「1に0.001を足す」計算が行われます。これは単純に 1 + 0.001 = 1.001 です。
- 次に、この1.001の自然対数を求めます。この場合の自然対数は約 0.0009995 です。この値は「e を 0.0009995 乗すると 1.001 になる」という意味を持ちます。
MathLog1p関数を使わずに MathLog(1 + x) として同様の計算をしても似た値が出ますが、非常に小さな数 x を足した場合は MathLog1p関数の方が精度が高くなります。
つまり、MathLog1p関数は「1に小さな数を足した自然対数」を計算する際に、特に精度が求められる場合に役立ちます。このような関数は、科学や工学などの分野で高い精度が必要な計算に利用されています。
MathLog1p関数の引数について
double MathLog1p(
double value // 対数を取る値
);
MathLog1p関数には、計算したい数値を指定する引数が1つあります。この引数を通じて、1に足し合わせる数 x を指定し、その結果の自然対数(eを底とした対数で、ある数がe(約2.718) の何乗に相当するかを示す)を求めます。
引数構成
- value
対数(ある数が基準となる数の何乗に相当するかを示す値)を計算するための数値を指定します。たとえば、 value が 0.001 であれば、MathLog1p は 1 + 0.001 = 1.001 の自然対数を計算します。
この引数は小数点を含む実数(double型)を指定でき、非常に小さな数値から大きな数値まで扱うことが可能です。
MathLog1p関数の戻り値について
MathLog1p関数は、1に指定した数値を加えた結果の自然対数(eを底とする対数で、eは約2.718)を返します。この関数の戻り値は以下のように異なります。
- 通常の場合:指定した value に基づき、1 + value の自然対数の計算結果を返します。例えば、value に 0.001 を指定した場合は、1.001 の自然対数である約 0.0009995 が返されます。
- value が -1 の場合:1 + value は 0 となり、その自然対数は無限大(INF)となるため、無限大が返されます。
- value が -1 より小さい場合:この場合、1 + value は負の値になり、自然対数が定義できないため、未定義の値(NaN)が返されます。
MathLog1p関数は、特に value が小さな値である場合に、精度を保った自然対数の計算を行えるよう設計されています。
MathLog1p関数を使ったサンプルコード
#define GRAPH_WIDTH 750 // グラフの幅を750ピクセル(デジタル画像を構成する最小の単位)に設定
#define GRAPH_HEIGHT 350 // グラフの高さを350ピクセルに設定
#include <Graphics\Graphic.mqh> // グラフィック描画のためのライブラリをインクルード
CGraphic ExtGraph; // グラフィック描画のためのオブジェクトを作成
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- step 1で0〜8の9個の値を取得する
// VectorArange関数で、0から始まり1ずつ増加する9つの値をXベクトルに代入する
vector X(9,VectorArange);
Print("vector X = \n",X); // 取得したXベクトルをエキスパートログに出力
//--- 各ベクトル値について、式の対数を計算する(1 + Xベクトル値)
// MathLog1p関数で、各Xベクトルの値に1を足した後、自然対数(eを底とした対数)を計算する
X=MathLog1p(X);
Print("MathLog1p(X) = \n",X); // 計算結果のXベクトルをエキスパートログに出力
//--- 計算された値をベクトルから配列に転送する
double y_array[]; // 計算結果を格納する配列を宣言
X.Swap(y_array); // Xベクトルの内容をy_array配列にコピーする
//--- 計算されたベクトル値のグラフを描画する
// y_array配列の値を使用して、グラフを描画し、色は青(clrDodgerBlue)に設定
CurvePlot(y_array,clrDodgerBlue);
//--- EscapeキーまたはPgDnキーを押してグラフを削除し(スクリーンショットを撮り)、終了するまで待機する
// スクリプトが停止されるまでループを続ける
while(!IsStopped())
{
// 停止キーが押されていればループを抜ける
if(StopKeyPressed())
break;
Sleep(16); // 16ミリ秒待機して次の処理へ
}
//--- クリーンアップ
// グラフオブジェクトを破棄してメモリを解放
ExtGraph.Destroy();
/*
結果:
vector X =
[0,1,2,3,4,5,6,7,8]
MathLog1p(X) =
[0,0.6931471805599453,1.09861228866811,1.386294361119891,1.6094379124341,1.791759469228055,1.945910149055313,2.079441541679836,2.19722457733622]
*/
}
//+------------------------------------------------------------------+
//| ベクトルに「value」を「step」単位で入力する |
//+------------------------------------------------------------------+
template<typename T>
void VectorArange(vector<T> &vec,T value=0.0,T step=1.0)
{
// 指定された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);
// 曲線を追加し、引数colourで指定した色で描画
ExtGraph.CurveAdd(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); // スクリーンショットが成功すればtrueを返す
}
このコードは、0から8までの数値を1ずつ増加させたデータセットを作成し、各データに対して「1を足して自然対数を取る」計算を行います。計算結果をグラフとしてチャート上に描画し、ユーザーがEscキーやPgDnキーを押すまで待機します。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()
{
//--- step 1で0〜8の9個の値を取得する
// VectorArange関数で、0から始まり1ずつ増加する9つの値をXベクトルに代入する
vector X(9,VectorArange);
Print("vector X = \n",X); // 取得したXベクトルをエキスパートログに出力
この部分のコードは、スクリプトが実行されたときに初めて呼び出され、まず0から8までの値を1ずつ増加させたベクトルを作成し、その各値に対して「1を足した後の自然対数」を計算します。
解説
最初に、vector X(9, VectorArange) によって、Xというベクトルが生成されます。VectorArange関数が使用されており、これは0から始まり1ずつ増加する数値を9つ取得する設定です。この結果、Xには [0, 1, 2, 3, 4, 5, 6, 7, 8] という値が格納されます。このベクトルの内容は、Print関数を用いてエキスパートログに出力されます。
次に、X=MathLog1p(X) により、Xベクトルの各要素に1を足し、その結果の自然対数(eを底(約2.718)とした対数)を計算してベクトルの要素を置き換えます。例えば、最初の要素0であれば、1を足して1の自然対数を取るため、結果は0となります。
サンプルコード解説3:OnStart関数部分その2
//--- 計算結果のベクトルの値を配列に転送する
double y_array[]; // 配列y_arrayを宣言
X.Swap(y_array); // ベクトルXの内容をy_arrayにコピー
//--- 計算されたベクトルのグラフを描画する
CurvePlot(y_array,clrDodgerBlue); // y_arrayの値をもとにグラフを描画
この部分では、計算結果を配列に転送し、そのデータを用いてグラフを描画しています。
- ベクトルから配列への転送
配列y_arrayを宣言し、ベクトルXに含まれる計算結果をy_arrayにコピーしています。X.Swap(y_array)とすることで、ベクトル内のすべての要素がy_arrayに転送され、グラフ描画に使用できる形に変換されます。 - グラフの描画
CurvePlot関数を使い、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: 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, ColorToARGB(colour), CURVE_LINES);
// --- テキストメッセージを画面に追加
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引数で指定され、ここでは指定された色に変換して適用しています。また、曲線は「線」として描画する設定になっています。
また、グラフの下部には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関数でチャートを再表示します。
関数の戻り値として、スクリーンショットが正常に保存されたかどうかの成否が返されます。
MathLog1p関数を使ってEAを作る際のアイディア
MathLog1p関数は、特に数値の精度が求められる計算に適しており、小さな変動を扱う際のリスク管理や価格変動の分析に役立ちます。以下に、この関数を活用したEA(エキスパートアドバイザー)のアイディアを紹介します。
価格変動の微小な変化を正確に捉える指標を作成
価格変動の微細な変化を分析するインジケータを作成し、その結果をもとにエントリーポイントを見つけるEAを構築するアイディアです。例えば、MathLog1p関数を用いて特定の通貨ペアの直近の価格変動を分析し、わずかな上昇や下落を捉える指標を作成できます。この指標を活用することで、トレンドの発生をより正確に予測し、迅速にエントリーやエグジットを行うEAが作成できます。
勾配の変化を検知するボラティリティ判定EA
価格の上昇や下降の角度(勾配)をMathLog1p関数で精度高く計算し、勾配の急激な変化が生じたときにトレードを行うEAです。ボラティリティが急増した場合にポジションを持つことで、利益を狙うことができます。勾配の変化に着目することで、価格が上昇しやすいタイミングや下降しやすいタイミングをより正確に捉えられます。
ポートフォリオ管理のためのリスク最適化EA
複数の通貨ペアや資産を扱うポートフォリオのリスク管理の一環として、リスク調整を行うEAの作成が考えられます。MathLog1p関数を使用して、ポジションごとのリスク(微小なリターンの自然対数)を精度高く計算し、リスクの高いポジションを減らしつつ利益を保ちたいときに適したバランスを取る手助けをします。