我的公开市场订单有一个订单修改代码,在Error 130
期刊中有 MT4
,我知道这是一个古老的问题&我看过几个来源,包括这里和整个网络 - 然而,似乎没有任何工作。
1)我有 NormalizeDouble()
-cured在MQL4
上具有双重功能的所有内容,即价格等 - 这是为了确保小数点后面的位数是与其交易一致;一些是3位数,其他是5位数。
2)pnlPoints
& stopPoints
使用 _Period
进行计算,因此无论图表中小数点后面的数字位数是多少,点数都是一致的
3)我知道 MarketInfo( Symbol(), MODE_STOPLEVEL )
&已将此添加到 MarketInfo( Symbol(), MODE_SPREAD )
,将其添加到 stoplevel
计算中。
4)我想要100分"在钱"在订单被修改为盈亏平衡之前。
5)我使用五位数的经纪人,但正如您所知,像 EURJPY
这样的对将有三位数。这可以通过 _Period
&更正 NormalizeDouble()
功能。
/*Breakeven Order Modification*/
for(int b = OrdersTotal()-1;b>=0;b--)
{
if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)==true)
{
double aBidPrice = MarketInfo(Symbol(),MODE_BID);
double anOpenPrice = OrderOpenPrice();
double aNewTpPrice = OrderTakeProfit();
double aCurrentSL = OrderStopLoss();
double aNewSLPrice = anOpenPrice;
double pnlPoints = NormalizeDouble(aBidPrice - anOpenPrice/_Point,Digits);
double stopPoints = NormalizeDouble(aBidPrice - aNewSLPrice/_Point,Digits);
int stopLevel = int(MarketInfo(Symbol(),MODE_STOPLEVEL)+MarketInfo(Symbol(),MODE_SPREAD));
int aTicket = OrderTicket();
if(OrderType() == OP_BUY)
if(stopPoints > stopLevel)
if(aTicket > 0)
if(pnlPoints > breakeven)
if(aNewSLPrice == aCurrentSL)continue;
{
BuyMod = OrderModify(OrderTicket(),NormalizeDouble(anOpenPrice,Digits),NormalizeDouble(aNewSLPrice,Digits),NormalizeDouble(aNewTpPrice,Digits),0,buycolor);
SendMail("Notification of Order Modification for Ticket#"+IntegerToString(OrderTicket(),10),"Good news! Order Ticket#"+IntegerToString(OrderTicket(),10)+"has been changed to breakeven");
if(BuyMod = false || aTicket == 0)
{
Print("Order modification for ticket #"+IntegerToString(aTicket,10)+"Error code",GetLastError());
}
}
}
}
for(int s = OrdersTotal()-1; s>=0; s--)
{
if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES)==true)
{
double anAskPrice = MarketInfo(Symbol(),MODE_ASK);
double anOpenPrice = OrderOpenPrice();
double aNewTpPrice = OrderTakeProfit();
double aCurrentSL = OrderStopLoss();
double aNewSLPrice = anOpenPrice;
double pnlPoints = NormalizeDouble(anOpenPrice - anAskPrice/_Point,Digits);
double stopPoints = NormalizeDouble(aNewSLPrice - anAskPrice/_Point,Digits);
int stopLevel = int(MarketInfo(Symbol(),MODE_STOPLEVEL)+MarketInfo(Symbol(),MODE_SPREAD));
int aTicket = OrderTicket();
if(OrderType()== OP_SELL)
if(stopPoints > stopLevel)
if(aTicket > 0)
if(pnlPoints > breakeven)
if(aNewSLPrice == aCurrentSL)continue;
{
SellMod = OrderModify(OrderTicket(),NormalizeDouble(anOpenPrice,Digits),NormalizeDouble(aNewSLPrice,Digits),NormalizeDouble(aNewTpPrice,Digits),0,sellcolor);
SendMail("Notification of Order Modification for Ticket#"+IntegerToString(OrderTicket(),10),"Good news! Order Ticket#"+IntegerToString(OrderTicket(),10)+"has been changed to breakeven");
if(SellMod = false || aTicket == 0)
{
Print("Order modification for ticket #"+IntegerToString(aTicket,10)+"Error code",GetLastError());
}
}
}
}
非常感谢&问候。
答案 0 :(得分:0)
MQL4
错误130
代表 ERR_INVALID_STOPS
因此,下一个最佳步骤是检查您的OrderModify()
调用,添加实际值的自动记录,这些记录将放在服务器端发送的指令中。
设计一个包装函数,其标准OrderModify()
具有完全相同的调用签名:
int LogAndSendOrderModify( int const aTicketNUMBER,
double const anOrderOpenPRICE,
double const aStopLossPRICE,
double const aTakeProfitPRICE,
datetime const anExpirationTIME,
color const aMarkerArrowCOLOR
){ ... }
...并在OrderModify()
之前包含一段代码,将每个值准确记录到日记中。
PrintFormat( "[%s]: TKT:[%d]OP:[%15.8f]SL:[%15.8f]TP:[%15.8f]SL_STOPZONE:[%d]TP_STOPZONE:[%d]SL_FREEZEZONE:[T.B.D.]TP_FREEZEZONE:[T.B.D.]",
__FUNCTION__,
aTicketNUMBER,
anOrderOpenPRICE,
aStopLossPRICE,
aTakeProfitPRICE,
(int) ( MathPow( 10, _Digits ) * ( Bid - aStopLossPRICE ) ),
(int) ( MathPow( 10, _Digits ) * ( aTakeProfitPRICE - Bid ) )
);
对于 ??_FREEZEZONE
,您需要提供相似的值,但需要相应地调用OrderSelect( aTicketNUMBER, ... )
,然后才能将任何请求转换为{{1的当前状态记录db.Pool
,但原则很明显。
事实重要,如果自我报告的值符合Broker Terms&条件仍然保持{ OrderTakeProfit() | OrderStopLoss() }
,向您的经纪人询问是否发现任何违规行为。