この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())
{
// 買いの場合、ビッド価格がオープンプライス + ブレイクイーブンピップス以上で、ストップロスがオープンプライス未満であることが条件です。売りの場合はその逆。
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);
}
}
}
試してみませんか?