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

 
Renat Fatkhullin:

...

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

...

Все это в теории. А на практике 99% индикаторов - это расчет в кольцевых буферах FIFO: удалили последний элемент, добавили новый, пересчитали индикатор. Т.е. опять-таки на практике добавление в расчетный буфер идет по одному элементу и 99% всех расчетов в индикаторе - это добавление по одному элементу. Поэтому идея заложенная в CopyBuffer, CopyRates, CopyXXX красива но не соответствует предметной области.

 
Renat Fatkhullin:

...

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

...

На счет сказанного непонятно, что имели в виду. Хендлы, на сколько понимаю, нигде не закрываются (вызовов IndicatorRelease не наблюдается). Есть постоянное обращение к стандартным функциям создания хендла, типа iMACD:

//+------------------------------------------------------------------+
//| iMACD function in MQL4 notation                                  |
//|   The buffer numbers are the following:                          |
//|      MQL4 0 - MODE_MAIN, 1 - MODE_SIGNAL                         |
//|      MQL5 0 - MAIN_LINE, 1 - SIGNAL_LINE                         |
//+------------------------------------------------------------------+
double   iMACD(
               string                     symbol,              // symbol name 
               ENUM_TIMEFRAMES            timeframe,           // timeframe 
               int                        fast_ema_period,     // period for Fast average calculation 
               int                        slow_ema_period,     // period for Slow average calculation 
               int                        signal_period,       // period for their difference averaging 
               ENUM_APPLIED_PRICE         applied_price,       // type of price or handle 
               int                        buffer,              // buffer 
               int                        shift                // shift
               )
  {
   
   double result=NaN;
//---
   int handle=iMACD(symbol,timeframe,fast_ema_period,slow_ema_period,signal_period,applied_price);
   if(handle==INVALID_HANDLE)
     {
      Print(__FUNCTION__,": INVALID_HANDLE error=",GetLastError());
      return(result);
     }
   double val[1];
   int copied=CopyBuffer(handle,buffer,shift,1,val);
   if(copied>0)
      result=val[0];
   else
      Print(__FUNCTION__,": CopyBuffer error=",GetLastError());
   return(result);
  }

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

 
Vasiliy Sokolov:

Все это в теории. А на практике 99% индикаторов - это расчет в кольцевых буферах FIFO: удалили последний элемент, добавили новый, пересчитали индикатор. Т.е. опять-таки на практике добавление в расчетный буфер идет по одному элементу и 99% всех расчетов в индикаторе - это добавление по одному элементу. Поэтому идея заложенная в CopyBuffer, CopyRates, CopyXXX красива но не соответствует предметной области.

Это если писать простейшие и примитивные last look обработчики. Но как только делаешь шаг в сторону и начинаешь проверять 2 или более точек, то сразу видишь разницу и эффект.

Вообще конечно странно слышать, что CopyXXX функции якобы не в предметной области.

Очень сильно надо стараться, чтобы такое про базовые функции доступа к рыночному окружению сказать.


Ну и еще - не зря индикаторам выдается 100% всей истории для расчетов:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
Это в доказательство, что нет никаких "99% в кольцевом буфере". Очень как нужны именно массовые доступы к истории, а не одиночные последние значения.
 
Vasiliy Sokolov:

На счет сказанного непонятно, что имели в виду. Хендлы, на сколько понимаю, нигде не закрываются (вызовов IndicatorRelease не наблюдается). Есть постоянное обращение к стандартным функциям создания хендла, типа iMACD:

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

Вся игра построена на хаке и полному пренебрежению к контролю хендлов.

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

Виноват известно кто.

 
fxsaber:

Статья является небольшой выдержкой другой

Аналогий не увидел.

fxsaber:

Ничего не предпринято для эффективной работы. Никакого кеширования индикаторов и таймсерий. 

Здесь действительно есть задел для оптимизации. Ввести кеширование было бы очень хорошей идеей.

fxsaber:

Отсутствуют High[i], Low[i] и т.д.

А должны присутствовать? Вроде название статьи (вернее ее описание) четко говорит только о индикаторах?

fxsaber:

Нет iCustom.

К сожалению, MQL не поддерживает функции с произвольным количеством параметров, поэтому iCustom не видится возможным реализовать "так же как в MT4"

fxsaber:

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

Я не думаю что в рамках одной статьи можно написать целый полноценный движок полностью эмулирующий МТ4 style. Тема была заявлена четко: работа с индикаторами в стиле MQL4 (жаль название статьи не отражает тему что и запутывает).

 
Renat Fatkhullin:

...

Это в доказательство, что нет никаких "99% в кольцевом буфере". Очень как нужны именно массовые доступы к истории, а не одиночные последние значения.

Есть и и используются чуть чаще чем постоянно. Просто каких-то спец.средств нет и разработчикам приходится лепить вложенные циклы. Откройте любой индикатор с двойным вложенным for'ом: поздравляю, кольцевой буфер найден. Вот пример вашего суперэффективного расчета индикатора MFI:

//+------------------------------------------------------------------+
//| Calculate MFI by volume from argument                            |
//+------------------------------------------------------------------+
void CalculateMFI(const int nPosition,
                  const int nRatesCount,
                  const double &HiBuffer[],
                  const double &LoBuffer[],
                  const double &ClBuffer[],
                  const long &VolBuffer[],
                  const datetime &time[])
  {
   for(int i=nPosition;i<nRatesCount && !IsStopped();i++)
     {
      double dPositiveMF=0.0;
      double dNegativeMF=0.0;
      double dCurrentTP=TypicalPrice(HiBuffer[i],LoBuffer[i],ClBuffer[i]);
      if(time[i] == D'2016.05.23')
         int dbg = 4;
      for(int j=1;j<=ExtMFIPeriod;j++)
        {
         int    index=i-j;
         double dPreviousTP=TypicalPrice(HiBuffer[index],LoBuffer[index],ClBuffer[index]);
         if(dCurrentTP>dPreviousTP)
            dPositiveMF+=VolBuffer[index+1]*dCurrentTP;
         if(dCurrentTP<dPreviousTP)
            dNegativeMF+=VolBuffer[index+1]*dCurrentTP;
         dCurrentTP = dPreviousTP;
        }
      if(dNegativeMF!=0.0) ExtMFIBuffer[i]=100.0-100.0/(1+dPositiveMF/dNegativeMF);
      else                 ExtMFIBuffer[i]=100.0;
     }
  }

Ну очевидно же, что скорость расчета этого индикатора зависит от периода усреднения, а так быть не должно. И таких примеров масса, часть из которой написана самой MQ, а Вы говорите кольцевых буферов нет.

 
Vasiliy Sokolov:

Есть и и используются чуть чаще чем постоянно. Просто каких-то спец.средств нет и разработчикам приходится лепить вложенные циклы. Откройте любой индикатор с двойным вложенным for'ом: поздравляю, кольцевой буфер найден. Вот пример вашего суперэффективного расчета индикатора MFI:

Ну очевидно же, что скорость расчета этого индикатора зависит от периода усреднения, а так быть не должно. И таких примеров масса, часть из которой написана самой MQ, а Вы говорите кольцевых буферов нет.

Их нет в 99% случаев. И в 90% нет и в 50% нет. Зато есть 100% объем исходных данных(на всю глубину истории) в параметрах OnCalculate.

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

Вы же пытаетесь представить ситуацию так, что "весь рынок анализа представлен последним значением индикатора" и "CopyXXXX не соответствует предметной области".

Очень стараетесь набросить.

 
Renat Fatkhullin:

...

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

...

Обратите, пожалуйста, внимание на заявку #1923700. Есть некоторые проблемы с частым получением большого количества данных.

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

 
Renat Fatkhullin:

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

Точно также этот другой трейдер может начать делать вызовы стандартных iХендлов, с разными параметрами. Если параметры разные - будут создаваться разные индикаторы, не зависимо от того, работаешь ты с хендлом напрямую или используешь MQL4-Style.

 
Renat Fatkhullin:

Очень стараетесь набросить.

А вот за это обидно.

И речь даже не об расчетах индикаторов, а об использовании как результатов индикаторов.

Это да.

Renat Fatkhullin:

...

Короче, не буду спорить, т.к. это бессмысленно. Интересно было бы собрать статистику по использованию функций Copy***. То, сколько элементов пользователи копируют в среднем, показало бы многое.