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

 

Опубликована статья Знакомство с MQL5: написание простого советника и индикатора:

В этой статье проведен краткий обзор языка MQL5, приведен пример написания советника и индикатора. Данная статья ориентирована как на читателей, знакомых с программированием на языке MQL4, так и на тех, кто только начинает знакомство с программированием торговых систем и индикаторов.

Автор: Denis

 
Не получается запустить отладчик для индикатора, например MACD или Custom Moving Average. При нажатии на клавишу F5, кнопка "Компилировать" меняется на кнопку "Отмена", через долю секунды экран моргает и все возвращается в исходное состояние. Закладка "Отладка" не появляется. В случае отладки скрипта "AccountInfo" отладчик работает нормально, Build 257.
 
Отладка индикаторов не реализована на текущий момент.
 

С Днём Победы!

Подскажите, пожалуйста.

В советнике приведён цикл поочередного перебора всех открытых позиций. В цикле используется функция PositionGetDouble(POSITION_SL). Из описания параметра POSITION_SL следует, что с его помощью может быть получен уровень Stop Loss для открытой позиции.

Вопрос 1: какое значение покажет  функция PositionGetDouble(POSITION_SL), если открытая позиция сформировалась в итоге срабатывания нескольких отложенных ордеров с разными уровнями  стоп-лоссов?

Вопрос 2: если  открытая позиция сформировалась в итоге срабатывания нескольких отложенных ордеров с разными уровнями  стоп-лоссов, то каким образом лучше получить  данные об уровнях этих стоп-лоссов? 

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

Документация по MQL5: Торговые функции / PositionGetDouble
Документация по MQL5: Торговые функции / PositionGetDouble
  • www.mql5.com
Торговые функции / PositionGetDouble - Документация по MQL5
 
Yedelkin:

С Днём Победы!

Вопрос 1: какое значение покажет  функция PositionGetDouble(POSITION_SL), если открытая позиция сформировалась в итоге срабатывания нескольких отложенных ордеров с разными уровнями  стоп-лоссов?
а вы проверяли что возвращает функция?
 
sergeev:
а вы проверяли что возвращает функция?

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

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

Как Вы сами прекрасно понимаете, мои вопросы касаются теоретически-прикладных аспектов, которые не отражены в текущей версии Справочника по MQL5, а также в имеющихся статьях по  советникам на MQL5.

При таких условиях считаю гораздо более разумным задавать сведущим людям (разработчикам языка и авторам статей) вопросы по тем или иным теоретически-прикладным аспектам функций MQL5, а не заниматься каждый раз проведением экспериментов, "проверкой, что возвращает функция" при тех или иных условиях, и тому подобной самодеятельностью.

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

 

Ответ нашёл. В Руководстве пользователя клиентского терминала:

...Уровни Тейк Профит и Стоп Лосс устанавливаются для позиции по последнему ордеру (рыночному или сработавшему отложенному).
Иными словами, стоп уровни в каждом последующем ордере по одной позиции заменяют предыдущие. 
...Срабатывание ордеров Тейк профит и Стоп Лосс приводит к полному закрытию позиции.  

Странно. Так как для каждого финансового инструмента возможна только одна открытая позиция, то получается, что сценарии с частичным закрытием позиции по стоп-лоссу не могут быть реализованы в принципе?

P.S. После выяснения этой особенности, заложенной в МТ5, отпадает необходимость осуществлять проверку того, какое значение возвращает функция PositionGetDouble(POSITION_SL), если открытая позиция сформировалась в итоге срабатывания нескольких отложенных ордеров с разными уровнями  стоп-лоссов.

 
Yedelkin:

Ответ нашёл. В Руководстве пользователя клиентского терминала:

Странно. Так как для каждого финансового инструмента возможна только одна открытая позиция, то получается, что сценарии с частичным закрытием позиции по стоп-лоссу не могут быть реализованы в принципе?

P.S. После выяснения этой особенности, заложенной в МТ5, отпадает необходимость осуществлять проверку того, какое значение возвращает функция PositionGetDouble(POSITION_SL), если открытая позиция сформировалась в итоге срабатывания нескольких отложенных ордеров с разными уровнями  стоп-лоссов.

можно сделать в виде функции "изподвыподверт выпертый подвыперт" которая будет разбивать тейк профит согласно обьёмам сделок на данном инструменте на отложенные ордера по уровням

но лично я для себя считаю данную функцию излишней поскольку плотно знаком с оффициальными торговыми терминалами где нету локирований

 
CoreWinTT:

можно сделать в виде функции "изподвыподверт выпертый подвыперт" ...

Да, я уже чесал репу на эту тему. Получается три варианта :)

- либо творчески перерабатывать имеющиеся сценарии под особенности МТ5;

- либо создавать класс подвыверт-функций "С-подвыверты";

- либо избегать использования стоп-лоссов и тейк-профитов в ордерах, изначально оперируя вместо них связками ордеров противоположной направленности.

Ничё, прорвёмся! :) 

 

Вопрос по поводу размещения функций ArraySetAsSeries в советнике.

Функции ArraySetAsSeries размещены в функции OnTick() сразу после функций CopyTime, CopyHigh и CopyLow.

Имеются ли какие-нибудь препятствия для размещения функций  ArraySetAsSeries в функции OnInit(), или же массивы всегда следует индексировать только после их копирования?

Документация по MQL5: Операции с массивами / ArraySetAsSeries
Документация по MQL5: Операции с массивами / ArraySetAsSeries
  • www.mql5.com
Операции с массивами / ArraySetAsSeries - Документация по MQL5
 
Yedelkin:

Вопрос по поводу размещения функций ArraySetAsSeries в советнике.

Функции ArraySetAsSeries размещены в функции OnTick() сразу после функций CopyTime, CopyHigh и CopyLow.

Имеются ли какие-нибудь препятствия для размещения функций  ArraySetAsSeries в функции OnInit(), или же массивы всегда следует индексировать только после их копирования?

Для индикаторных буферов говорится SetIndexBuffer:

Примечание

После связывания динамический массив buffer[]  будет иметь индексацию как в обычных массивах, даже если для связываемого массива будет предварительно установлена индексация как в таймсериях. Если необходимо изменить порядок доступа к элементам индикаторного массива, необходимо применить функцию ArraySetAsSeries() после связывания массива функцией SetIndexBuffer().

Для советников должно быть аналогично, проверьте