Обсуждение статьи "Знакомство с MQL5: написание простого советника и индикатора" - страница 3

 

Вопрос 4. В статье говорится следующее:

...Занесем в структуру request значения, которые будут общими для большинства случаев вызова функции OrderSend в этой программе: 

   request.symbol      =Symbol();
   request.volume      =Lots;
   request.tp          =0;
   request.deviation   =0;
   request.type_filling=ORDER_FILLING_AON;

Элемент request.symbol содержит символьное имя инструмента, по которому совершаются торговые операции, элемент request.volume - величину контракта финансового инструмента, request.tp - значение цены TakeProfit (в некоторых случаях значение TakeProfit для ордера не будет указываться, поэтому в элемент структуры request.tp заносим ноль)...

 Но почему в элемент структуры request.tp заносим именно ноль? Ведь если у  нас имеется отложенный ордер на покупку, то request.tp=0 означает, что TP всегда будет находиться ниже текущей цены Bid. И, как мне представляется, ордер с подобным значением TP либо должен быть отклонён из-за неправильно указанного значения параметра TP, либо должен быть немедленно исполнен по текущей цены Bid после принятия такого приказа сервером.

 

Вопрос 5. В статье говорится следующее:

...Укажем локальные переменные, которые будем использовать в функции OnTick и их тип:

double h[], l[], ma[], atr_h[], atr_l[],
          lev_h, lev_l, StopLoss,
          StopLevel=_Point*SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL),
          Spread   =NormalizeDouble(SymbolInfoDouble(Symbol(),SYMBOL_ASK) - SymbolInfoDouble(Symbol(),SYMBOL_BID),_Digits);

...Переменная StopLevel используется для хранения величины STOP_LEVEL - минимального расстояния от текущей цены до выставляемого ордера (в единицах цены). Эту величину мы получаем как произведение цены пункта (предопределенная переменная _Point) на величину STOP_LEVEL в пунктах. Величину STOP_LEVEL возвращает функция SymbolInfoInteger. Первым параметром этой функции является символьное имя инструмента, а вторым - идентификатор запрашиваемого свойства...

В справочнике MQL5 также указано, что "SYMBOL_TRADE_STOPS_LEVEL - это Минимальный отступ в пунктах от текущей цены закрытия для установки Stop ордеров". Как мне представляется, в обоих случаях речь идёт о соблюдении неравенства

ORDER_PRICE_CURRENT-request.price>=SYMBOL_TRADE_STOPS_LEVEL (на случай Sell_Stop-ордера).

Почему же тогда в коде эксперта осуществляется проверка расстояния между Bid'ом (Ask'ом) и StopLoss на предмет превышения минимального отступа StopLevel?

               ...// новый StopLoss не близко к текущей цене?
               && NormalizeDouble(SymbolInfoDouble(Symbol(),SYMBOL_BID)-StopLoss-StopLevel,_Digits)>0
               
               ...// новый StopLoss не близко к текущей цене?
               && NormalizeDouble(StopLoss-SymbolInfoDouble(Symbol(),SYMBOL_ASK)-StopLevel,_Digits)>0

 Является ли такая проверка необходимой во всех случаях, или же это - особенность реализации отдельной конкретной стратегии? Короче говоря, надо ли всегда проверять расстояние между Bid'ом (Ask'ом) и StopLoss при установке отложенного ордера на предмет превышения минимального отступа StopLevel?

 
Yedelkin:

Но почему в элемент структуры request.tp заносим именно ноль? Ведь если у  нас имеется отложенный ордер на покупку, то request.tp=0 означает, что TP всегда будет находиться ниже текущей цены Bid. И, как мне представляется, ордер с подобным значением TP либо должен быть отклонён из-за неправильно указанного значения параметра TP, либо должен быть немедленно исполнен по текущей цены Bid после принятия такого приказа сервером.
Ноль означает, что нет TP.
 
Yedelkin:

Короче говоря, надо ли всегда проверять расстояние между Bid'ом (Ask'ом) и StopLoss при установке отложенного ордера на предмет превышения минимального отступа StopLevel?

Всегда надо проверять уровень SL/TP/Entry price от отложенниках на предмет минимального отступа в случаях, когда идет работа с установкой ордеров очень близко к рынку.

Если же работа со стопами или ложенниками идет в разумном и отдаленном от рынка режиме (десятки и сотни пунктов), то такую проверку можно пропустить.

 
Renat:

Всегда надо проверять уровень SL/TP/Entry price от отложенниках на предмет минимального отступа в случаях, когда идет работа с установкой ордеров очень близко к рынку.

 Уточняющий вопрос 5.1.

У меня эксперт для каждого отложенного ордера самостоятельно рассчитывает три уровня:  Entry price/SL/TP.

Так как заранее неизвестно, насколько близко/далеко уровень Entry price будет расположен относительно текущей рыночной цены, то проверка уровня Entry price на предмет соблюдения минимального отступа вопросов не вызывает.

Но вот относительно какого уровня проверять оставшиеся два уровня SL/TP? Проверять уровни SL/TP относительно текущей рыночной цены несколько нелогично, так как уровень Entry price может находиться весьма далеко от текущей рыночной цены, и такая проверка теряет всякую актуальность. Поэтому предусмотрел в эксперте проверку условия  |Entry price-TP(SL)|>SYMBOL_TRADE_STOPS_LEVEL. В общем-то эксперт работает нормально с такими условиями, но вот, приступив к оптимизации кода советника, засомневался, нужна ли такая проверка с точки зрения обработки сервером отложенного ордера. Не перегружен ли код эксперта проверкой этого условия (стратегия самого советника такой проверки не требует).

Иными словами, следует ли для постановки отложенного ордера с тремя уровнями Entry price/SL/TP всегда проверять уровни SL/TP на предмет минимального отступа? И если следует, то проверять на предмет минимального отступа относительно какого именно уровня (цены)?

 

Что-то пропала возможность редактирования своего сообщения. Поэтому дополню здесь:

= У меня эксперт для каждого отложенного ордера самостоятельно рассчитывает три уровня:  Entry price/SL/TP. Цель "установить отложенный ордер поближе к рынку" не преследуется.

 

SL и TP в отложенном уровне оцениваются от Entry price так, чтобы они отстояли от него не меньше чем на минимальный уровень.

Так и в МТ4 работает.


 
Renat:

SL и TP в отложенном уровне оцениваются от Entry price так, чтобы они отстояли от него не меньше чем на минимальный уровень.

Так и в МТ4 работает.

ОК, теперь всё понял. Значит, облегчить код советника не получится; изначально всё было сделано в соответствии со статьёй, т.е. правильно.

А с МТ4 не знаком, поэтому такие вопросы "от чайника".  Спасибо!

 
Renat:

...Всегда надо проверять уровень SL/TP/Entry price от отложенниках на предмет минимального отступа в случаях, когда идет работа с установкой ордеров очень близко к рынку.

...SL и TP в отложенном уровне оцениваются от Entry price так, чтобы они отстояли от него не меньше чем на минимальный уровень. 

Вопрос 6. С проверкой минимального отступа при установке отложенных ордеров понятно. Теперь возник вопрос об особенностях проверки минимального отступа при модификации TP/SL открытой позиции.

Ситуация:  открытая позиция имеет фиксированный TP и "подтягивающийся" SL, который приближается к фиксированному TP по мере движения цены в благоприятном направлении. По аналогии с установкой отложенного ордера эксперт каждый раз при отправке приказа на модификацию TP/SL  открытой позиции проверяет минимальный отступ и в отношении уровня TP, и в отношении уровня SL.

Но в описании функции PositionModify из класса CTrade указано, что в качестве параметра tp указывается "Новая цена, по которой сработает Take Profit (либо, если изменение не нужно, предыдущее значение)". 

Соответственно, вопрос: если изменение ранее установленного уровня TP не требуется, нужно ли при отправке приказа на модификацию TP/SL открытой позиции проверять в обязательном порядке минимальный отступ этого уровня TP от текущей (актуальной) цены? Или же в подобной ситуации достаточно ограничиться проверкой минимального отступа только в отношении изменяющегося SL?

Иными словами, можно ли при отправке приказа на модификацию TP/SL открытой позиции не проверять минимальный отступ в отношении TP, если этот уровень TP уже установлен ранее и не подлежит изменению? А в приказе на модификацию просто указывать предыдущее значение TP?

 

На практике, насколько я помню, удается изменить один из уровней (SL или TP) позиции, оставляя другие уровни без изменения, даже в тех случаях, когда уровень, значение которого остается без изменения, находится ближе к текущей цене, чем указано в параметре SYMBOL_TRADE_STOPS_LEVEL. При создании программ я не рекомендую изменять параметры (уровни) позиций таким образом, чтобы новые параметры (уровни) позиции не удовлетворяли требованиям, которые предъявляются при проверке правильности данных позиции, так как такая ситуация является недокументированной и в будущем можно получить другой результат.