見出し画像

MT4サインインジケータのサインオブジェクトをCSV形式でエクスポートする方法(無料コードとファイル)

どうも、ひろぽんです。

MT4を使ってトレードをされている方の中には、サインインジケータを使用している方も多いと思います。サインインジケータとは、『ここでロング!』って矢印が出たりするアレです。

ご自身のトレード手法が確立している方でも、参考に表示させている方もいるかと思います。

このサインインジですが、EA化されておらず、シグナルサインだけのものも多いです。

実際にこのサインでエントリーした場合、どんな成績になるんだろう。
・サインの取捨選択をバックテストしてみたい。
・決済手法に手を加えれば、面白いことになるのでは?

サインインジケータを使用されている方の中には、上記のようなことを思ったことがあるのではないでしょうか?


そこで今回は、そのサインインジケータによるバックテストを行う前提として、サインインジケータのオブジェクトをcsvデータとして吐き出す部分を実装したので、ご紹介します。全部無料で読めます。

コードとダウンロード可能なファイルも最後に付けてますので、最後まで読んでもらえると嬉しいです。


注意事項

当noteに含まれる情報の全ては、情報提供を唯一の目的としたものであり、収益の保証、或いは、直接的に投資助言業務、投資勧誘を行うものではありません。投資方針や時期選択等の最終決定は、リスク等を熟知した上、ご自身で判断されますようお願いいたします。
当サイトの利用、あるいは取引により利用者に生じたいかなる損害についても著者及び発行者はそれに対し、一切の責任を負いません。あらかじめご了承ください。
万が一、損失を被った場合でも、著者は一切の責任を負わないものとします。


サインインジケータのオブジェクトとは?

サインインジケータのオブジェクトとは、上図の◎とかです。

上記は私が適当に作ったサインインジケータです。この図における緑やオレンジの◎がサインインジケータのオブジェクトです。

サインインジケータの多くは、ローソク足の上か下に、矢印や三角、〇の形で表示されます。

このサインインジケータの買いサイン、売りサインを表示しているオブジェクトを全部csvとして取得しようとするのが、当noteの目的です。


なぜオブジェクトを取得するのか?

サインインジケータは多くの場合、コードやロジックが公開されていません。サインインジケータの多くは、コードを読むことが可能な拡張子mq4ではなく、コンパイルされた拡張子ex4の形で提供されていると思います。コード内容やロジックをコピーされて、転売される危険性もあるので当然と言えば当然ですが。

そのため、どこでエントリーのサインを出すかについては、外部から知る方法はありません。

しかし、エントリーロジックの根幹は分からずとも、どこでエントリーサインを出すかさえ取得することができれば、バックテストすることは可能です。

そこで、サインインジケータのエントリーサインの矢印がいつ表示されたのかを取得し、CSVに保存する方法を考えました。


オブジェクト情報とは?

サインのオブジェクトを右クリックしてArrowプロパティを表示。

オブジェクト情報は手動でも調べることができます。

サインが表示されたらオブジェクト(▽とか矢印とか)を右クリックし、表示されたArrowプロパティを開きます。


名前がオブジェクト名、スタイルが色。

名前がオブジェクト名を表します。インジケータを作成する場合、同じオブジェクト名だと上書きされます。例えば、LongEntryなんて名前だと、サインが表示されるたびに過去のサインが消えて、一番新しいサインだけが表示される状態になります。

サインを表示し続けたいインジケータの場合は、ローソク足のバー番号や時間、表示された順番の番号などを名前に入れて、個別に違いが認識されるように設定しています。

上記の場合は、BOって名前に2024.01.26 23:27:00って時間を付けることでかぶらないようにしています。

(従って、今回のスクリプトは、表示され続けるサインに対しては使用できますが、毎回サインが消えてしまうようなサインインジケータには使用できません。)


スクリプトの仕様

チャートにサインインジケータを入れて、サインが表示されているようにします。


GetSignalObjectのスクリプトファイルをチャートにドロップするだけ。

今回のスクリプトファイルをドラッグアンドドロップします。


スクリプトが走るとエキスパートタブにオブジェクト内容が表示されます。

スクリプトによって取得できたオブジェクトの内容をターミナルのエキスパートタブに表示します。


MQL4のFilesフォルダにcsvで保存

結果は、MQL4フォルダ内のFilesフォルダにcsv形式で保存されます。

ファイル名は、『通貨ペア名_時間足』です。時間足は1時間なら60、1日なら1440のように分数で入力されます。

同じファイル名が存在した場合、バージョン番号として後ろに番号が付き、上書き保存されないようにしています。


CSVの中身

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


ここまで読んでいただいてありがとうございました。

他にもいろいろとインジケータなどを作成しています。読んでいただけると嬉しく思います。


この記事が気に入ったらサポートをしてみませんか?