Скачать MetaTrader 5

StopLoss: OrderSend() vs OrderModify()

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нашел прибыльную стратегию? Заведи торговый сигнал и заработай на этом!
Forex Trader
114257
Forex Trader 2006.06.12 05:04 
Критерий, задаваемый параметром 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


Почему?

MetaQuotes Software Corp.
Модератор
181178
MetaQuotes Software Corp. 2006.06.12 11:57  
Ставить стоплосс при модификации надо на один пипс дальше разрешенного.
Forex Trader
114257
Forex Trader 2006.06.12 12:10  
Ставить стоплосс при модификации надо на один пипс дальше разрешенного.
В примере выше стоплосс при модификации ставится ровно на один пипс дальше разрешенного. При этом возвращается ошибка.
MetaQuotes Software Corp.
Модератор
181178
MetaQuotes Software Corp. 2006.06.12 18:45  
Ставить стоплосс при модификации надо на один пипс дальше разрешенного.
В примере выше стоплосс при модификации ставится ровно на один пипс дальше разрешенного. При этом возвращается ошибка.

А обновление рыночных условий было проведено? Цены могли уйти.
Выложите полный код, пожалуйста.
Forex Trader
114257
Forex Trader 2006.06.12 19:51  
Ошибка имеет место как при ручной торговле, так и при автоматической, и Вы сами вполне можете это проверить безо всякого кода или на простейшем скрипте.
К тому же, во всех примерах экспертов из дистрибутива, так же как и в базе кодов на mql4.com, OrderSend() вызывается со стоплоссом Ask - StopLoss * Points для ордера покупки, а OrderModify() для того же ордера использует Bid - StopLoss * Points.
К чему бы это?
MetaQuotes Software Corp.
Модератор
181178
MetaQuotes Software Corp. 2006.06.12 20:25  
Давайте пройдемся по шагам:

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. Отказ был абсолютно корректный.
Forex Trader
114257
Forex Trader 2006.06.12 22:44  
На текущий момент условие SL на первом открытии позиции проверяется мягко (по цене заявленного открытия, как Вы заметили), поэтому разрешено было поставить стоп ближе, чем при последующих модификациях. Мягкость уберем, чтобы условие проверки близости было таким же как и при модификации.
Собственно, об этой разнице и шла речь.
То есть, надо полагать, стоплосс будет задаваться, как дистанция от ближайшей цены, которая суть цена закрытия ордера - Bid для Buy и Ask для Sell - для обеих функций OrderSend() и OrderModify().
Это определенно сделает логику прозрачнее, спасибо.
Кстати, я подозреваю, что такая же разница имеет место для аргумента takeprofit тех же вызовов.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий