Безубыток - OrderModify() FAILED 130; message: invalid stops

 

Код такой:

// выполнить безубыток void makeTrailingStop() { RefreshRates(); int _OrdersTotal = OrdersTotal(), err = 0, ticket; datetime ctm; if(TrailingStop < 1) return; for ( int z = _OrdersTotal - 1; z >= 0; z -- ) { if ( !OrderSelect( z, SELECT_BY_POS ) ) { err = GetLastError(); Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", err, "; mess: " , ErrorDescription(err)); continue; } // проверить, не закрыт ли ордер ctm = OrderCloseTime(); if (ctm > 0) continue; //Print("Время if ( OrderSymbol() == Symbol() ) { if (OrderType() == OP_BUY) // открыта длинная позиция { // проверим - может можно/нужно уже трейлинг стоп ставить? if((Bid - OrderOpenPrice()) > (Point * TrailingStop)) { if(OrderStopLoss() < (Bid - Point * TrailingStop)) { Print("OrderModify: OP_BUY #", OrderTicket()); //Print("Swap #", OrderTicket(), " ", OrderS); int spread=MarketInfo(Symbol(), MODE_SPREAD); Print("spread: ", spread); OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit() //+ Point * TrailingStop , 0); PrintErrMessage("OrderModify() FAILED "); } } } if (OrderType() == OP_SELL) // это короткая позиция { // проверим - может можно/нужно уже трейлинг стоп ставить? if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) { if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss()==0)) { Print("OrderModify: OP_SELL #", OrderTicket()); OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit() //- (Point * TrailingStop) , 0); PrintErrMessage("OrderModify() FAILED "); } } } } } }

В какой-то конфигурации он даже чего-то модифицировал, но практически в большинстве случаев вызов OrderModify() даёт ошибку 130, т.е. неверные стопы.

Пример-то слизан из статьи "Пример создания эксперта" на 'Пример создания эксперта', но не работает :(

Какие стопы нужно верно поставить?

 

Всё в коде выполнено в соответствии с рекомендацией:

//для поиска и модификации позиций покупки используетя Bid
//для поиска и модификации позиций продаж используется Ask

Но всё равно выдаётся "USDCHF,M30: OrderModify() FAILED 130; message: invalid stops" :(

Есть ещё такой фактор, в MT4 написано при изменении ордера ручками: "Вы можете установить Стоп лосс и Тейк профит не ближе 3 пунктов от рыночной цены", т.е. это зависит от спрэда.

Я пробовал и так для BUY:

if (OrderType() == OP_BUY) // открыта длинная позиция { // проверим - может можно/нужно уже трейлинг стоп ставить? if((Bid - OrderOpenPrice() - 4) > (Point * TrailingStop)) { if(OrderStopLoss() < (Bid - Point * TrailingStop)) { Print("OrderModify: OP_BUY #", OrderTicket()); //Print("Swap #", OrderTicket(), " ", OrderS); int spread=MarketInfo(Symbol(), MODE_SPREAD); Print("spread: ", spread); OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop - 4, OrderTakeProfit() //+ Point * TrailingStop // CHV , 0); PrintErrMessage("OrderModify() FAILED "); } } }

Результат тот же :(.

Хочу попросить разработчиков с MetaQuotes Software дать расширенные комментарии по OrderModify с рабочими примерами, информации не хватает.

[Deleted]  

Может стандартный трелинг поможет

if(TrailingStop>0)  
{                 
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
 return(0);
}
}
}
if(TrailingStop>0)  
{                 
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
 return(0);
}
}
}
 
основная причина неверных стопов это когда выставляемые стопы меньше чем допустимый Стоплевел, так что сделай доп проверку и если что увелич значение
 

ну вы даёте.

посту 3 года, и вы решили его поднять?

 
блин)) кто бы еще смотрел на дату) viktors, археолог :)
[Deleted]  
Techno >>:
блин)) кто бы еще смотрел на дату) viktors, археолог :)


Бывает)