Некорректный возврат ошибки №130 при установке ордера

 
Ситуация следующая:
1. Сервер Альпари-Демо
2. Терминал Билд 193 от 4 мая
3. Инструмент GBPUSD
4. STOPLEVEL по инструменту 4 пункта
5. Торгует эксперт.
6. Цена открытия в эксперте определяется как MarketInfo("GBPUSD",MODE_BID) или MarketInfo("GBPUSD",MODE_ASK)

Журнал терминала:
2006.06.21 13:33:17 '------': instant order sell 0.10 GBPUSD at 1.8418 sl: 1.8427 tp: 1.8413
2006.06.21 13:33:18 '------': order sell 0.10 GBPUSD opening at 1.8418 sl: 1.8427 tp: 1.8413 failed [Invalid S/L or T/P]
2006.06.21 13:33:18 '------': instant order sell 0.10 GBPUSD at 1.8418 sl: 1.8427 tp: 1.8413
2006.06.21 13:33:18 '------': order sell 0.10 GBPUSD opening at 1.8418 sl: 1.8427 tp: 1.8413 failed [Invalid S/L or T/P]
2006.06.21 13:33:18 '------': instant order sell 0.10 GBPUSD at 1.8418 sl: 1.8427 tp: 1.8413
2006.06.21 13:33:19 '------': order sell 0.10 GBPUSD opening at 1.8418 sl: 1.8427 tp: 1.8413 failed [Invalid S/L or T/P]
2006.06.21 13:33:20 '------': instant order sell 0.10 GBPUSD at 1.8418 sl: 1.8427 tp: 1.8413
2006.06.21 13:33:21 '------': order sell 0.10 GBPUSD opening at 1.8418 sl: 1.8427 tp: 1.8413 failed [Invalid S/L or T/P]
2006.06.21 13:33:21 '------': instant order sell 0.10 GBPUSD at 1.8418 sl: 1.8427 tp: 1.8413
2006.06.21 13:33:21 '------': order sell 0.10 GBPUSD opening at 1.8418 sl: 1.8427 tp: 1.8413 failed [Invalid S/L or T/P]
2006.06.21 13:33:22 '------': instant order sell 0.10 GBPUSD at 1.8418 sl: 1.8427 tp: 1.8413
2006.06.21 13:33:22 '------': order sell 0.10 GBPUSD opening at 1.8418 sl: 1.8427 tp: 1.8413 failed [Invalid S/L or T/P]

Вопросы такие:
1. По какой причине мне 6 раз подряд вернулась ошибка №130 (Invalid SL or TP) если SL и TP ордера выставляются в соответствии со спецификацией контрактов и равны даже не STOPLEVEL а STOPLEVEL+1 (для запаса)?
2. Если ответ на первый вопрос будет "Потому что цена ушла и SL или TP стали некорректные" то почему мой терминал ничего не знает об изменении цены на протяжении 13:33:16-13:33:22 т е 6 секунд, хотя он успел обменяться с сервером 6-ю!!! запросами на открытие ордера?

В сложившейся ситуации эксперт создает ненужную нагрузку на сервер, что не нужно ни мне ни брокеру... Просьба ответить почему такое возможно и как решать этот вопрос. (Установка SL и TP = STOPLEVEL+2... +3 и т д вопроса не решают а просто уменьшают вероятность такого события)
 
Я попробовал сделать тоже самое вручную , ошибки такие же:

2006.06.21 15:25:04 '239859': order sell 0.10 GBPUSD opening at 1.8410 sl: 1.8415 tp: 1.8405 failed [Invalid S/L or T/P]
2006.06.21 15:25:04 '239859': instant order sell 0.10 GBPUSD at 1.8410 sl: 1.8415 tp: 1.8405
2006.06.21 15:24:18 '239859': order sell 0.10 GBPUSD opening at 1.8412 sl: 1.8417 tp: 1.8407 failed [Invalid S/L or T/P]
2006.06.21 15:24:17 '239859': instant order sell 0.10 GBPUSD at 1.8412 sl: 1.8417 tp: 1.8407


В срецификации га GBPUSD в Альпари указано:
Спред 4 пункта
Точность 4 знака
Уровень стопов 4 пункта
 
Также опытным путем выяснено, что отсутствие стопа позволяет разместить ордер,а отсутствие тейк-профита - нет

