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分