見出し画像

MT4インジケータのバッファ形式のシグナルをCSV形式でエクスポートする方法(無料コードとファイル)

どうも、ひろぽんです。

前回のnoteで、サインインジケータのオブジェクトを取得するコードとファイルを紹介しました。

しかし、インジケータの中には、バッファ形式でシグナルを表示しているツールもあり(こっちの方が多いかも)、上記のnoteの方法ではオブジェクトを取得できません。

そこで、ex4形式などの形式でコードの中身が分らないサインインジケータの中身をcsv形式で吐き出し、バッファ番号何番目がシグナルを表しているかを知ることができるコードとファイルを作成したので、ご紹介します。

最後まで無料で読めますし、ファイルもダウンロードできますので、ぜひ読んでいただけると嬉しいです。


追記 2024年2月25日

インジケータのパラメータ値を指定する場合のコードを追記しました。



注意事項

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


サインインジケータのバッファ型とは?

サインインジケータのオブジェクトとは、上図の矢印などです。

サインインジケータのオブジェクトとは、上図の矢印などのことで、このオブジェクトを表示する方法には、バッファ形式オブジェクト形式があります。

簡単に説明すると、バッファ形式は時系列の配列です。OpenやCloseなどと同じように、ローソク足1本ごとに値を持っています。シグナルがある時(矢印が表示されている時)は、矢印の表示される位置の価格データを、そうでない時は0が配列に保存されています。

2014年2月1日 19時 180.00円  (シグナルオブジェクト表示)
2014年2月1日 20時 0円
2014年2月1日 21時 0円
2014年2月1日 22時 181.00円  (シグナルオブジェクト表示)
2014年2月1日 23時 0円
                         みたいな感じです。

一方、以前紹介したオブジェクト形式は一つ一つが独立したデータです。

オブジェクト1
2014年2月1日 19時 180.00円  (シグナルオブジェクト表示)
オブジェクト2
2014年2月1日 22時 181.00円  (シグナルオブジェクト表示)
                         みたいな感じです。

『表示中のライン等』の項目がない。

このバッファ形式のオブジェクトは、オブジェクトとして認識されていないので、以前の方法のようにチャートを右クリックして、『表示中のライン等』でオブジェクト要素を知ることができません。

そこで、コードの中身が分らないインジケータの中で、シグナルオブジェクトを表示しているバッファ番号(何個目の配列か)を知るスクリプトを作成しました。


スクリプトの仕様

チャートにスクリプトファイルをドラッグアンドドロップするだけ。

チャートに今回のスクリプトファイルをドラッグアンドドロップするだけでOKです。

MQL4のFilesフォルダ内にcsvにて保存

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

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

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


スクリプトの利用方法

適当なバッファ形式のサインインジケータを作成し、スクリプトを走らせた結果です。

csvの中身

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)を適宜、ご自身の知りたいインジケータ名に変更してください。変更後、コンパイルボタンを押すことで実行ファイルが作成されます。

IndiNameの値(testSign2)を別のインジケータ名に変更してコンパイルを押せばOK。


コードはこちらです。

// サインインジケータのオブジェクトを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)を適宜、ご自身の知りたいインジケータ名に変更してください。変更後、コンパイルボタンを押すことで実行ファイルが作成されます。

IndiNameの値(testSign2)を別のインジケータ名に変更してコンパイルを押せばOK。


何かわからないことや、間違いの指摘などお気づきのことがありましたら、下記のTwitterにDMお願いします。

https://twitter.com/python_btc_bot


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

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


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