【问题标题】:mql4 check if order exists executed multiple timesmql4 检查订单是否存在执行多次
【发布时间】:2017-12-18 09:40:24
【问题描述】:

我正在使用此代码检查我的代码中是否存在价格 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();
}}

【问题讨论】:

    标签: mql4


    【解决方案1】:

    每当您尝试将 OrderTakeProfit() 值与其他一些 double 值进行比较时 - 请记住舍入和浮点表示。

    例如如果您需要将 0.10 与您认为是 0.10 的另一个 double 进行比较 - 您可能会惊讶于 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;
    }
    

    【讨论】:

    • 你可以规范化,但我认为规范化只有在发送订单时才是必要的。更好的是确保两个双打相差不到半个刻度(甚至十分之一刻度)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2015-09-09
    • 1970-01-01
    相关资源
    最近更新 更多