[在向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;
}
目标是:
如果货币对EURUSD为5位数,如何使SLPRICE,POPRICE,TPPRICE始终为5位数。有时是5位数,有时是4位数的舍入。使用NormalizeDouble是否正确?如何避免综述。
当失败(tiket1 <0)时,错误为-1(无效停止),此错误的真正原因是什么。有时成功,有时失败。卖出限制和买入限制的规则是什么。当失败时,有许多电子邮件发送到电子邮件地址。如何也避免这个问题。
非常感谢您。
[预计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;
}