2006.06.21 15:30:55 '239859': order is open : #5924010 sell 0.10 GBPUSD at 1.8414 sl: 0.0000 tp: 1.8409
2006.06.21 15:30:55 '239859': request in process
2006.06.21 15:30:55 '239859': request was accepted by server
2006.06.21 15:30:55 '239859': instant order sell 0.10 GBPUSD at 1.8414 sl: 0.0000 tp: 1.8409
2006.06.21 15:30:31 '239859': order sell 0.10 GBPUSD opening at 1.8413 sl: 1.8418 tp: 0.0000 failed [Invalid S/L or T/P]
2006.06.21 15:30:30 '239859': instant order sell 0.10 GBPUSD at 1.8413 sl: 1.8418 tp: 0.0000


Значит торговому серверу не нравятся ордера по Фунту со стопом в StopLevel+1 пункт, в то время как тейк-профит с целью StopLevel+1 пункт он пропускает. Это для продажи.
 
Покупка со стопом в StopLevel+1 пункт от цены открытия ордера ему тоже не понравилась

2006.06.21 15:36:10 '239859': order buy 0.10 GBPUSD opening at 1.8416 sl: 1.8411 tp: 0.0000 failed [Invalid S/L or T/P]
2006.06.21 15:36:09 '239859': instant order buy 0.10 GBPUSD at 1.8416 sl: 1.8411 tp: 0.0000
2006.06.21 15:35:34 '239859': order buy 0.10 GBPUSD opening at 1.8417 sl: 1.8412 tp: 0.0000 failed [Invalid S/L or T/P]
2006.06.21 15:35:34 '239859': instant order buy 0.10 GBPUSD at 1.8417 sl: 1.8412 tp: 0.0000
 
Без стопа все нормально:

2006.06.21 15:38:03 '239859': order is open : #5924120 buy 0.10 GBPUSD at 1.8414 sl: 0.0000 tp: 1.8419
2006.06.21 15:38:03 '239859': request in process
2006.06.21 15:38:03 '239859': request was accepted by server
 
В общем, вывод такой - нужно откладывать от цены открытия(для ордеров по рынку) Spread+StopLevel для установки стопа. Хотя не уверен.

2006.06.21 15:41:32 '239859': order is open : #5924164 sell 0.10 GBPUSD at 1.8414 sl: 1.8422 tp: 0.0000
2006.06.21 15:41:32 '239859': request in process
2006.06.21 15:41:32 '239859': request was accepted by server
2006.06.21 15:41:32 '239859': instant order sell 0.10 GBPUSD at 1.8414 sl: 1.8422 tp: 0.0000
2006.06.21 15:41:19 '239859': order sell 0.10 GBPUSD opening at 1.8414 sl: 1.8421 tp: 0.0000 failed [Invalid S/L or T/P]
2006.06.21 15:41:19 '239859': instant order sell 0.10 GBPUSD at 1.8414 sl: 1.8421 tp: 0.0000
2006.06.21 15:41:08 '239859': order sell 0.10 GBPUSD opening at 1.8414 sl: 1.8420 tp: 0.0000 failed [Invalid S/L or T/P]
2006.06.21 15:41:08 '239859': instant order sell 0.10 GBPUSD at 1.8414 sl: 1.8420 tp: 0.0000
2006.06.21 15:40:49 '239859': order is open : #5924158 sell 0.10 GBPUSD at 1.8414 sl: 1.8422 tp: 0.0000
2006.06.21 15:40:49 '239859': request in process
2006.06.21 15:40:49 '239859': request was accepted by server
2006.06.21 15:40:49 '239859': instant order sell 0.10 GBPUSD at 1.8414 sl: 1.8422 tp: 0.0000
2006.06.21 15:39:40 '239859': order is open : #5924141 sell 0.10 GBPUSD at 1.8413 sl: 1.8421 tp: 0.0000
 
Rosh спасибо за исследование!
Мы общались с Вами по этому вопросу раньше на сайте Альпари... Тогда мне посоветовали ставить SL и/или TP на уровне STOPLEVEL+1... Но оказалось что это не решает вопрос а только уменьшает возможность возникновения подобной реакции сервера...
В ответах сервера (если смотреть со стороны клиента) присутствует какая-то нечеткая логика.... Один и тот же ордер он может принять скажем с 3-го или 10-го раза... (для SL/TP = STOPLEVEL+1)
Slawa высказал предположение что это может быть результатом ухода цены и расстояние до стопа или профита в этом случае нарушается...

Если это действительно так то хотелось бы видеть такую логику:
1. Если Цена ушла и НЕ ПОПАДАЕТ в диапазон слиппажа возвращаем ошибку №138 (т к клиент и сервер видят разные цены в один и тот же момент времени)... Возврат ошбки №130 безинформативен для клиента.
2. Если цена ушла и ПОПАДАЕТ в диапазон слиппажа то ордер открывается как обычно

Еще дополнительный вопрос: бывают ситуации типа приведенной выше когда сервер имеет котировку отличную от терминала и в результате установки ордера возвращается ошибка (№130 или №138 не суть важно)... Клиент при этом сравнительно долгое время может не видеть новую котировку...
Почему бы не использовать в терминале котировки которые вернул сервер при реквоте как НОВЫЕ (и соответственно изменять Ask и Bid)? Ведь они были на сервере?
 
В общем, вывод такой - нужно откладывать от цены открытия(для ордеров по рынку) Spread+StopLevel для установки стопа. Хотя не уверен.
Именно так обещали сделать в начале июля - для селл позиции цена открытия по Бид-у, а цена СЛ/ТП - по Аск-у.
Странно, что ситуация проявилась сейчас (и в билде 193) - разработчики говорили, что ужесточение в проверки добавится со 194-го билда (официального).
Если я, конечно, не ошибаюсь =)
 
В общем, вывод такой - нужно откладывать от цены открытия(для ордеров по рынку) Spread+StopLevel для установки стопа. Хотя не уверен.
Именно так обещали сделать в начале июля - для селл позиции цена открытия по Бид-у, а цена СЛ/ТП - по Аск-у.
Странно, что ситуация проявилась сейчас (и в билде 193) - разработчики говорили, что ужесточение в проверки добавится со 194-го билда (официального).
Если я, конечно, не ошибаюсь =)


Ошибаетесь :)
Для селл позиции цена открытия равна Биду, ТП не ближе STOPLEVEL+1 пунктов от Бида, а СЛ не ближе STOPLEVEL+1 пунктов от Аска
 
В общем, вывод такой - нужно откладывать от цены открытия(для ордеров по рынку) Spread+StopLevel для установки стопа. Хотя не уверен.


Начинали с STOPLEVEL потом согласились на STOPLEVEL+1 теперь уже STOPLEVEL+SPREAD :)))
Поймите что это не решает проблему! Она в логике возврата ошибок сервером.... В ситуации когда цена на сервере ушла от той которую видит клиент, вместо того чтобы сообщить о ней (№138) сначала выполняется проверка на допустимость СЛ и ТП и выдается №130. Причем со стороны клиента сервер ругается на совершенно правильный ордер
 
В общем, оставьте ненужные споры, вот скрипт:
//+------------------------------------------------------------------+
//|                                                  130Research.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                             http://www.metaquotes.ru/forum/7293/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.ru/forum/7293/"

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
  bool TestFinished=false;
  int tries=5;
  int i,ticket;
  int StopL=MarketInfo(Symbol(),MODE_STOPLEVEL);
  int Spread=MarketInfo(Symbol(),MODE_SPREAD);
  double StopLoss;
  string Comm;
//----
   if (tries<=Spread) tries=Spread+1;
   Print("Начинаем проверку на ",Symbol());
   Print("Спред=",Spread,"  StopLevel=",StopL);
   while(!IsStopped()&&!TestFinished)
      {
      RefreshRates();
      Comm=DoubleToStr(i,0)+" пункт";
      StopLoss=NormalizeDouble(Ask-(StopL+i)*Point,Digits);
      Print("Попытка покупки со стопом StopLevel+",i,"пунктов");
      ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,StopLoss,0,Comm,0,0,Blue);
      if (ticket<0)
         {
         Print("Неудача с ошибкой номер ",GetLastError());
         }
      else
         {
         Print("Ордер в покупку вроде открыт со стопом StopLevel+",i,"пунктов,  ошибка=",GetLastError());
         TestFinished=true;
         }   
      i++;
      if (i>=tries) TestFinished=true;
      Sleep(5000);     
      }
   Print("Проверка покупок завершена");
   i=0;
   TestFinished=false;
   while(!IsStopped()&&!TestFinished)
      {
      RefreshRates();
      Comm=DoubleToStr(i,0)+" пункт";
      StopLoss=NormalizeDouble(Bid+(StopL+i)*Point,Digits);
      Print("Попытка продажи со стопом StopLevel+",i,"пунктов");
      ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,StopLoss,0,Comm,0,0,Red);
      if (ticket<0)
         {
         Print("Неудача с ошибкой номер ",GetLastError());
         }
      else
         {
         Print("Ордер в продажу вроде открыт со стопом StopLevel+",i,"пунктов,  ошибка=",GetLastError());
         TestFinished=true;
         }   
      i++;
      if (i>=tries) TestFinished=true;
      Sleep(5000);     
      }
   Print("Проверка продаж завершена");
         
