基礎から学ぶシステムトレード
シストレブログ人気ランキング  

シストレ徹底攻略シストレマスターへの道ワールド・トレーディング・エッジ基礎から学ぶシステムトレードシストレニュースシストレツールシストレナビTOPへ

 

2012年02月28日(火)

コピートレードのプログラミング(7) [MQL5]



前回の記事では、オープンポジション情報をファイル出力させるMT5のプログラムを紹介しました。

MT4のEAでは、tick単位でプログラムが実行されるだけですが、MT5のEAでは、tick単位だけでなく、一定時間間隔でプログラムを実行させることもできます。例えば、1秒間隔や10秒間隔で決まったプログラムを実行させたい場合に便利です。

そのためには、まず、OnTick()の代わりにOnTimer()と書きます。そして、何秒間隔でプログラムを実行するかを指定します。

その指定にはEventSetTimer()という関数を使い、これを初期化関数であるOnInit()中に記述します。実行間隔は秒単位で指定し、EventSetTimer(1)と書くと、1秒間隔で実行することになります。

また、プログラムの後処理としてそのタイマーを無効にするためにEventKillTimer()を、後処理関数であるOnDeinit()中に記述します。

次のプログラムは、tickとは関係なく1秒単位でオープンポジションを調べて、その合計ロット数をファイルに出力するものです。

// 初期化関数
int OnInit()
{
EventSetTimer(1);
return(0);
}

// 後処理関数
void OnDeinit(const int reason)
{
EventKillTimer();
}

// タイマー関数
void OnTimer()
{
// ロット数を保存するための変数
static double oldlots = 0;

// オープンポジションの合計ロット数
double lots = 0.0;
if(PositionSelect(_Symbol))
{
lots = PositionGetDouble(POSITION_VOLUME);
if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) lots = -lots;
}
// ロット数に変化がない場合
if(lots == oldlots) return;

// ファイルへ出力
int hFile = FileOpen(_Symbol+".txt", FILE_WRITE|FILE_CSV|FILE_ANSI);
if(hFile == -1) return;
FileWrite(hFile, lots);
FileClose(hFile);
// ロット数を更新
oldlots = lots;
}

tick単位の場合、1秒間に何度も実行される場合もあれば、何秒間も実行されない場合もあり、実行間隔が不規則になります。

もし、チャートとは別の通貨ペアのポジションも出力させたい場合、ポジションが変わっても、チャート上の通貨ペアのtickが来るまで、ファイル出力がされないことがあります。そういうケースでは、tickとは関係なく、一定間隔でポジションを出力させた方がデータの遅れが少なくてよいでしょう。


>>“基礎から学ぶシステムトレード”全記事バックナンバーはこちらから




Posted at 14時17分


ページのトップへ ページのトップへ

Sponsor AD

2012/2

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

プロフィール

豊嶋久道

2003年よりFX取引を始め、システムトレードの道へ。最近ではFXオプション取引も含めたトレーディングシステムの研究を行っている。システムトレードを基礎から正しく理解するための情報を発信する予定。

PHOTO

実際の相場におけるランダムウォーク

実際の相場におけるランダムウォーク

カテゴリーリスト

最近の記事

検索


当サイトコメントについて

当コメントは情報提供のみを目的として作成されたものであり、投資に関してはご自身でご判断くださいますようお願い致します。また、当資料は著作物であり著作権法により保護されております。無断で全文または一部を転載することはできません。

RSS1.0

[Login]


powered by a-blog
Copyright (C) 2008 PhiConcept,Inc. All rights reserved.