アフィリエイト広告を利用しています

広告

posted by fanblog

広告

posted by fanblog
2013年07月27日
第9回 MQL4について





前回 MT4 のカスタムインデイケータ DCSV28 について書きましたが、これはMQL4 (MetaQuotes Language 4) というプログラム言語で記述されています。C言語に似た言語です。今回は DCSV28 についてMQL4も含めて説明してみたいと思います。

(1) グローバル変数 

extern int OutputBars = 1000;
int timecounter=0;


OutputBars は出力本数です。
extern 文でプログラムの外部パラメータを指定します。プログラムを変更せずに実行時に出力本数を変更することができます。

extern 文を付けないとモジュール内のグローバル変数になります。

(2) init 関数

int init()
{
     quote_write();
     return(0);
}


init 関数は予約語の関数です。起動時に1度だけMT4から呼ばれます。
quote_writeでCSVファイルへの書込みを行っています。  

(3) start関数

int start()
{
     if (Minute()==timecounter) return(0);
     timecounter=Minute();
     quote_write();
     return(0);
}


start 関数は予約語の関数です。データに変化があるつどMT4から呼ばれます。DCSV28を例えばUSDJPYのチャートに貼り付けたとするとUSDJPYの価格が変化するつどMT4から呼ばれます。quote_write 関数でCSVファイルへの書込みを行いますが、価格変化のつどでは頻繁すぎるので1分間に1度quote_write を呼び出しています。
なお、init 関数で1度書込みを行えば十分だと思われますが、それではデータ漏れが起こってしまいます。書込みデータをMT4が受信するまである程度時間がかかるのでこのような処理を行っています。

(4) quote_write 関数

int quote_write()
{
     datetime dt;
     bool flag;
     string str;

     Comment("start");

     dt=outputCSV("USDJPY");
     flag=true;

     if (outputCSV("EURJPY")!=dt) flag=false;
     if (outputCSV("GBPJPY")!=dt) flag=false;
       ...
       ...
       ...

     str=TimeToStr(dt,TIME_DATE)+" "+TimeToStr(dt,TIME_MINUTES)+" finished";
     if (flag) str=str+" All updated";

     Comment(str);
     Print(str);

     return(0);
}


quote_write はユーザー定義の関数です。CSVファイルへの書込みを行います。
主要28通貨ペアの書込みをquote_write 関数で行っています。quote_write 関数を修正することにより、不要な通貨ペアの書込みを削することもできますし、新しい通貨ペアの書込みを追加することもできます。

Comment 関数はMT4の関数でチャートの左上に文字列を表示します。
Print 関数はMT4の関数でコンソールログを表示します。
表示している内容は書込みが完了した時の All updated という表示です。
すべての通貨ペアの最新日付データが一致した時に書込み完了と判断しています。

(5) outputCSV関数

datetime outputCSV(string symbol)
{
     int handle;
     bool ret;

     handle=FileOpen(symbol+PERIOD_D1+".csv",FILE_CSV|FILE_WRITE,',');
     if(handle<1) return(0);

     for(int i=0;i < OutputBars;i++)
     {
       ret = FileWrite(handle,
                     TimeToStr(iTime(symbol,PERIOD_D1,i),TIME_DATE),
                     TimeToStr(iTime(symbol,PERIOD_D1,i),TIME_MINUTES),
                     iOpen(symbol,PERIOD_D1,i),
                     iHigh(symbol,PERIOD_D1,i),
                     iLow(symbol,PERIOD_D1,i),
                     iClose(symbol,PERIOD_D1,i),
                     iVolume(symbol,PERIOD_D1,i) );

       if(ret<1) return(0);
     }

     FileClose(handle);

     return(iTime(symbol,PERIOD_D1,0));
}


outputCSV 関数の入力引数はUSDJPY等の通貨ペアです。
outputCSV 関数の戻り値は書込みをした最新の日時です。
outputCSV 関数は通貨ペアを与えられて1000本のレコードをファイルに書込みます。ファイル名は例えばUSDJPYならばUSDJPY1440.csv になります。1440は1日を分であらわすと1440分になるからです。出力フォルダはMT4の場合は固定で experts フォルダの files フォルダになります。

この関数で使用しているMT4の価格に関する関数は下記のとおりです。
iTime 日時を返します。
iOpen 始値を返します。
iHigh 高値を返します。
iLow 終値を返します。
iClose 終値を返します。
iVolume 出来高を返します。
例えば終値であれば iClose (通貨ペア, 周期, シフト値) という形式です。シフト値はゼロから始まる整数でゼロが最新で数が大きくなるほど過去に遡ります。つまり何本前の価格かをシフト値で指定します。

この関数で使用しているMT4のファイルに関する関数は下記のとおりです。
FileOpenFileWriteFileClose

この関数で使用しているMT4の予約語は下記のとおりです。
PERIOD_D1 1日の期間をあらわします。具体的な数値は1440です。

MQL4 のホームページは ここです


エクセルファイルです。

    ダウンロード


前へ   次へ

Posted by vbafan at 03:08 | この記事のURL
この記事のURL

×

この広告は30日以上新しい記事の更新がないブログに表示されております。