MT4サインインジケータのサインオブジェクトをCSV形式でエクスポートする方法(無料コードとファイル)
どうも、ひろぽんです。
MT4を使ってトレードをされている方の中には、サインインジケータを使用している方も多いと思います。サインインジケータとは、『ここでロング!』って矢印が出たりするアレです。
ご自身のトレード手法が確立している方でも、参考に表示させている方もいるかと思います。
このサインインジですが、EA化されておらず、シグナルサインだけのものも多いです。
サインインジケータを使用されている方の中には、上記のようなことを思ったことがあるのではないでしょうか?
そこで今回は、そのサインインジケータによるバックテストを行う前提として、サインインジケータのオブジェクトをcsvデータとして吐き出す部分を実装したので、ご紹介します。全部無料で読めます。
コードとダウンロード可能なファイルも最後に付けてますので、最後まで読んでもらえると嬉しいです。
注意事項
サインインジケータのオブジェクトとは?
上記は私が適当に作ったサインインジケータです。この図における緑やオレンジの◎がサインインジケータのオブジェクトです。
サインインジケータの多くは、ローソク足の上か下に、矢印や三角、〇の形で表示されます。
このサインインジケータの買いサイン、売りサインを表示しているオブジェクトを全部csvとして取得しようとするのが、当noteの目的です。
なぜオブジェクトを取得するのか?
サインインジケータは多くの場合、コードやロジックが公開されていません。サインインジケータの多くは、コードを読むことが可能な拡張子mq4ではなく、コンパイルされた拡張子ex4の形で提供されていると思います。コード内容やロジックをコピーされて、転売される危険性もあるので当然と言えば当然ですが。
そのため、どこでエントリーのサインを出すかについては、外部から知る方法はありません。
しかし、エントリーロジックの根幹は分からずとも、どこでエントリーサインを出すかさえ取得することができれば、バックテストすることは可能です。
そこで、サインインジケータのエントリーサインの矢印がいつ表示されたのかを取得し、CSVに保存する方法を考えました。
オブジェクト情報とは?
オブジェクト情報は手動でも調べることができます。
サインが表示されたらオブジェクト(▽とか矢印とか)を右クリックし、表示されたArrowプロパティを開きます。
名前がオブジェクト名を表します。インジケータを作成する場合、同じオブジェクト名だと上書きされます。例えば、LongEntryなんて名前だと、サインが表示されるたびに過去のサインが消えて、一番新しいサインだけが表示される状態になります。
サインを表示し続けたいインジケータの場合は、ローソク足のバー番号や時間、表示された順番の番号などを名前に入れて、個別に違いが認識されるように設定しています。
上記の場合は、BOって名前に2024.01.26 23:27:00って時間を付けることでかぶらないようにしています。
(従って、今回のスクリプトは、表示され続けるサインに対しては使用できますが、毎回サインが消えてしまうようなサインインジケータには使用できません。)
スクリプトの仕様
チャートにサインインジケータを入れて、サインが表示されているようにします。
今回のスクリプトファイルをドラッグアンドドロップします。
スクリプトによって取得できたオブジェクトの内容をターミナルのエキスパートタブに表示します。
結果は、MQL4フォルダ内のFilesフォルダにcsv形式で保存されます。
ファイル名は、『通貨ペア名_時間足』です。時間足は1時間なら60、1日なら1440のように分数で入力されます。
同じファイル名が存在した場合、バージョン番号として後ろに番号が付き、上書き保存されないようにしています。
CSVの中身は、名前、コード番号、表示された時間、表示された価格、色を保存しています。
表示された時間と価格は、サインが表示された位置情報を表しています。ここから、いつエントリーサインが点灯したのかの情報を取得します。
コード番号は、方向(ロングかショートか)を判断するために使用します。ロングとショートが同じコード番号を使用している場合、色も判断に使用します。
オブジェクトcsvの利用方法
取得したオブジェクト情報のcsvは、pythonなどで解析に使用してもいいですし、MT4にて別のEAを作成しバックテストしてみても良いかもしれません。
このあたりに関しては、次のnoteで書こうと思います。
サインインジケータに対して、優位性のあるエントリーポイントや決済方法を見つけることができれば、サインインジケータをもとに自動でエントリー決済を行うEAなどを使用してトレードを行うことも可能です。
オブジェクトを取得しcsvに保存するコードとファイル
ファイルはこちらからダウンロードできます。
コードはこちらです。
// サインインジケータのオブジェクトをcsvで保存するスクリプト
#property strict
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,"Name","Code","Time","Price","Color");
// メインチャートに表示された全オブジェクトを処理
for(int i=0; i<ObjectsTotal(); i++){
// オブジェクト名取得
string name = ObjectName(0,i);
// オブジェクトがArrowタイプの時だけ処理
if(ObjectType(name)==OBJ_ARROW){
// Arrowコード番号
int code = ObjectGetInteger(0,name,OBJPROP_ARROWCODE);
// 時間
datetime time = ObjectGetInteger(0,name,OBJPROP_TIME);
// 価格
double price = ObjectGetDouble(0,name,OBJPROP_PRICE);
// 色
string clr = ColorToString(ObjectGetInteger(0,name,OBJPROP_COLOR),true);
// エキスパートに表示
Print(name,", ",code,", ",time,", ",price,", ",clr);
// csvにファイル保存
FileWrite(File,name,code,time,price,clr);
}
}
// ファイルクローズ
FileClose(File);
}
説明はコード内に書いています。
何かわからないことや、間違いの指摘などお気づきのことがありましたら、下記のTwitterにDMお願いします。
https://twitter.com/python_btc_bot
ここまで読んでいただいてありがとうございました。
他にもいろいろとインジケータなどを作成しています。読んでいただけると嬉しく思います。