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

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

 

2012年02月13日(月)

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



前回の続きです。

コピー元のEAで、ポジションが変わったときだけ、ポジション情報をファイルに出力させるにはどうすればよいか、ということでしたね。

そのためには、ロット数を保存する変数を1個用意します。例えば、

double oldlots = 0;

とします。ここではポジションがないのを初期状態とするので、0に初期化しています。

そして、ロット数をlotsに算出した直後に oldlots とlotsを比較して、同じであれば何もせずにリターンします。

if(lots == oldlots) return(0);

もし、oldlotsとlotsが違う値であればロット数が変わったということなので、そのデータをファイルに出力します。

そして、最後に

oldlots = lots;

として、oldlotsを更新します。

ロジックとしてはこれでいいのですが、一つ問題があります。start()関数は価格が変わるたびに実行されるので、このままではoldlotsが毎回0に初期化されることになります。その結果、ロット数が0以外の場合、毎回ファイル出力することになります。

それを防ぐためには、oldlotsの宣言時に「static」というキーワードをつけてやります。

static double oldlots = 0;

すると、このEAを挿入した直後だけ変数oldlotsが初期化され、その後は、前に実行した値を保持するようになります。これで、ロット数が変わったときだけファイル出力するようになります。

全体のプログラムを以下に示します。

int start()
{
// ロット数を保存するための変数
static double oldlots = 0;

// オープンポジションの合計ロット数
double lots = 0.0;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS) == false) break;
if(OrderSymbol() != Symbol()) continue;
if(OrderType() == OP_BUY) lots += OrderLots();
if(OrderType() == OP_SELL) lots -= OrderLots();
}
// ロット数に変化がない場合
if(lots == oldlots) return(0);

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

return(0);
}

次回はコピー元がMT5の場合について説明します。


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




Posted at 17時13分


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

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

ランダムウォークとランダムトレード(6)

ランダムウォークとランダムトレード(6)

カテゴリーリスト

最近の記事

検索


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

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

RSS1.0

[Login]


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