Обсуждение статьи "LifeHack для трейдера: готовим фастфуд из индикаторов"

 

Опубликована статья LifeHack для трейдера: готовим фастфуд из индикаторов:

Если вы переходите на MQL5 только сейчас, то эта статья вам пригодится: с одной стороны, доступ к данным индикаторов и к сериям выполнен в привычном вам MQL4-стиле, с другой — вся реализация этой простоты написана на MQL5. Все функции максимально понятны и отлично подходят для пошаговой отладки.

Теперь, по прошествии 12 лет, современным трейдерам жалобы на сложность MQL4 кажутся непонятными, но история повторяется. Так же, как и тогда, некоторые трейдеры заявляют, что MQL5 сложен для изучения и написания стратегий, не то что MQL4. Значит, общий уровень программирования торговых роботов за эти годы существенно поднялся, и всё это — благодаря тому, что разработчик не побоялся двигаться дальше и дал алготрейдерам еще более мощные инструменты языка C++. Новый MQL5 позволяет программисту максимально подробно проверять результаты всех операций (особенно это важно для обработки торговых транзакций) и аккуратно, по требованию, пользоваться оперативной памятью. В старом MQL4, до того, как его подтянули до уровня MQL5, таких возможностей было значительно меньше. Да и сам синтаксис был менее строгим.

Думается, что пройдет еще немного времени — и споры о том, сложнее язык MQL5 или нет, также станут достоянием истории. Но поскольку еще многие трейдеры помнят "MQL4, милый MQL4", то попробуем для них показать, как могут выглядеть знакомые им MQL4-функции, реализованные на MQL5.

"MACD MQL4 style EA short.mh5" in tester

Автор: Vladimir Karputov

 

Отлично...

 

Статья является небольшой выдержкой другой. Ничего не предпринято для эффективной работы. Никакого кеширования индикаторов и таймсерий. Отсутствуют High[i], Low[i] и т.д. Нет iCustom.

Ожидалось увидеть совсем другое. Тем более, какой смысл фастфуда в советниках, если все равно им и не пахнет в исходниках?

   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name())
           {
            //--- long position is opened
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               //--- should it be closed?
               if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && 
                  MacdCurrent>(MACDCloseLevel*m_adjusted_point))
                 {
                  //--- close position and exit
                  if(!m_trade.PositionClose(m_position.Ticket()))
                     Print("PositionClose error ",m_trade.ResultRetcodeDescription());
                  return;
                 }
               //--- check for trailing stop
               if(TrailingStop>0)
                 {
                  if(m_position.PriceCurrent()-m_position.PriceOpen()>m_adjusted_point*TrailingStop)
                    {
                     if(m_position.StopLoss()<m_symbol.Bid()-m_adjusted_point*TrailingStop)
                       {
                        //--- modify position and exit
                        if(!m_trade.PositionModify(m_position.Ticket(),
                           m_symbol.NormalizePrice(m_position.PriceCurrent()-m_adjusted_point*TrailingStop),
                           m_position.TakeProfit()))
                           Print("PositionModify error ",m_trade.ResultRetcodeDescription());
                        return;
                       }
                    }
                 }
              }

            if(m_position.PositionType()==POSITION_TYPE_SELL)
              {
               //--- should it be closed?
               if(MacdCurrent<0 && MacdCurrent>SignalCurrent && 
                  MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*m_adjusted_point))
                 {
                  //--- close position and exit
                  if(!m_trade.PositionClose(m_position.Ticket()))
                     Print("PositionClose error ",m_trade.ResultRetcodeDescription());
                  return;
                 }
               //--- check for trailing stop
               if(TrailingStop>0)
                 {
                  if((m_position.PriceOpen()-m_position.PriceCurrent())>(m_adjusted_point*TrailingStop))
                    {
                     if((m_position.StopLoss()>(m_symbol.Ask()+m_adjusted_point*TrailingStop)) || (m_position.StopLoss()==0.0))
                       {
                        //--- modify position and exit
                        if(!m_trade.PositionModify(m_position.Ticket(),
                           m_symbol.NormalizePrice(m_symbol.Ask()+m_adjusted_point*TrailingStop),
                           m_position.TakeProfit()))
                           Print("PositionModify error ",m_trade.ResultRetcodeDescription());
                        return;
                       }
                    }
                 }
              }
           }
Переход с MQL4 на MQL5
Переход с MQL4 на MQL5
  • 2010.05.11
  • Sergey Pavlov
  • www.mql5.com
Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
 
fxsaber:

Статья является небольшой выдержкой другой. Ничего не предпринято для эффективной работы. Никакого кеширования индикаторов и таймсерий. Отсутствуют High[i], Low[i] и т.д. Нет iCustom.

Ожидалось увидеть совсем другое. Тем более, какой смысл фастфуда в советниках, если все равно им и не пахнет в исходниках?


Вот Вам пример типичного MQL4-ка - не прочитав, не посмотрев кода сразу на трибуну с флагами :) .

 
Vladimir Karputov:

Вот Вам пример типичного MQL4-ка - не прочитав, не посмотрев кода сразу на трибуну с флагами :) .

