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

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

 

2012年04月03日(火)

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



4月になりました。入学、入社、異動など色々と環境の変わる時期ですね。よく4月から新しく連載が始まるケースが多いのですが、この連載は新年度を無視して淡々と進みます。行き当たりばったりですみません(^^;

さて、前回までコピー先のEAの基本的なロジックを説明してきました。あとは、実際にオーダーを送信するコードを追加してそれぞれのブロックを組み合わせれば、EAの完成です。

extern int MAGIC = 9999;   // マジックナンバー
extern int Slippage = 2; // スリッページ

int start()
{
// ファイルの読み込み
int handle = FileOpen("Position¥¥"+Symbol()+".txt", FILE_CSV|FILE_READ);
if(handle == -1) return(0);
double remote_lots = FileReadNumber(handle);
FileClose(handle);

// ポジション情報の取得
double local_lots = OpenLots();

if(IsTradeAllowed() == false) return(1);
double slippage = Slippage;
if(Digits == 3 || Digits == 5) slippage *= 10;

//売買オーダー
if(local_lots == 0 && remote_lots > 0)
{
int ticket = OrderSend(Symbol(), OP_BUY, remote_lots, Ask, slippage, 0, 0, "", MAGIC);
}
if(local_lots == 0 && remote_lots < 0)
{
ticket = OrderSend(Symbol(), OP_SELL, -remote_lots, Bid, slippage, 0, 0, "", MAGIC);
}

// 決済オーダー
if(local_lots != 0 && (remote_lots == 0 || remote_lots*local_lots < 0))
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS) == false ) break;
if(OrderSymbol() != Symbol() || OrderMagicNumber() != MAGIC) continue;
if(OrderType() == OP_BUY || OrderType() == OP_SELL)
{
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slippage);
}
}
}
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() || OrderMagicNumber() != MAGIC) continue;

if(OrderType() == OP_BUY) lots += OrderLots();
if(OrderType() == OP_SELL) lots -= OrderLots();
}
return(lots);
}

いくつか補足しておきます。

外部変数として、マジックナンバーMAGICと、スリッページSlippageが追加されています。

MAGICは売買オーダーOrderSend()、ロット数取得、決済オーダーのポジションを探す際に利用します。

Slippageは固定でいいのですが、価格が小数点以下4桁(クロス円は2桁)の業者と、5桁(クロス円は3桁)の業者があるので、5桁の場合、それを10倍してOrderSend()、OrderClose()に渡しています。

オーダー送信する前にIsTradeAllowed()がfalseを返した場合、トレードができない状態なので、オーダー送信は行わず、リターンしています。

売買オーダー送信にはOrderSend()関数を呼び出し、戻り値をticketという変数に代入しています。

決済オーダー送信では、OrderSelect()で買いポジションと売りポジションを選択してOrderClose()を実行します。

以上が単一ロットでの売買を対象としたコピートレードのプログラムです。

次回は、売買ロット数が増えたり、減ったりするケースについてみていきます。


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




Posted at 14時23分


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

Sponsor AD

2012/4

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          

プロフィール

豊嶋久道

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

PHOTO

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

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

カテゴリーリスト

最近の記事

検索


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

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

RSS1.0

[Login]


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