こんにちは、トレーダーの皆さん!今日は、MetaTrader 4用の小さなEA(エキスパートアドバイザー)の魅力についてお話しします。このEAの特徴は、オーダー数をカウントする機能です。
int OrdersCounter() { int counter=0; //--- for(int i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i,SELECT_BY_POS)) if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) // このEAによって開かれたオーダーか確認 { //--- ブレイクイーブンが発生したか確認 /* 買いの場合は、ストップロスがオープン価格以上であることが条件です。この実装はペンディングオーダーには適していません。*/ double XBreakeven = OrderType()==OP_BUY ? OrderStopLoss() >= OrderOpenPrice() : OrderStopLoss() <= OrderOpenPrice(); if(!XBreakeven) // ブレイクイーブンまたはトレーリングストップが発生していない場合 { counter++; // ポジションをカウント } } return counter; }
この関数では、ストップロスがオープン価格以上(買いの場合)またはオープン価格未満(売りの場合)でないオーダーだけをカウントしています。言い換えれば、ブレイクイーブンやトレーリングストップで保護されていないオーダーをカウントしています。
double XBreakeven = OrderType()==OP_BUY ? OrderStopLoss() >= OrderOpenPrice() : OrderStopLoss() <= OrderOpenPrice(); if(!XBreakeven) // ブレイクイーブンやトレーリングストップが発生していない場合
このカウンターを使って、最大ポジション数を制限します。ここでは、同時に1つのオーダーしか持たないように設定しています。
if(OrdersCounter()<MaximumOrders)
ブレイクイーブンが発生するたびに、この関数はそのカウントを無視します。したがって、例として1つのポジションしか持っていなければ、カウントはゼロになり、次のオーダーを開くことができます。
また、ブレイクイーブン機能を作成しなければ、これは不可能でした。
void BreakEvenFunction() { //--- for(int i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i,SELECT_BY_POS)) if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) { // 買いの場合は、Bidがオープン価格+ブレイクイーブンpips以上、売りの場合はその逆 double xHybrid = OrderType()==OP_BUY ? (Bid>OrderOpenPrice()+BreakevenPips*_Point && OrderStopLoss()<OrderOpenPrice()) : (Ask<OrderOpenPrice()-BreakevenPips*_Point && OrderStopLoss()>OrderOpenPrice()); /* 買いの場合はストップロスがオープン価格以上、売りの場合はその逆が条件 */ if(xHybrid) { bool modfy = OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,clrNONE); } } }
これを試してみますか?