Почему OrderModify() возвращает код ошибки 130?
У меня есть код модификации ордера для моих заказов на открытом рынке, который Error 130
в MT4
Журнал, я знаю, что это давняя проблема, и есть несколько источников, на которые я смотрел, как здесь, так и по всей сети - однако, похоже, ничего не работает.
1) у меня есть NormalizeDouble()
вылечить все, что имеет двойные функции на MQL4
т.е. цены и т. д. - это для того, чтобы количество цифр после запятой соответствовало паре ее торговли; некоторые из них 3 цифры, другие 5 цифр.
2) pnlPoints
& stopPoints
рассчитываются с использованием _Period
таким образом, количество точек остается неизменным независимо от количества цифр после десятичной точки графика, на котором установлен советник
3) Я знаю о наличии MarketInfo( Symbol(), MODE_STOPLEVEL )
& hasd добавил это к MarketInfo( Symbol(), MODE_SPREAD )
некоторым stoplevel
расчет.
4) Я хочу 100 баллов "В деньгах", прежде чем заказ будет изменен на безубыток.
5) Я использую пятизначный брокер, но, как вы знаете, некоторые пары, такие как EURJPY
будет иметь три цифры. Это исправлено _Period
& NormalizeDouble()
Funtions.
/*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());
}
}
}
}
Большое спасибо и привет.
1 ответ
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, ... )
соответственно, прежде чем делать какие-либо запросы в текущее состояние db.Pool
записи с { OrderTakeProfit() | OrderStopLoss() }
, но принцип очевиден.
Факты имеют значение, и если самооценочные значения соответствуют условиям и условиям брокера и продолжают получать ERR_INVALID_STOPS
, попросите своего брокера дать должное объяснение любого наблюдаемого несоблюдения.