Перед комментарием был прочтен не только текст статьи, но и всех приложенных исходников (включая анализ IndicatorsMQL4.mqh VS IndicatorsMQL5.mqh ).

 
fxsaber:

Перед комментарием был прочтен не только текст статьи, но и всех приложенных исходников (включая анализ IndicatorsMQL4.mqh VS IndicatorsMQL5.mqh ).


Видно просмотрели (прозевали) файл MQL5\Include\SimpleCall\Series.mqh. 

Про кеширования - это Ваши личные догадки (ожидания).

Это статья не ставит целью обмануть MQL4 пользователя путём "подключите мой файл и можно дальше бездумно работать в стиле MQL4", здесь показывается как перенести старый подход в обращении к индикаторам на MQL5.

 
Vladimir Karputov:

Видно просмотрели (прозевали) файл MQL5\Include\SimpleCall\Series.mqh. 

Прочел внимательно. Где High[i] и т.д.?

Про кеширования - это Ваши личные догадки (ожидания).

Это статья не ставит целью обмануть MQL4 пользователя путём "подключите мой файл и можно дальше бездумно работать в стиле MQL4", здесь показывается как перенести старый подход в обращении к индикаторам на MQL5.

Где iCustom? Вы бездумно почти скопи-пастили часть другой статьи, получив провал в производительности. Фактически обманывая пользователей, что это издержки MQL4-style, а не вашей реализации.

Здесь были замеры производительности, показывающие, что MQL4-style в некоторых вопросах ничем не уступает по производительности MQL5. С индикаторами можно было сделать то же самое.

Вот одна из реализаций таймсерий. Видно, что Автор постарался, сделав упор на производительности и немного отойдя (так ему удобнее) от MQL4-style (можно допилить идею при желании). 

Высокопроизводительная библиотека iTimeSeries
Высокопроизводительная библиотека iTimeSeries
  • голосов: 25
  • 2017.05.25
  • nicholishen
  • www.mql5.com
Одной из основных проблем с MQL5 до сих пор было удаление встроенных функций для работы с таймсериями. Несмотря на то, что такой подход расширил для программистов возможности разработки, он также замедлил работу из-за обязательного шага по созданию и удалению новых ячеек памяти каждый раз, когда требуется доступ к данным таймсерии.  Рассмотрим...
 
fxsaber:

Прочел внимательно. Где High[i] и т.д.?

Где iCustom? Вы бездумно почти скопи-пастили часть другой статьи, получив провал в производительности. Фактически обманывая пользователей, что это издержки MQL4-style, а не вашей реализации.

Здесь были замеры производительности, показывающие, что MQL4-style в некоторых вопросах ничем не уступает по производительности MQL5. С индикаторами можно было сделать то же самое.

Вот одна из реализаций таймсерий. Видно, что Автор постарался, сделав упор на производительности и немного отойдя (так ему удобнее) от MQL4-style (можно допилить идею при желании). 


Для более быстрого привыкания к MQL5 оставлены только iXXXX функции серий, так как они имеет более полные параметры (symbol, timeframe, shift) которые без труда позволят заменить более узкоспециализированные High[] и т.д. Задача не в том, чтобы пользователь продолжал бездумно пользовать MQL4, а начинал потихоньку свой MQL4 код переписывать.

iCustom даже в планах не было - рассматривались только стандартные индикаторы.

Про кеширование - это точно не в статье для широкой публики.


Добавлено: кстати по отзывам пользователей будет ясно, нужны ли High[] и им подобные функции или можно обойтись сериями iXXXX

 
Vladimir Karputov:

Задача не в том, чтобы пользователь продолжал бездумно пользовать MQL4, а начинал потихоньку свой MQL4 код переписывать.

MQL4-style - чистый MQL5. Ничем не хуже СБ. Не надо бороться с ветряными мельницами в своем воображении. Вы же не боретесь cо StandartLibrary-Style.

iCustom даже в планах не было - рассматривались только стандартные индикаторы.

Про кеширование - это точно не в статье для широкой публики.

В темах MT4 vs MT5, касаемо индикаторов, стандартные занимали минимум обсуждений. Почти все говорили про кастомные. Стандартные были написаны десятки лет назад и безвозвратно устарели. Работа в продвинутом MQL5  с древнейшими индикаторами выглядит странно.

Кеширование нужно было не объяснять в статье, а делать, раз уж взялись за объективность своих выводов по отношению к MQL4-style.

падение скорости тестирования при одновременном доступе более чем к одному индикатору;

 
Vladimir Karputov:

Добавлено: кстати по отзывам пользователей будет ясно, нужны ли High[] и им подобные функции или можно обойтись сериями iXXXX

Сделайте опрос и увидите результат без высказываний в виде комментариев. Это же касается даже таких простых вещей, как Bid/Ask-переменные.

 

Статья должна называться "как нельзя писать код, пытаясь сохранить MQL4 представление".

Жесткий ужас с утечками хендлов(зачем закрывать хендл индикатора?) и потрясающим оверхедом(пытаться пересоздавать индикатор, проваливаясь внутрь менеджера индикаторов). И ведь достаточно людей скопирует это не глядя и не понимая.

Кроме того, неэффективное извлечение по 1 значению из индикатора.

Статью почел полностью, коды просмотрел достаточно.