如何避免从NormalizeDouble和OrderSend待处理订单(SELLLIMIT,BUYLIMIT)中取整得到错误-1无效止损

问题描述 投票:0回答:1

[在向OrderSend挂起的订单(BUYLIMIT,SELLLIMIT)出现错误-1无效止损时,请告诉我如何解决问题。

也告诉我BUYLIMIT和SELLLIMIT的规则。

简单的代码如下:

`

double  digit = MarketInfo(symbol,MODE_DIGITS);
    POPRICE  = NormalizeDouble(BBMVAL[0],digit);
    TPPRICE  = NormalizeDouble(POPRICE + (30*point),digit)
    SLPRICE  = NormalizeDouble(POPRICE - (30*point),digit)

    ticket1=OrderSend(symbol,OP_BUYLIMIT,0.1, POPRICE,Slippage,SLPRICE,TPPRICE,BUYLIMIT,magic,(TimeCurrent()+(3600*2)),CLR_NONE);

          Sleep(10);
          while(IsTradeContextBusy()) Sleep(100);
          RefreshRates();
          if(ticket1 < 0)
               {
                  SendMail
                     (
                        symbol+"-"+ IntegerToString(Period())+"-" + "FAILED-BUYLIMIT ", 
                        symbol+"-"+ IntegerToString(Period())+"-" + "FAILED-BUYLIMIT "+"(#PO-Price:"+POPRICE+"#TP:"+TPPRICE++"#SL:"+SLPRICE+"#RespID:"+ticket1+"#Status: "+ErrorDescription(GetLastError())+")"          
                     );
                  ticket1 = 0;   
               }


          if (ticket1 > 0)
               {
                   b_Status = 1;
                   SendMail
                      (
                         symbol+"-"+ IntegerToString(Period())+"-" + "SUCCESSED-BUYLIMIT ", 
                         symbol+"-"+ IntegerToString(Period())+"-" + "SUCCESSED-BUYLIMIT "+"(#PO-    Price:"+POPRICE+"#TP:"+TPPRICE+"#SL:"+SLPRICE+"#RespID:"+ticket1+"#Status: "+ErrorDescription(GetLastError())+")"         
                      );
                   ticket1 = 0;   
               }

目标是:

  1. 如果货币对EURUSD为5位数,如何使SLPRICE,POPRICE,TPPRICE始终为5位数。有时是5位数,有时是4位数的舍入。使用NormalizeDouble是否正确?如何避免综述。

  2. 当失败(tiket1 <0)时,错误为-1(无效停止),此错误的真正原因是什么。有时成功,有时失败。卖出限制和买入限制的规则是什么。当失败时,有许多电子邮件发送到电子邮件地址。如何也避免这个问题。

非常感谢您。

mql4
1个回答
0
投票

[预计5位小数点后有4位价格是完全可以的,但是由于double是浮点数,所以有时您没有得到您期望的确切价格,

例如:假设您正在计算多头交易的目标价1.10000 + 0.0020 = 1.10020(预期),但可能会得到类似1.10020001的信息,在这种情况下,价格水平被拒绝,从而导致错误。这就是为什么价格正常化很重要的原因。

在某些对中,您可能会发现NormalizeDouble()有时会提供错误的值,在这种情况下,请使用以下函数。

double NP(const double price)
{
   double tickSize = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE);
   return (MathRound(price / tickSize) * tickSize );
}

关于获得许多电子邮件:您可以限制每个时间段的电子邮件数量。

我在这里做到了,这样每条新蜡烛您会收到1封电子邮件:

if(ticket1 < 0)
{
   static datetime prevTime = 0;

   if(Time[0] > prevTime)
   {
      SendMail
      (
         symbol + "-" + IntegerToString(Period()) + "-" + "FAILED-BUYLIMIT ",
         symbol + "-" + IntegerToString(Period()) + "-" + "FAILED-BUYLIMIT " + "(#PO-Price:" + POPRICE + "#TP:" + TPPRICE++"#SL:" + SLPRICE + "#RespID:" + ticket1 + "#Status: " + ErrorDescription(GetLastError()) + ")"
      );
      prevTime = Time[0];
   }
   ticket1 = 0;
}

© www.soinside.com 2019 - 2024. All rights reserved.