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

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

 

2012年04月10日(火)

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



今回は、コピー元のMT4で決まったロット数のポジションをオープンしては、決済することを繰り返すだけでなく、オープンポジションのロット数が段階的に増えるケースにも対応したコピー先のEAを作ってみます。但し、ポジションを決済する場合は、段階的にロット数を減らすのではなく、一度にすべてのポジションを決済するという仕様にしておきます。

前回と同じようにコピー元のMT4のポジションがremote_lotsに、コピー先のMT4のポジションがlocal_lotsという変数に代入されていることとします。

まず、決済オーダーから見ていきます。ポジションの決済は1度に行うという条件だったので、local_lotsが0ではなく、かつ、remote_lotsが0、あるいはremote_lotsとlocal_lotsの符号が違う場合に決済するというロジックで問題ありません。前回のプログラムと同じです。

// 決済オーダー
if(local_lots != 0 && (remote_lots == 0 || remote_lots*local_lots < 0))
{
//決済オーダーを送信するコード
}

次に売買オーダーについてですが、ここでは、local_lotsが0の場合だけでなく、remote_lotsとlocal_lotsが異なる場合にもポジションを追加することになります。

そのために、もう一つ変数trade_lotsを用意し、

 double trade_lots = remote_lots - local_lots;

のようにremote_lotsとlocal_lotsの差を計算しておきます。

例えば、remote_lots=0.2、local_lots=0.1の場合、trade_lots=0.2-0.1=0.1となります。この場合、コピー先で0.1ロットの買いポジションを追加する必要があります。

また、remote_lots=-0.3、local_lots=-0.1の場合、trade_lots=-0.3-(-0.1)=-0.2となり、コピー先で0.2ロットの売りポジションを追加する必要があります。

つまり、trade_lotsがプラスの場合、買いオーダーを送信、マイナスの場合、売りオーダーを送信すればよいということになります。従って、このロジックは、

//売買オーダー
double trade_lots = remote_lots - local_lots;

if(trade_lots > 0)
{
//買いオーダーを送信するコード
}
if(trade_lots < 0)
{
//売りオーダーを送信するコード
}

と書けます。但し、決済オーダーと売買オーダーを実行する順序に注意する必要があります。

前回のように売買オーダー、決済オーダーの順に処理すると、ドテン売買の場合にもtrade_lots>0またはtrade_lots<0の条件に一致してしまい、売買オーダーを実行してしまいます。

ドテン売買の場合、一旦、ポジションを決済させないといけないので、決済オーダーのコード先に書き、決済の条件にマッチしたら、決済後にリターンするようにしておきます。これで、売買オーダーの条件分岐時には、ドテン売買の状態ではなくなります。

全体のプログラムは次のようになります。

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 || 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 trade_lots = remote_lots - local_lots;
if(trade_lots > 0)
{
int ticket=OrderSend(Symbol(),OP_BUY,trade_lots,Ask,slippage,0,0,"",MAGIC);
}
if(trade_lots < 0)
{
ticket=OrderSend(Symbol(),OP_SELL,-trade_lots,Bid,slippage,0,0,"",MAGIC);
}
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);
}

次回は、ロット数を段階的に減らすケースにも対応させてみます。


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




Posted at 11時14分


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

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

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

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

カテゴリーリスト

最近の記事

検索


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

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

RSS1.0

[Login]


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