MT4インジケータのバッファ形式のシグナルをCSV形式でエクスポートする方法(無料コードとファイル)
どうも、ひろぽんです。
前回のnoteで、サインインジケータのオブジェクトを取得するコードとファイルを紹介しました。
しかし、インジケータの中には、バッファ形式でシグナルを表示しているツールもあり(こっちの方が多いかも)、上記のnoteの方法ではオブジェクトを取得できません。
そこで、ex4形式などの形式でコードの中身が分らないサインインジケータの中身をcsv形式で吐き出し、バッファ番号何番目がシグナルを表しているかを知ることができるコードとファイルを作成したので、ご紹介します。
最後まで無料で読めますし、ファイルもダウンロードできますので、ぜひ読んでいただけると嬉しいです。
追記 2024年2月25日
インジケータのパラメータ値を指定する場合のコードを追記しました。
注意事項
サインインジケータのバッファ型とは?
サインインジケータのオブジェクトとは、上図の矢印などのことで、このオブジェクトを表示する方法には、バッファ形式とオブジェクト形式があります。
簡単に説明すると、バッファ形式は時系列の配列です。OpenやCloseなどと同じように、ローソク足1本ごとに値を持っています。シグナルがある時(矢印が表示されている時)は、矢印の表示される位置の価格データを、そうでない時は0が配列に保存されています。
一方、以前紹介したオブジェクト形式は一つ一つが独立したデータです。
このバッファ形式のオブジェクトは、オブジェクトとして認識されていないので、以前の方法のようにチャートを右クリックして、『表示中のライン等』でオブジェクト要素を知ることができません。
そこで、コードの中身が分らないインジケータの中で、シグナルオブジェクトを表示しているバッファ番号(何個目の配列か)を知るスクリプトを作成しました。
スクリプトの仕様
チャートに今回のスクリプトファイルをドラッグアンドドロップするだけでOKです。
結果は、MQL4フォルダ内のFilesフォルダにcsv形式で保存されます。
ファイル名は、『通貨ペア名_時間足』です。時間足は1時間なら60、1日なら1440のように分数で入力されます。
同じファイル名が存在した場合、バージョン番号として後ろに番号が付き、上書き保存されないようにしています。
スクリプトの利用方法
適当なバッファ形式のサインインジケータを作成し、スクリプトを走らせた結果です。
csvの中身は、縦軸が時間、横方向にバッファ番号ごとの要素が保存されます。
Indi_1は、2024.2.16 01:00:00 に 149.812 の価格を持っています。
Indi_2は、2024.2.16 05:00:00 に 150.382 の価格を持っています。
以上により、バッファ番号の一つ目が買いサイン、バッファ番号の二つ目が売りサインであることがわかりました。
バッファ番号は何に使えるのか?
バッファ番号が分かれば、iCustom関数を使ってEAを作成することができます。
MQL4でインジケータを用いたEAを作成する場合、iCustom関数というものを使用します。
インジケータの値を使用してEAのエントリーシグナルにすることができたりする便利な関数なのですが、インジケータ内の何番目のバッファ値が欲しいシグナルかわからないとEA を作成することができません。
現在、MT4では512のバッファを持つことができます。そこまで多くのバッファを使用しているインジケータは見たことがありませんが、このスクリプトを使用すれば、512番目でも知ることは出来ます。
バッファオブジェクトcsvの利用方法
csvにOpenやCloseなど4本値のデータも保存することで、pythonなどの別プログラムを使用して検証作業をすることができます。
また、サインインジケータであれば、サインを表すバッファ番号を特定することでEAを作成することが可能になります。
インジケータのバッファ配列をcsvに保存するコードとファイル
ファイルはこちらからダウンロードできます。
今回はex4ファイルではなく、mq4ファイルです。
inputでインジの名前を入力としていますが、MT4のスクリプトファイルの場合、実行時にパラメータ入力ができないようです。
そこで、面倒ですが、上記ファイルをMetaEditorにてオープンした後、『インジの名前を入力』の部分(testSign2)を適宜、ご自身の知りたいインジケータ名に変更してください。変更後、コンパイルボタンを押すことで実行ファイルが作成されます。
コードはこちらです。
// サインインジケータのオブジェクトをcsvで保存するスクリプト
// バッファ型でオブジェクトを表示している場合
#property strict
input string IndiName = "testSign2"; // インジの名前を入力
double Indi[];
void OnStart()
{
// ファイル名は、『通貨ペア名 _ 時間足』で
string filename = _Symbol + "_" + string(_Period);
// 同名ファイルがある場合、ファイル上書きさせず、別保存させる処理
int cnt = 1;
string basename = filename;
while ( FileIsExist(basename+".csv")==true ){
basename = filename + "_"+string(cnt);
cnt++;
}
filename = basename;
// 保存するファイルのハンドル 区切りはカンマで
int File = FileOpen(filename+".csv",FILE_CSV|FILE_WRITE,",");
// 保存ファイルの展開エラー エキスパートタブにエラーコード表示
if(File==INVALID_HANDLE){
Print("File("+filename+".csv) can't open. (", GetLastError(), ")");
return;
}
// 保存するcsvの各列名を設定
FileWrite(File,"Time","Indi_0","Indi_1","Indi_2","Indi_3","Indi_4","Indi_5","Indi_6","Indi_7","Indi_8","Indi_9");
// メインチャートに表示された全オブジェクトを処理
for(int i=0; i<Bars; i++){
// 時間
datetime time = iTime(_Symbol,PERIOD_CURRENT,i);
// 価格
double price0 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,0,i);
double price1 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,1,i);
double price2 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,2,i);
double price3 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,3,i);
double price4 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,4,i);
double price5 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,5,i);
double price6 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,6,i);
double price7 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,7,i);
double price8 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,8,i);
double price9 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,9,i);
// エキスパートに表示
//Print(time,", ",price1,price2,price3,price4,price5,price6,price7,price8,price9);
// csvにファイル保存
FileWrite(File,time,price0,price1,price2,price3,price4,price5,price6,price7,price8,price9);
}
// ファイルクローズ
FileClose(File);
}
上記コードは10個目までのバッファを取得していますが、price10などを追加していくことで、10個目以降のバッファも取得することが可能です。
2024年2月25日 追記
インジケータのパラメータ値を指定する場合のコードです。
上記のコードの場合、インジケータはデフォルト設定の条件の結果が吐き出されます。パラメータの変更が必要な場合は、以下のように変更してください。
例えば、パラメータ1個目を0、2個目を5とするような場合は以下のようにします。
// 変更前
double price0 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,0,i);
// 変更後
double price0 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,0,5,0,i);
IndiNameの次の引数がパラメータ1つ目、次がパラメータ二つ目、・・・、バッファ番号、最後がローソク足番号です。
適宜、必要なパラメータ値に変更して試してみてください。
上記の場合の全コードは以下のようになります。
// サインインジケータのオブジェクトをcsvで保存するスクリプト
// バッファ型でオブジェクトを表示している場合
// インジケータのパラメータ(1個目が1、2個目が5の場合)
#property strict
input string IndiName = "testSign2"; // インジの名前を入力
double Indi[];
void OnStart()
{
// ファイル名は、『通貨ペア名 _ 時間足』で
string filename = _Symbol + "_" + string(_Period);
// 同名ファイルがある場合、ファイル上書きさせず、別保存させる処理
int cnt = 1;
string basename = filename;
while ( FileIsExist(basename+".csv")==true ){
basename = filename + "_"+string(cnt);
cnt++;
}
filename = basename;
// 保存するファイルのハンドル 区切りはカンマで
int File = FileOpen(filename+".csv",FILE_CSV|FILE_WRITE,",");
// 保存ファイルの展開エラー エキスパートタブにエラーコード表示
if(File==INVALID_HANDLE){
Print("File("+filename+".csv) can't open. (", GetLastError(), ")");
return;
}
// 保存するcsvの各列名を設定
FileWrite(File,"Time","Indi_0","Indi_1","Indi_2","Indi_3","Indi_4","Indi_5","Indi_6","Indi_7","Indi_8","Indi_9");
// メインチャートに表示された全オブジェクトを処理
for(int i=0; i<Bars; i++){
// 時間
datetime time = iTime(_Symbol,PERIOD_CURRENT,i);
// 価格
double price0 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,0,5,0,i);
double price1 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,0,5,1,i);
double price2 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,0,5,2,i);
double price3 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,0,5,3,i);
double price4 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,0,5,4,i);
double price5 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,0,5,5,i);
double price6 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,0,5,6,i);
double price7 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,0,5,7,i);
double price8 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,0,5,8,i);
double price9 = iCustom(_Symbol,PERIOD_CURRENT,IndiName,0,5,9,i);
// エキスパートに表示
//Print(time,", ",price1,price2,price3,price4,price5,price6,price7,price8,price9);
// csvにファイル保存
FileWrite(File,time,price0,price1,price2,price3,price4,price5,price6,price7,price8,price9);
}
// ファイルクローズ
FileClose(File);
}
2024年3月16日 追記
こちらもmq4ファイルです。
inputでインジの名前を入力としていますが、MT4のスクリプトファイルの場合、実行時にパラメータ入力ができないようです。
そこで、面倒ですが、上記ファイルをMetaEditorにてオープンした後、『インジの名前を入力』の部分(testSign2)を適宜、ご自身の知りたいインジケータ名に変更してください。変更後、コンパイルボタンを押すことで実行ファイルが作成されます。
何かわからないことや、間違いの指摘などお気づきのことがありましたら、下記のTwitterにDMお願いします。
https://twitter.com/python_btc_bot
ここまで読んでいただいてありがとうございました。
他にもいろいろとインジケータなどを作成しています。読んでいただけると嬉しく思います。
この記事が気に入ったらサポートをしてみませんか?