当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(无效的停止),此错误的真正原因是什么。有时成功,有时失败。卖出限制和买入限制的规则是什么。 当失败时,有许多电子邮件发送到电子邮件地址。怎么也避免这个问题。
非常感谢您。
答案 0 :(得分: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;
}