Как можно ограничить начало и конец вычисления индикаторов?

 

Часто приходится работать с множеством индикаторов, и притом, что для анализа нужен небольшой кусочек истории, который размещается на экране, индикатор рассчитывается для всей имеющейся истории. Если мы переключимся на временной период М1, то обнаружим там 4 млн баров с 1999 года.

И если мы всего лишь рассчитываем скользящую среднюю, то нам потребуется 31 Мб и это для самого простейшего индикатора, 125 мб для MACD, а есть и более сложные индикаторы и мультивалютные стратегии. Следовательно, возникает вопрос: как можно ограничить расчет индикатора, чтобы например можно было задавать начальную и конечную дату на которой нужно производить вычисления и не тратить колоссальные ресурсы производительности и памяти, которой адресного пространства всего 2 Гб, и его невозможно увеличить, докупая память, на расчет большинства не интересующих баров.

Можно конечно предложить: задать параметр (Графики / Макс баров в окне) – но этот вариант не подходит, так как, становится сразу недоступна большая часть истории котировок, а она необходима для тестирования стратегии на определенном интервале.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
gal:

Часто приходится работать с множеством индикаторов, и притом, что для анализа нужен небольшой кусочек истории, который размещается на экране, индикатор рассчитывается для всей имеющейся истории. Если мы переключимся на временной период М1, то обнаружим там 4 млн баров с 1999 года.

И если мы всего лишь рассчитываем скользящую среднюю, то нам потребуется 31 Мб и это для самого простейшего индикатора, 125 мб для MACD, а есть и более сложные индикаторы и мультивалютные стратегии. Следовательно, возникает вопрос: как можно ограничить расчет индикатора, чтобы например можно было задавать начальную и конечную дату на которой нужно производить вычисления и не тратить колоссальные ресурсы производительности и памяти, которой адресного пространства всего 2 Гб, и его невозможно увеличить, докупая память, на расчет большинства не интересующих баров.

Можно конечно предложить: задать параметр (Графики / Макс баров в окне) – но этот вариант не подходит, так как, становится сразу недоступна большая часть истории котировок, а она необходима для тестирования стратегии на определенном интервале.

Буквально 5-ю темами ниже. Смотрите решение в моём последнем посте.

Отрисовка n последних баров в индикаторе.


 
gal:
joo:

Буквально 5-ю темами ниже. Смотрите решение в моём последнем посте.

Отрисовка n последних баров в индикаторе.


не покатит нельзя ставить ссылки

//+------------------------------------------------------------------+
int simble(double &in[],double &Out[])
  {
   int i=ArraySize(in)-1;
   while(i>=0)
     {
      Out[i]=in[i];
      i--;
     }
  }
//+------------------------------------------------------------------+

через такую функцию не пройдёт.

так что особого смысла в этом не вижу

 
CoreWinTT:

не покатит нельзя ставить ссылки

через такую функцию не пройдёт.

так что особого смысла в этом не вижу

Ничего не понял. Что не покатит? В чем нет смысла?
 

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

например возмём твой шаблон и функцию

расчета скользящей средней от массива.

  //-------------------Основной цикл индикатора-------------------------
    while (i<History)
    {
      HiBuffer[i]=iMAOnArrayMql4(high,History,13,0,MODE_EMA,i);
      i++;
    }
    //---------------Конец основного цикла индикатора---------------------

получается такая штука

'high' - parameter conversion is not allowed    тест.mq5    68    34

получается что опять приходится дейсвовать через дополнительным массив.....

если прочитать хелп про 

CopyClose

то можно сразу скопировать в массив и перевернуть его "сет ас сериес"....

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

 
CoreWinTT:

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

например возмём твой шаблон и функцию

расчета скользящей средней от массива.

получается такая штука

получается что опять приходится дейсвовать через дополнительным массив.....

если прочитать хелп про 

CopyClose

то можно сразу скопировать в массив и перевернуть его "сет ас сериес"....

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

Ааа, ешкин паровоз. Суть то не в этом, а в том, что считаться индюк будет один раз на каждом баре заданное количество баров истории, а не на каждом тике.

Как и хотел топикстартер, как хотел и я в в своей теме.

А уж что с массивами делать, как их считать, это уже другое дело. У мну же там просто шаблончик.

А

high[]
действительно передавать в функции нельзя. Для OHLC я обычно держу отдельные глобальные массивы объявленные как таймсерии. High[] же как в 4-ке нет.


 
joo:

Ааа, ешкин паровоз. Суть то не в этом, а в том, что считаться индюк будет один раз на каждом баре заданное количество баров истории, а не на каждом тике.

Как и хотел топикстартер, как хотел и я в в своей теме.

А уж что с массивами делать, как их считать, это уже другое дело. У мну же там просто шаблончик.

А

действительно передавать в функции нельзя. Для OHLC я обычно держу отдельные глобальные массивы объявленные как таймсерии. High[] же как в 4-ке нет.


да согласен,

у меня тож глобальные буферы и там уже производные цен...

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

и использовать её уже для расчета индикатора.


 
CoreWinTT:

да согласен,

у меня тож глобальные буферы и там уже производные цен...

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

и использовать её уже для расчета индикатора.


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

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

вот цитата ArrayResize 

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

 

никак....

даже если поставить в свойствах

ограничение видимости то все равно терминал считает все данные

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

а язык мкл5 как создание необходимой среды для индикаторов и аналитических программам.

притом что индикатор или программа могут быть созданны на языке мкл5 

но разрабатывать среду придётся самим

 
CoreWinTT:

никак....

даже если поставить в свойствах

ограничение видимости то все равно терминал считает все данные

Поставьте ограничение в 50 тыс баров (предполагается, что до этого стоял анлимитед), перезагрузите терминал и увидите разницу.