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

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

 

2012年03月06日(火)

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



コピートレードを題材にしたMQL4/MQL5のプログラミングの話を続けます。

これまで作成してきたコピー元のプログラム(MT4用とMT5用)ですが、2点ほど手直しを行いたいと思います。

まず1点目は、ファイルの出力先です。

前回紹介したプログラムでは、一つの通貨ペアのポジションを一つのファイルに出力する仕様になっていました。

この場合、トレードする通貨ペアが多くなると、出力するファイルも多くなってしまい、コピー先から参照するためのシンボリックリンクを張る手間が増えてしまいます。

その手間をちょっと省略するために、ポジションを出力するファイルをフォルダの下にまとめておき、コピー先のMT4からそのフォルダにリンクを張るという方法が考えられます。

例えば、コピー元のデータの出力先を「Position」というフォルダの下にしたい場合、それぞれのプログラムのOpenFile()関数のファイル名のところを以下のように書き換えます。MT4の場合、

int hFile = FileOpen("Position¥¥"+Symbol()+".txt", FILE_WRITE|FILE_CSV);

MT5の場合、

int hFile = FileOpen("Position¥¥"+_Symbol+".txt", FILE_WRITE|FILE_CSV|FILE_ANSI);

となります。「Position」の後に「¥」を二つ続けるところに注意してください。

すると、EURUSD.txt、USDJPY.txt などのファイルが「Position」というフォルダの下に出力されることになります。コピー先のMT4からこのフォルダへリンクを張れば、フォルダの下のすべてのファイルもコピー先のMT4から参照することができます。

もう一つの修正点は、合計ロット数を計算する部分を関数化しておくということです。この部分は、MT4とMT5で明らかに方法が違う上に、他のプログラムでも流用できる処理です。関数にしておくと何かと便利だと思います。

以上2点を修正したコピー元のプログラムを改めて掲載します。

MT4の場合

int start()
{
// ロット数を保存するための変数
static double oldlots = 0;
// オープンポジションの合計ロット数
double lots = OpenLots();
// ロット数に変化がない場合
if(lots == oldlots) return(0);

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

return(0);
}

// オープンポジションの合計ロット数
double OpenLots()
{
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();
}
return(lots);
}

MT5の場合

void OnTick()
{
// ロット数を保存するための変数
static double oldlots = 0;
// オープンポジションの合計ロット数
double lots = OpenLots();
// ロット数に変化がない場合
if(lots == oldlots) return;

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

// オープンポジションの合計ロット数
double OpenLots()
{
double lots = 0.0;
if(PositionSelect(_Symbol))
{
lots = PositionGetDouble(POSITION_VOLUME);
if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) lots = -lots;
}
return(lots);
}

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




Posted at 17時11分


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

Sponsor AD

2012/3

        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 30 31

プロフィール

豊嶋久道

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

PHOTO

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

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

カテゴリーリスト

最近の記事

検索


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

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

RSS1.0

[Login]


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