StopLoss: OrderSend() vs OrderModify()

 
Критерий, задаваемый параметром MarketInfo(Symbol(), MODE_STOPLEVEL), интерпретируется функциями OrderSend() и OrderModify() по-разному.

Например, при следующих исходных данных
StopLevel = 5
Bid = 1.2620
Spread = 0.0004

можно открыть ордер на покупку

OrderOpenPrice = Ask = Bid + Spread = 1.2620 + 0.0004 = 1.2624
OrderStopLoss = Ask - StopLevel * Point = 1.2614 - 0.0005 = 1.2619


Если тут же попытаться отодвинуть стоплосс, скажем, на пункт, в 1.2618, терминал не позволит этого сделать. OrderModify(), соответственно, возвращает ошибку 130 - ERR_INVALID_STOPS, если изменять стоплосс программно. Минимальный стоплосс уровень, задаваемый функцией OrderModify(), больше аналогичного параметра функции OrderSend() на величину спреда:

OrderStopLoss by OrderModify = Bid - StopLevel * Point = 1.2620 - 0.0005 = 1.2615
OrderStopLoss by OrderSend = Ask - StopLevel * Point = 1.2624 - 0.0005 = 1.2619


Почему?

 
Ставить стоплосс при модификации надо на один пипс дальше разрешенного.
 
Ставить стоплосс при модификации надо на один пипс дальше разрешенного.
В примере выше стоплосс при модификации ставится ровно на один пипс дальше разрешенного. При этом возвращается ошибка.
 
Ставить стоплосс при модификации надо на один пипс дальше разрешенного.
В примере выше стоплосс при модификации ставится ровно на один пипс дальше разрешенного. При этом возвращается ошибка.

А обновление рыночных условий было проведено? Цены могли уйти.
Выложите полный код, пожалуйста.
 
Ошибка имеет место как при ручной торговле, так и при автоматической, и Вы сами вполне можете это проверить безо всякого кода или на простейшем скрипте.
К тому же, во всех примерах экспертов из дистрибутива, так же как и в базе кодов на mql4.com, OrderSend() вызывается со стоплоссом Ask - StopLoss * Points для ордера покупки, а OrderModify() для того же ордера использует Bid - StopLoss * Points.
К чему бы это?
 
Давайте пройдемся по шагам:

1) рынок EURUSD 1.2620 / 24
2) BUY 1.0 EURUSD at 1.2624 sl 1.2619, ок, открыто

На текущий момент условие SL на первом открытии позиции проверяется мягко (по цене заявленного открытия, как Вы заметили), поэтому разрешено было поставить стоп ближе, чем при последующих модификациях. Мягкость уберем, чтобы условие проверки близости было таким же как и при модификации.

Если тут же попытаться отодвинуть стоплосс, скажем, на пункт, в 1.2618, терминал не позволит этого сделать.

3) MODIFY BUY 1.0 EURUSD at 1.2624 sl 1.2619 -> sl 1.2618 , неудача

Это потому, что рынок 1.2620 / 24, контроль закрытия идет по биду, минимально допустимый отступ 3 пункта. Это означает, что SL может быть поставлен не ближе 3х пунктов от цены бид, а именно 1.2617. Отказ был абсолютно корректный.
 
На текущий момент условие SL на первом открытии позиции проверяется мягко (по цене заявленного открытия, как Вы заметили), поэтому разрешено было поставить стоп ближе, чем при последующих модификациях. Мягкость уберем, чтобы условие проверки близости было таким же как и при модификации.
Собственно, об этой разнице и шла речь.
То есть, надо полагать, стоплосс будет задаваться, как дистанция от ближайшей цены, которая суть цена закрытия ордера - Bid для Buy и Ask для Sell - для обеих функций OrderSend() и OrderModify().
Это определенно сделает логику прозрачнее, спасибо.
Кстати, я подозреваю, что такая же разница имеет место для аргумента takeprofit тех же вызовов.
Причина обращения: