mql4 проверить, существует ли ордер, выполненный несколько раз

Я использую этот код, чтобы проверить, существуют ли ордера по цене buy1 и sell1 в моем коде. Почему-то некоторые заказы выполняются дважды. Не должно быть, потому что я проверяю, есть ли открытый ордер с таким же тейк-профитом. Кто-нибудь может увидеть, что не так?

bool CheckBuyOrder1(double buy1_tp){
for( int i = 0 ; i < OrdersTotal() - 1 ; i++ ) {
  OrderSelect( i, SELECT_BY_POS, MODE_TRADES );
  if( OrderTakeProfit() == buy1_tp && OrderComment() == "buy" ) 
return(true);
}
return(false);
}

bool CheckSellOrder1(double sell1_tp){
for( int i = 0 ; i < OrdersTotal() - 1 ; i++ ) {
  OrderSelect( i, SELECT_BY_POS, MODE_TRADES );
  if( OrderTakeProfit() == sell1_tp && OrderComment() == "sell" ) 
return(true);
}
return(false);
}

int totalOrders = OrdersTotal();

void OnTick()
{
if(totalOrders != OrdersTotal()){
double vbid    = MarketInfo("EURUSD",MODE_BID);
double bid = NormalizeDouble(vbid, 3);
double market_buy_tp = bid;
double buy1= bid + 0.002;
double buy1_tp= bid + 0.003;
if(CheckOpenOrders1(market_buy_tp)==false && CheckBuyOrder1(buy1_tp)==false){
int ticket9=OrderSend(Symbol(),OP_BUYSTOP,Lots,buy1,MaxSlippage,0,buy1_tp,"buy",16380,0,clrGreen);
}

double market_sell_tp = bid;
double sell1 = bid - 0.003;
double sell1_tp= bid - 0.004;
if(CheckOpenOrdersSell1(market_sell_tp)==false && CheckSellOrder1(sell1_tp)==false ){
int ticket19=OrderSend(Symbol(),OP_SELLSTOP,Lots,sell1,MaxSlippage,0,sell1_tp,"sell",16380,0,clrGreen);
}
totalOrders = OrdersTotal();
}}

person Sander    schedule 18.12.2017    source источник


Ответы (1)


Всякий раз, когда вы пытаетесь сравнить значение OrderTakeProfit() с другим значением double, помните об округлении и представлении с плавающей запятой.

Например. если вам нужно сравнить 0,10 с другим double, которое, по вашему мнению, равно 0,10, вы можете быть удивлены, узнав, что 0,10 равно 0,09(9)6 или 0,10(0)4.

Именно поэтому иногда вы можете не найти такой заказ.

double o = Point / 2;    // initialize in OnInit(), declare in global vars
...

bool CheckOrderBuy( double tp ){
   for ( int i = OrdersTotal() - 1; i >= 0; i-- ){
         if ( !OrderSelect( i, SELECT_BY_POS ) )continue;
         if (  fabs( OrderTakeProfit() - tp ) <  o
            &&       OrderType()              == OP_BUY
               ) return true;
   }
   return false;
}
person Daniel Kniaz    schedule 18.12.2017
comment
Вы можете нормализовать, но я думаю, что нормализация необходима только при отправке заказов. лучше убедиться, что два двойника отличаются менее чем на половину тика (или даже на десятую долю тика) - person Daniel Kniaz; 18.12.2017