//----
   return(0);
  }
//+------------------------------------------------------------------+



А вот резалты :

2006.06.21 17:22:22 130Research GBPUSD,H1: removed
2006.06.21 17:22:22 130Research GBPUSD,H1: Проверка продаж завершена
2006.06.21 17:22:17 130Research GBPUSD,H1: Ордер в продажу вроде открыт со стопом StopLevel+4пунктов, ошибка=0
2006.06.21 17:22:17 130Research GBPUSD,H1: open #5926561 sell 0.10 GBPUSD at 1.8445 sl: 1.8453 ok
2006.06.21 17:22:17 130Research GBPUSD,H1: Попытка продажи со стопом StopLevel+4пунктов
2006.06.21 17:22:12 130Research GBPUSD,H1: Неудача с ошибкой номер 130
2006.06.21 17:22:12 130Research GBPUSD,H1: Попытка продажи со стопом StopLevel+3пунктов
2006.06.21 17:22:07 130Research GBPUSD,H1: Неудача с ошибкой номер 130
2006.06.21 17:22:06 130Research GBPUSD,H1: Попытка продажи со стопом StopLevel+2пунктов
2006.06.21 17:22:01 130Research GBPUSD,H1: Неудача с ошибкой номер 130
2006.06.21 17:22:00 130Research GBPUSD,H1: Попытка продажи со стопом StopLevel+1пунктов
2006.06.21 17:21:55 130Research GBPUSD,H1: Неудача с ошибкой номер 130
2006.06.21 17:21:55 130Research GBPUSD,H1: Попытка продажи со стопом StopLevel+0пунктов
2006.06.21 17:21:55 130Research GBPUSD,H1: Проверка покупок завершена
2006.06.21 17:21:50 130Research GBPUSD,H1: Ордер в покупку вроде открыт со стопом StopLevel+4пунктов, ошибка=0
2006.06.21 17:21:50 130Research GBPUSD,H1: open #5926548 buy 0.10 GBPUSD at 1.8451 sl: 1.8443 ok
2006.06.21 17:21:50 130Research GBPUSD,H1: Попытка покупки со стопом StopLevel+4пунктов
2006.06.21 17:21:44 130Research GBPUSD,H1: Неудача с ошибкой номер 130
2006.06.21 17:21:44 130Research GBPUSD,H1: Попытка покупки со стопом StopLevel+3пунктов
2006.06.21 17:21:39 130Research GBPUSD,H1: Неудача с ошибкой номер 130
2006.06.21 17:21:39 130Research GBPUSD,H1: Попытка покупки со стопом StopLevel+2пунктов
2006.06.21 17:21:34 130Research GBPUSD,H1: Неудача с ошибкой номер 130
2006.06.21 17:21:34 130Research GBPUSD,H1: Попытка покупки со стопом StopLevel+1пунктов
2006.06.21 17:21:29 130Research GBPUSD,H1: Неудача с ошибкой номер 130
2006.06.21 17:21:28 130Research GBPUSD,H1: Попытка покупки со стопом StopLevel+0пунктов
2006.06.21 17:21:28 130Research GBPUSD,H1: Спред=4 StopLevel=4
2006.06.21 17:21:28 130Research GBPUSD,H1: Начинаем проверку на GBPUSD
2006.06.21 17:21:28 130Research GBPUSD,H1: loaded successfully


Пусть каждый проверит на нужной паре и сообщит.
Налицо требование StopLevel+Spread, но из Регламента Альпари такое требование не вытекает.

Причина обращения: