В каких случаях есть смысл держать часть кода робота в индикаторе? - страница 33

 

Зело полезный дискурс...

И зная ресурс и потенциал участников, провокационно предлагаю замерить скорость и "неглотательность" тиков в:

1) Советниге

2) зацикленном с частотой 1 милисеконд скрипте

3) индюке

4) стороннем DDE приёмнике.

Для неофитных адептов - типа меня, тоже будет полезно.

;)

 

На ночь глядя:

Файлы:
experts.zip  1 kb
 

Добавлю свои пять копеек:

Скорость работы экспертов, индикаторный код в которых целиком размещён в эксперте, зачастую эдак раза в три быстрее, чем у их аналогов с вызовами пользовательских индикаторов. Это справедливо для вариантов с очень тяжёлыми индикаторными расчётами. Если эти расчёты очень лёгкие, то разницы никакой не будет. В индикаторе EMA слишком примитивный расчёт, для того чтобы его использовать в таких замерах. В какой-то из своих последних статей на этом сайте я даже выкладывал варианты эксперта с очень тяжёлым индикаторным расчётом JMA. Вариант с кодом без вызовов индикаторов работает в три раза быстрее.

У меня лично нет никакого желания кому-то и что-то доказывать, я просто излагаю выводы, которые видел собственными глазами и далеко не один раз, хотя, конечно, я не занимаюсь такими вещами бесконечно, и вполне может быть, что в последних билда МТ4 картина эта стала выглядеть как-то иначе. И даж в МТ5 на первых порах всё было абсолютно аналогично. Но такие детали я не отслеживаю и поэтому не могу утверждать, что сейчас всё именно так и осталось.

 

GODZILLA:

В какой-то из своих последних статей на этом сайте я даже выкладывал варианты эксперта с очень тяжёлым индикаторным расчётом JMA. Вариант с кодом без вызовов индикаторов работает в три раза быстрее.

Тут? Вывод прост, возможны 3 варианта:

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

2. индикатор написан неэффективно.

3. приведенные цифры не отражают действительности.

 
GODZILLA:

Добавлю свои пять копеек:

Скорость работы экспертов, индикаторный код в которых целиком размещён в эксперте, зачастую эдак раза в три быстрее, чем у их аналогов с вызовами пользовательских индикаторов. Это справедливо для вариантов с очень тяжёлыми индикаторными расчётами. Если эти расчёты очень лёгкие, то разницы никакой не будет. В индикаторе EMA слишком примитивный расчёт, для того чтобы его использовать в таких замерах. В какой-то из своих последних статей на этом сайте я даже выкладывал варианты эксперта с очень тяжёлым индикаторным расчётом JMA. Вариант с кодом без вызовов индикаторов работает в три раза быстрее.

У меня лично нет никакого желания кому-то и что-то доказывать, я просто излагаю выводы, которые видел собственными глазами и далеко не один раз, хотя, конечно, я не занимаюсь такими вещами бесконечно, и вполне может быть, что в последних билда МТ4 картина эта стала выглядеть как-то иначе. И даж в МТ5 на первых порах всё было абсолютно аналогично. Но такие детали я не отслеживаю и поэтому не могу утверждать, что сейчас всё именно так и осталось.


Не смешите. Вы просто еще не научились писать индикаторы.

После такой ереси:

//---- ЭМУЛЯЦИЯ ИНДИКАТОРНЫХ БУФЕРОВ
  int NewSize = iBars(symbol, timeframe);
  //----  Проверка на смену нулевого бара
  if(ArraySize(Ind_Buffer0) < NewSize)
    {
      //---- Установить прямое направление индексирования в массиве 
      ArraySetAsSeries(Ind_Buffer0, false);
      ArraySetAsSeries(Ind_Buffer1, false);
      ArraySetAsSeries(Ind_Buffer2, false);
      //---- Изменить размер эмулируемых индикаторных буферов 
      ArrayResize(Ind_Buffer0, NewSize); 
      ArrayResize(Ind_Buffer1, NewSize); 
      ArrayResize(Ind_Buffer2, NewSize); 
      //---- Установить обратное направление индексирования в массиве 
      ArraySetAsSeries(Ind_Buffer0, true);
      ArraySetAsSeries(Ind_Buffer1, true);
      ArraySetAsSeries(Ind_Buffer2, true); 
    } 
//----

могли бы вообще воздержаться от своего мнения в этой теме. 

 

Разоблачение заблуждения №1: можно обойтись без IndicatorCounted()

Индюк с оным:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red

extern double Alpha = 0.9;

double EMA[];

int init()
{
   SetIndexBuffer(0, EMA);
   return(0);
}

int start()
{
   int toCount = MathMin(Bars - 1, Bars - IndicatorCounted());
   if (toCount == Bars - 1) EMA[Bars - 1] = Open[Bars - 1];
   for(int i = toCount - 1; i >= 0; i--)
   {
      EMA[i] = (1 - Alpha)*Open[i] + Alpha*EMA[i + 1];
   }
   return(0);
}

Без оного, по принципу hrenfx

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Yellow

extern double Alpha = 0.9;

double EMABuffer[];

double GetPrice( int Shift )
{
  return(Open[Shift]);
}

double EMA;

int init()
{
   EMA = GetPrice(Bars - 1);

   SetIndexBuffer(0, EMABuffer);
   return(0);
}

double GetEMA()
{
   static int PrevTime = 0;

   if (PrevTime == Time[0])
      return(EMA);

   int i = iBarShift(Symbol(), Period(), PrevTime) - 1;

   PrevTime = Time[0];
   while (i >= 0)
   {
      EMA = EMA * Alpha + (1 - Alpha) * GetPrice(i);
      EMABuffer[i] = EMA;
      i--;
   }
   return(EMA);
}

void start()
{
  GetEMA();
}

Далее накидываем индюки на график и эмулируем потерю связи во время работы автомата. Результат:


 

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

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

Выше привел скрин, где видно, что после разрыва связи сравнивается советник (не индикатор из советника) с iCustom. Там обрыв связи проходит без проблем.

 

Предполагаю, что на первом тике после обрыва связи индикатор не срабатывает сразу. Точнее индикатор ждет выполнения функции IndicatorCounted(). А это функция может исполняться (в зависимости от связи) до нескольких секунд. Т.е. такая схема:

  1. Первый тик после обрыва связи.
  2. Запустился индикатор.
  3. Идет исполнение IndicatorCounted() (похоже, что сразу после запуска индикатора, даже если IndicatorCounted() не присутствует в теле индикатора) в течение некоторого времени.
  4. После получения результата идет обновление торгового окружения.
  5. И индикатор начинает исполнять свой код так, как будто запустился не на первом тике, а на крайнем тике, предшествующем результату IndicatorCounted().

P.S. Тестирую на 226-м билде.

 
Получается, что для абсолютной надежности советников "все в одном" надо делать в самом начале функции старт вызов ПУСТОГО индикатора и RefreshRates(). Это и будет гарантировать подкачку истории (после обрыва) и исполнение советника на первом тике, соответствующем уже закачанной истории.
 
hrenfx:
Получается, что для абсолютной надежности советников "все в одном" надо делать в самом начале функции старт вызов ПУСТОГО индикатора и RefreshRates(). Это и будет гарантировать подкачку истории (после обрыва) и исполнение советника на первом тике, соответствующем уже закачанной истории.


А исследования и проверки по этой догадке выложить можете?

хм... если это так, и дает гарантию загрузки, то вариант очень даже ничего.

видел ветку ForexTools, где так не было решения проблемы подкачки истории в момент старта терминала и эксперта.


Причина обращения: