Вопрос по OrderSend

 
int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)

Цены StopLoss и TakeProfit не могут располагаться слишком близко к рынку. Минимальное расстояние стопов в пунктах можно получить, используя функцию MarketInfo() с параметром MODE_STOPLEVEL. В случае ошибочных, а также ненормализованных стопов генерируется ошибка 130 (ERR_INVALID_STOPS).


Если задать заведомо близкий или неверный стоп, будет ли он проверен на допустимость на клиенте до того, как будет отправлен на сервер и там выполнится проверка?

Т.е. до вызовава OrderSend нужно ли самому проверять стоп на допустимость, или же это возбмет на себя терминал на стороне клиента и в случае ошибки выдаст ERR_INVALID_STOPS?
 
Насколько помню, отфутболит сам терминал, но пусть разработчики скажут.
 
На терминале проверка есть. Только это не повод писать код с ошибками.
Своя проверка никогда не помешает ;)


PS: если кто вдруг не знает - стопы можно ставить на расстоянии MODE_STOPLEVEL + 1 пунктов
 
На терминале проверка есть. Только это не повод писать код с ошибками.
Своя проверка никогда не помешает ;)


В случае ModifyOrder проверка будет вот такая:
  

  double bid = MarketInfo(OrderSymbol(), MODE_BID);
  double ask = MarketInfo(OrderSymbol(), MODE_ASK);
  double point = MarketInfo(OrderSymbol(), MODE_POINT);
  double lev = MarketInfo(OrderSymbol(), MODE_STOPLEVEL)*point + 1;
  int dig = MarketInfo(OrderSymbol(), MODE_DIGITS);

  int type = OrderType();
  if (type == OP_BUY) {
    if (sl > 0 && sl >= bid-lev) {
      Print ("ModifyOrder: Invalid SL. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Bid= " + DoubleToStr(bid, dig) + ". " +
        "SL= " + DoubleToStr(sl, dig) + ". ");
      return (-1);
    }

    if (tp > 0 && tp <= bid+lev) {
      Print("ModifyOrder: Invalid TP. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Bid= " + DoubleToStr(bid, dig) + ". " +
        "TP= " + DoubleToStr(tp, dig) + ". ");
      return (-1);
    }
  }
  
  if (type == OP_BUYLIMIT) {
    if (price >= ask-lev) {
      Print("ModifyOrder: Invalid Price. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "Ask= " + DoubleToStr(ask, dig) + ". ");
      return (-1);
    }
    
    if (sl > 0 && sl >= price-lev) {
      Print("ModifyOrder: Invalid SL. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "SL= " + DoubleToStr(sl, dig) + ". ");
      return (-1);
    }

    if (tp > 0 && tp <= price+lev) {
      Print("ModifyOrder: Invalid TP. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "TP= " + DoubleToStr(tp, dig) + ". ");
      return (-1);
    }
  }

  if (type == OP_BUYSTOP) {
    if (price <= ask+lev) {
      Print("ModifyOrder: Invalid Price. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "Ask= " + DoubleToStr(ask, dig) + ". ");
      return (-1);
    }
    
    if (sl > 0 && sl >= price-lev) {
      Print("ModifyOrder: Invalid SL. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "SL= " + DoubleToStr(sl, dig) + ". ");
      return (-1);
    }

    if (tp > 0 && tp <= price+lev) {
      Print("ModifyOrder: Invalid TP. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "TP= " + DoubleToStr(tp, dig) + ". ");
      return (-1);
    }
  }
  
  if (type == OP_SELL) {
    if (sl > 0 && sl <= ask+lev) {
      Print("ModifyOrder: Invalid SL. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Ask= " + DoubleToStr(ask, dig) + ". " +
        "SL= " + DoubleToStr(sl, dig) + ". ");
      return (-1);
    }

    if (tp > 0 && tp >= ask-lev) {
      Print("ModifyOrder: Invalid TP. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Ask= " + DoubleToStr(ask, dig) + ". " +
        "TP= " + DoubleToStr(tp, dig) + ". ");
      return (-1);
    }  
  }
  
  if (type == OP_SELLLIMIT) {
    if (price <= bid+lev) {
      Print("ModifyOrder: Invalid Price. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "Bid= " + DoubleToStr(bid, dig) + ". ");
      return (-1);
    }
    
    if (sl > 0 && sl <= price+lev) {
      Print("ModifyOrder: Invalid SL. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "SL= " + DoubleToStr(sl, dig) + ". ");
      return (-1);
    }

    if (tp > 0 && tp >= price-lev) {
      Print("ModifyOrder: Invalid TP. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "TP= " + DoubleToStr(tp, dig) + ". ");
      return (-1);
    }
  }

  if (type == OP_SELLSTOP) {
    if (price >= bid-lev) {
      Print("ModifyOrder: Invalid Price. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "Bid= " + DoubleToStr(bid, dig) + ". ");
      return (-1);
    }
    
    if (sl > 0 && sl <= price+lev) {
      Print("ModifyOrder: Invalid SL. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "SL= " + DoubleToStr(sl, dig) + ". ");
      return (-1);
    }

    if (tp > 0 && tp >= price-lev) {
      Print("ModifyOrder: Invalid TP. " +
        "Type= " + OrderTypeToStr(type) + ". " +
        "Price= " + DoubleToStr(price, dig) + ". " +
        "TP= " + DoubleToStr(tp, dig) + ". ");
      return (-1);
    }    
  }



А оно надо, когда то же самое будет делаться в терминале?

 
Второй момент. Я насчитал 5 кодов ошибок, после которых можно повторять команду в цикле без боязни получить от брокера по шапке:
ERR_COMMON_ERROR
ERR_SERVER_BUSY
ERR_NO_CONNECTION
ERR_TRADE_TIMEOUT
ERR_TRADE_CONTEXT_BUSY

Так ли это?
 
Если задать заведомо близкий или неверный стоп, будет ли он проверен на допустимость на клиенте до того, как будет отправлен на сервер и там выполнится проверка?

Практически почти все типы ошибок проверяются на клиенте (и повторно - на сервере).

Т.е. до вызовава OrderSend нужно ли самому проверять стоп на допустимость, или же это возбмет на себя терминал на стороне клиента и в случае ошибки выдаст ERR_INVALID_STOPS?

Обязательно нужно самому контролировать корректность всех цен, не дожидаясь выдачи ошибок.

Второй момент. Я насчитал 5 кодов ошибок, после которых можно повторять команду в цикле без боязни получить от брокера по шапке:
Так ли это?

Инсталлируйте вчерашний билд 190 - там хелп расширен и добавлен новый раздел как раз про типы ошибок для каждой функции.
 
Обязательно нужно самому контролировать корректность всех цен, не дожидаясь выдачи ошибок.


Зачем? Вопрос лишь - на каком уровне тебя отфутболят. Главное - что до сервера это не дойдет.
 
Если задать заведомо близкий или неверный стоп, будет ли он проверен на допустимость на клиенте до того, как будет отправлен на сервер и там выполнится проверка?

Практически почти все типы ошибок проверяются на клиенте (и повторно - на сервере).


Как клиент проверяет? Зачем же тогда он пропускает приказ на сервер?

Даже если задать заведомо близкий, но верный стоп, то и он работает не всегда.
 
Как клиент проверяет? Зачем же тогда он пропускает приказ на сервер?

На клиенте все может быть нормально, но пока приказ ходит по сети, цены могут измениться пусть всего на один пункт и сервер откажет.
 
Как клиент проверяет? Зачем же тогда он пропускает приказ на сервер?

На клиенте все может быть нормально, но пока приказ ходит по сети, цены могут измениться пусть всего на один пункт и сервер откажет.

Необходимость проверки на сервере понятна.
Непонятно что значит:
Практически почти все типы ошибок проверяются на клиенте

На этапе компиляции - понятно.
В процессе работы - не понятно. Если действительно проверяется, то что и с какими последствиями?
-----------------------
Отдельный вопрос.
Производится ли нормализация курсов перед их проверкой на сервере?
Я сталкивался с ситуацией, когда сервер возвращает ошибку при легальных, но модифицируемых "впритык" стопах (с учётом миним. допуст. дистанции).
 
Практически почти все типы ошибок проверяются на клиенте

Так как речь об сделках, то проверяются почти все условия корректности торговых запросов. Последствия - коды ошибок.

Производится ли нормализация курсов перед их проверкой на сервере?

Нет.

Я сталкивался с ситуацией, когда сервер возвращает ошибку при легальных, но модифицируемых "впритык" стопах (с учётом миним. допуст. дистанции)

Именно случай когда:
На клиенте все может быть нормально, но пока приказ ходит по сети, цены могут измениться пусть всего на один пункт и сервер откажет.


Не забывайте о существовании задержек в сети и прихода новых цен.
Сервер никогда не ошибается, когда выдает сообщения о неверных ценах.
Причина обращения: