Нужна помощь с ошибкой #130 недействительный стоплосс - страница 3

 
та же проблема. Ордер открывается нормально со stoploss = 0 и takeprofit = 0.
Но затем OrderModify не срабатывает.

Код ниже выполняется после кода выше из последнего сообщения.

   bool modify = false;
   entry_price = OrderOpenPrice();
   if(long) {  
      SL = MarketInfo(Symbol(), MODE_BID) - stoploss * MarketInfo(Symbol(), MODE_POINT);
      TP = MarketInfo(Symbol(), MODE_BID) + takeprofit * MarketInfo(Symbol(), MODE_POINT);
      modify = OrderModify(result_ticket, entry_price, SL, TP, Red);  
   } else {    
      SL = MarketInfo(Symbol(), MODE_ASK) + stoploss * MarketInfo(Symbol(), MODE_POINT);
      TP = MarketInfo(Symbol(), MODE_ASK) - takeprofit * MarketInfo(Symbol(), MODE_POINT);
      modify = OrderModify(result_ticket, entry_price, SL, TP, Green); 
   }
   Log("[5] SL: " + SL);
   Log("[5] TP: " + TP);
   
   if(!modify) {
      Log("error="+GetLastError());
      return(-1);
   }

Журнал показывает:

#ESZ1,M5: Opening Position
#ESZ1,M5: tickvalue: 12.50000000
#ESZ1,M5: размер позиции: 1.00000000
#ESZ1,M5: Ask/Bid 1242.00000000/1241.75000000
#ESZ1,M5: спред 0.25000000
#ESZ1,M5: open #13679252 buy 1.00 #ESZ1 at 1242.00 ok
#ESZ1,M5: Ордер 13679252 успешно открыт
#ESZ1,M5: SL: 1241.25000000
#ESZ1,M5: TP: 1242.25000000
#ESZ1,M5: error=130

Так что даже первое открытие, а затем установка стоплосса, похоже, не работает :-/
 

Спред 0,25

#ESZ1,M5: Спред 0.25000000

ОК, вы открываете покупку по ... 1242.00 (Ask)

#ESZ1,M5: open #13679252 buy 1.00 #ESZ1 at 1242.00 ok

#ESZ1,M5: ордер 13679252 успешно открыт

Затем вы пытаетесь модифицировать с TP по цене Bid + 2 * Spread и SL по цене Bid - 2 * Spread.

#ESZ1,M5: SL: 1241.25000000

#ESZ1,M5: TP: 1242.25000000

Если ваш FreezeLevel равен 0.50, то это ваша проблема... какой у вас FreezeLevel?

 
shinobi:
та же проблема. Ордер открывается нормально со стоплоссом = 0 и тейкпрофитом = 0.
Но затем OrderModify не срабатывает.

Не настраивается на брокеры с 4/5 цифрами. Не открывается сначала, а затем устанавливаются стопы.

Как уже отвечали ранее

 

да, вероятно, вы торгуете с ECN брокером, вы должны открывать ордера с нулевыми стопами, а затем модифицировать ордер после его открытия, поэтому есть проблема с 50 пипсами SL и TP, поэтому сделайте, как сказал Raptor, проверьте freezelevel и stoplevel тоже на всякий случай.

Также проверьте код OrderModify() ...., возможно, он работает таким образом, но мне кажется, что вы должны выбрать ордер с помощью OrderSelect(), прежде чем делать OrderOpenPrice().

 
Еще раз спасибо за помощь!
Увы, #130 все еще преследует меня по ночам ;)

Вот моя следующая попытка:

   double stoploss = 50;
   double SL = 0.0;
   
   //open position
   if(long)  //take long position
      result_ticket = OrderSend(Symbol(), 0, 1, MarketInfo(Symbol(), MODE_ASK), 2, 0, 0, "", 12345);  
   else     //take short position
      result_ticket = OrderSend(Symbol(), 1, 1, MarketInfo(Symbol(), MODE_BID), 2, 0, 0, "", 12345); 
   //check for errors
   if(result_ticket == -1) {
      Log("error="+GetLastError());
      return(-1);
   }
   Log("Order "+result_ticket+" Successfully Opened");

   //select order
   if (!OrderSelect(result_ticket, SELECT_BY_TICKET)) {
      Log("error="+GetLastError());
      return(-1);
   }    
   entry_price = OrderOpenPrice();
   
   //check stoplevel
   double stoplevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
   Log("Stoplevel: " + stoplevel);
   Log("stoploss: " + stoploss);
   if(stoploss < stoplevel)
      stoploss = stoplevel + 1;

   //checl freezelevel
   double freezelevel = MarketInfo(Symbol(), MODE_FREEZELEVEL);
   Log("Freezelevel: " + freezelevel);
   Log("stoploss: " + stoploss);
   if(stoploss < freezelevel)
      stoploss = freezelevel + 1;
   
   if(long)
      SL = MarketInfo(Symbol(), MODE_BID) - stoploss * MarketInfo(Symbol(), MODE_POINT);
   else
      SL = MarketInfo(Symbol(), MODE_ASK) + stoploss * MarketInfo(Symbol(), MODE_POINT);
   Log("SL: " + SL*pips2dbl);
   if(!OrderModify(result_ticket, entry_price, SL* pips2dbl, 0, Red)) {
      Log("error="+GetLastError());
      return(-1);
   }
   Log("Stoploss successfully set");

Как вы можете видеть, я упростил пример, не используя тейкпрофит. Ошибка определенно возникает из-за стоплосса, поэтому нам не нужен тейкпрофит.
Сначала я открываю ордер с 0 стоплоссом (и тейкпрофитом), а затем пытаюсь установить стоплосс с помощью OrderModify.
Перед этим я проверяю Mode_Stoplevel и Mode_Freezelevel и корректирую стоплосс, если это необходимо. (Корректировка происходит ниже в журнале, потому что стоплосс изначально равен 50, но Mode_Stoplevel равен 75, я затем устанавливаю стоплосс на Mode_Stoplevel + 1, так что 76).

RaptorUK и SDC:
MarketInfo(MODE_FREEZELEVEL) возвращает 0. Я не думаю, что Freezelevel является проблемой.
Я включил вывод в файл журнала.

SDC:
Я также вставил OrderSelect, перед вызовом OrderOpenPrice, просто чтобы убедиться. В журнале видно, что OrderSelect сработал, иначе код не прошел бы так далеко (выход -1).

WHRoeder:
Я следовал простому примеру SDC. Но теперь я расширил его, используя настройку pips 4/5 Digit при установке stoploss, как вы можете видеть выше. Вы также можете видеть, что ордер сначала открывается со стоплоссом и тейкпрофитом, установленными на ноль, а затем стоплосс устанавливается с помощью OrderModify. Как вы можете видеть в журнале ниже с S/L и T/P, установленными на ноль, ордер открывается успешно, но я все еще не могу установить S/L на следующем шаге с помощью OrderModify.

Вот полный лог:

#ESZ1,M5: loaded successfully 
#ESZ1,M5: Date: 2011/11/15 9:24
#ESZ1,M5: Symbol: #ESZ1
#ESZ1,M5: Depot: 56489.95000000
#ESZ1,M5: Stop Level [Points]: 75.00000000
#ESZ1,M5: Freeze Level [Points]: 0.00000000
#ESZ1,M5: Spread [Points]: 25.00000000
#ESZ1,M5: Min/Max Lot: 0.01000000/1000.00000000
#ESZ1,M5: Point: 0.01000000
#ESZ1,M5: Tick Size: 0.25000000
#ESZ1,M5: Tick Value: 12.50000000
#ESZ1,M5: Digits: 2.00000000
#ESZ1,M5: Contract: 2011.09.14 00:00-2011.12.16 23:59
#ESZ1,M5: Init successfully completed.
#ESZ1,M5: initialized

#ESZ1,M5: Opening Position
#ESZ1,M5: tickvalue: 12.50000000
#ESZ1,M5: Ask/Bid 1250.50000000/1250.25000000
#ESZ1,M5: Spread 0.25000000
#ESZ1,M5: pos size: 1
#ESZ1,M5: open #13697436 sell 1.00 #ESZ1 at 1250.25 ok 
#ESZ1,M5: Order 13697436 Successfully Opened
#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: stoploss: 50.00000000
#ESZ1,M5: Freezelevel: 0.00000000
#ESZ1,M5: stoploss: 76.00000000
#ESZ1,M5: SL: 12.51260000
#ESZ1,M5: error=130

Я очень благодарен за вашу постоянную помощь, и я думаю, что мы сузили круг поиска проблемы :)
Так в чем еще может быть проблема? Что еще я могу попробовать?

shinobi
 
RaptorUK:

Спред 0,25

#ESZ1,M5: Спред 0.25000000

Хорошо, вы открываете покупку по цене ... 1242.00 (Ask).

#ESZ1,M5: open #13679252 buy 1.00 #ESZ1 at 1242.00 ok

#ESZ1,M5: ордер 13679252 успешно открыт

Затем вы пытаетесь модифицировать с TP по цене бида + 2 * спред и SL по цене бида - 2 * спред.

Разве ваш STOP_LEVEL не 3 * Spread? Ваш Stop слишком близко...

#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: stoploss: 50.00000000
 
Эй, Раптор,

Да, именно поэтому я проверяю стоплосс здесь (из кода выше):

.
   double stoplevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
   Log("Stoplevel: " + stoplevel);
   Log("stoploss: " + stoploss);
   if(stoploss < stoplevel)
      stoploss = stoplevel + 1;

Итак, в последнем примере стоплосс был установлен на 76, что составляет 3*Spread +1.
Это должно быть достаточно далеко, верно?
 
shinobi:
Привет, Раптор,

Да, именно поэтому я проверяю стоплосс здесь (из кода выше):


Итак, в последнем примере stoploss был установлен на 76, что составляет 3*Spread +1.
Это должно быть достаточно далеко, верно?
Да, должно... но мне интересно, есть ли у вас здесь проблема с округлением и нужно ли вам округлять до ближайшего 0.25 (S&P500 движется с шагом в 0.25), чтобы ваш SL не превышал STOP_LEVEL на 0.25 или больше... если вы понимаете, о чем я?
 
Хорошая идея, но, увы, это тоже не помогло.
Вот что я сделал.

Сначала я написал пользовательскую функцию для округления двойных чисел до ближайшего двойного:
.
double DoubleRound(double number, double step)
{
    double mod = MathMod(number, step);
    if(mod < step/2.0)
      step = 0;
    double rounded = number - mod + step;
    return (rounded);
}

Она делает то, что вы ожидаете. Если вы вызовете ее с DoubleRound(1237.687360000), она вернет 1237.50.

Затем я использовал ее на S/L непосредственно перед вызовом OrderModify. И я использовал MODE_TICKVALUE, который равен 0.25 для #ESZ1.
Итак:

.
   //round to nearest Tickvalue   
   SL = DoubleRound(SL, MarketInfo(Symbol(), MODE_TICKVALUE));

 
  Log("SL: " + SL);
   if(!OrderModify(result_ticket, entry_price, SL* pips2dbl, 0, Red)) {
      Log("error="+GetLastError());
      return(-1);
   }

В журнале вы можете видеть, что округление сработало нормально. Однако стоплосс все равно был отклонен :/

.
#ESZ1,M5: loaded successfully 
#ESZ1,M5: Date: 2011/11/16 7:44
#ESZ1,M5: Symbol: #ESZ1
#ESZ1,M5: Depot: 56364.95000000
#ESZ1,M5: Stop Level [Points]: 75.00000000
#ESZ1,M5: Freeze Level [Points]: 0.00000000
#ESZ1,M5: Spread [Points]: 25.00000000
#ESZ1,M5: Min/Max Lot: 0.01000000/1000.00000000
#ESZ1,M5: Point: 0.01000000
#ESZ1,M5: Tick Size: 0.25000000
#ESZ1,M5: Tick Value: 12.50000000
#ESZ1,M5: Digits: 2.00000000
#ESZ1,M5: Contract: 2011.09.14 00:00-2011.12.16 23:59
#ESZ1,M5: Opening Position
#ESZ1,M5: Ask/Bid 1240.00000000/1239.75000000
#ESZ1,M5: Spread 0.25000000
#ESZ1,M5: open #13708089 sell 1.00 #ESZ1 at 1239.75 ok 
#ESZ1,M5: Order 13708089 Successfully Opened
#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: Freezelevel: 0.00000000
#ESZ1,M5: stoploss: 76.00000000
#ESZ1,M5: SL: 1237.50000000
#ESZ1,M5: error=130

Я не могу представить, в чем еще может быть проблема! Этот #130 очень настойчивый!!!
 

Вы открыли продажу

#ESZ1,M5: open #13708089 sell 1.00 #ESZ1 at 1239.75 ok

и попытались установить SL ниже него. ...

#ESZ1,M5: SL: 1237.50000000

#ESZ1,M5: error=130