Для тестера расчёт индикаторов за прошлые периоды и их чтение вместо расчёта "на лету"

 
При использовании множества индикаторов на разных таймфреймах значения индикаторов постоянно пересчитываются "на лету". Для ускорения процесса тестирования возникла мысль по выбранным валютным парам на все нужные таймфреймы (M5,..,D1) один раз расссчитать значения нужных индикаторов, сохранить их в файлы, и затем при включенном параметре эксперта, что нужно использовать чтение и + режим IsTesting(), читать значения индикаторов из файла вместо расчёта.

Идея в плане реализации уже на 95%, просто возник вопрос, если кто-нибудь это уже делал, каково сравнение производительности двух вариантов - расчёт на лету и чтение значений из файлов?
 

Время работы с файлами всегда на порядок выше. Про mql точно сказать не могу, но в С++ нехилые расчеты с матрицами производилилсь на лету в 40 раз быстрее, чем при работе через файл.

 
chv:
При использовании множества индикаторов на разных таймфреймах значения индикаторов постоянно пересчитываются "на лету". Для ускорения процесса тестирования возникла мысль по выбранным валютным парам на все нужные таймфреймы (M5,..,D1) один раз расссчитать значения нужных индикаторов, сохранить их в файлы, и затем при включенном параметре эксперта, что нужно использовать чтение и + режим IsTesting(), читать значения индикаторов из файла вместо расчёта.

Идея в плане реализации уже на 95%, просто возник вопрос, если кто-нибудь это уже делал, каково сравнение производительности двух вариантов - расчёт на лету и чтение значений из файлов?
Лучше вычислять заранее и сохранять их значения в массивах, а операционка сама разберется, свопить или оставить в ОЗУ. Но то, что пересчет значений индикаторов чрезмерно тормозит в тестере, очень хорошо заметно. Например, если используется Momentum, то тестер выдает результаты в несколько раз быстрее, нежели при использовании RSI.

ИМХО в тестере можно было бы предусмотреть оба варианта, т.е. и предварительный расчет с кэшированием и пересчет на лету. А пользователям позволить выбирать тот или иной вариант в параметрах тестирования. Дело в том, что если кэшировать ZigZag или фракталы, то расхождениям между результатами обоих вариантов будут значительными - оба индикатора являются изменниками и оппортунистами. Поэтому придется наверное еще предусмотреть дополнительный параметр в самих индикаторах, т.е. можно ли их кэшировать или же лучше всякий раз пересчитывать.
 
Я сохраняю в файл записи с датами и основными индикаторами через разделитель (;). Затем при включенном параметре IsLoad файлы первый раз читаются в память, "разбираются на запчасти", т.е. строки на отдельные значения индикаторов, и эти double значения пишутся в массивы, параллельно с датой в другом массиве. Затем в процессе тестирования по iTime запрашивается дата, и на неё из массивов извлекаются значения индикаторов, вместо их расчёта.
Если параметр IsLoad не включен, то идёт расчёт обычным порядком.

Что заметил, почему-то наблюдается разница в числе ордеров и вообще истории торговли при IsLoad = true и IsLoad = false, т.е. расчёте на лету, и чтении готовых значений, это плохо и непонятно, почему. Пробовал сравнивать значения, полученные обоими способами, т.е. прочитанные с рассчитанными - они совпадают один в один. Но история торгов разная. Уже 3-й день пытаюсь понять, пишу в логи всякую всячину, доп.информацию, но толку никакого :(.
 
В соседней ветке Ренат как то писал про функцию "iTime" :

- вызова дорогущей (многопараметрической и универсальной) функции iTime(symbol,timeframe,shift). В одном случае несколько тактов, а в другом полная проходка с поиском графика(символ,период) и обращением к данным

В связи с этим вопрос - не является ли использование этих функий замедлением процесса тестирования?
 
xeon:
В соседней ветке Ренат как то писал про функцию "iTime" :

- вызова дорогущей (многопараметрической и универсальной) функции iTime(symbol,timeframe,shift). В одном случае несколько тактов, а в другом полная проходка с поиском графика(символ,период) и обращением к данным

В связи с этим вопрос - не является ли использование этих функий замедлением процесса тестирования?
Если на своем символе, то в тестере время текущего (тестируемого) бара можно брать из Time[0]
 
Reshetov wrote:

Если на своем символе, то в тестере время текущего (тестируемого) бара можно брать из Time[0]
Да, но время нужно не только текущее, но и на один или два бара назад. А так как таймфреймы на символе в эксперте разные, поэтому Time[i] не подходит, берётся iTime().
 
На прошлой неделе проводил такие опыты. Придумана некая технология для автоматического расчета и кеширования требуемых индикаторов. Постараюсь до конца года выложить.
 
chv:
Reshetov wrote:

Если на своем символе, то в тестере время текущего (тестируемого) бара можно брать из Time[0]
Да, но время нужно не только текущее, но и на один или два бара назад. А так как таймфреймы на символе в эксперте разные, поэтому Time[i] не подходит, берётся iTime().

Было у меня такое начинание, но отказался от него раньше, чем закончил :). Базовую конструкцию пробовал такую:

int start() {
  if (NextRead && !FileIsEnding(handle)) {
    T = FileReadInteger(handle,LONG_VALUE);
    P = FileReadDouble(handle,DOUBLE_VALUE);
//Print(TimeToStr(T));    
    NextRead = false;
  }
  if (Time[1] >= T) {
    while(Time[1] != T && !FileIsEnding(handle)) {
      T = FileReadInteger(handle,LONG_VALUE);
      P = FileReadDouble(handle,DOUBLE_VALUE);
    }
    if (Time[1] == T) {
      Price[1] = P;
      DataCnt++;
    }
    NextRead = true;
  }
То есть идея в том, что если история не дошла до точки в файле прокручиваем историю, если наоборот (скажем пропуски баров  в истории) прокручиваем файл. Проблемы со значениями на старых барах не вижу - если читать текущие значения без пропусков, то ко всем предыдущим стандартное обращение по индексу, как и в расчётном индикаторе. Проблема с разными таймфреймами тоже не совсем понятна - в общем случае значения индикатора будут для разных таймфреймов отличаться, даже если привести входные параметры к одному времени. Выход может быть в том, чтобы зашивать таймфрейм в название файла.
 
Rosh:
На прошлой неделе проводил такие опыты. Придумана некая технология для автоматического расчета и кеширования требуемых индикаторов. Постараюсь до конца года выложить.


Любых индикаторов, с произвольным набором параметров?
В принципе, если совсем не использовать в экспертах 0-й бар, можно всегда кешировать расчёты в файл на диск для индикаторов 1-го бара и ранее, и читать значения при надобности получения из файл-кеша. Расчёты ведь прошлых баров (не 0-го) по идее меняться не должны.

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

 
chv:

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


Идея такая же, в основном. Остается только придумать как это автоматизировать. Придумал, но реализацию еще не начинал.
Причина обращения: