Время работы с файлами всегда на порядок выше. Про mql точно сказать не могу, но в С++ нехилые расчеты с матрицами производилилсь на лету в 40 раз быстрее, чем при работе через файл.
При использовании множества индикаторов на разных таймфреймах значения индикаторов постоянно пересчитываются "на лету". Для ускорения процесса тестирования возникла мысль по выбранным валютным парам на все нужные таймфреймы (M5,..,D1) один раз расссчитать значения нужных индикаторов, сохранить их в файлы, и затем при включенном параметре эксперта, что нужно использовать чтение и + режим IsTesting(), читать значения индикаторов из файла вместо расчёта.
Идея в плане реализации уже на 95%, просто возник вопрос, если кто-нибудь это уже делал, каково сравнение производительности двух вариантов - расчёт на лету и чтение значений из файлов?
ИМХО в тестере можно было бы предусмотреть оба варианта, т.е. и предварительный расчет с кэшированием и пересчет на лету. А пользователям позволить выбирать тот или иной вариант в параметрах тестирования. Дело в том, что если кэшировать ZigZag или фракталы, то расхождениям между результатами обоих вариантов будут значительными - оба индикатора являются изменниками и оппортунистами. Поэтому придется наверное еще предусмотреть дополнительный параметр в самих индикаторах, т.е. можно ли их кэшировать или же лучше всякий раз пересчитывать.
Если параметр IsLoad не включен, то идёт расчёт обычным порядком.
Что заметил, почему-то наблюдается разница в числе ордеров и вообще истории торговли при IsLoad = true и IsLoad = false, т.е. расчёте на лету, и чтении готовых значений, это плохо и непонятно, почему. Пробовал сравнивать значения, полученные обоими способами, т.е. прочитанные с рассчитанными - они совпадают один в один. Но история торгов разная. Уже 3-й день пытаюсь понять, пишу в логи всякую всячину, доп.информацию, но толку никакого :(.
- вызова дорогущей (многопараметрической и универсальной) функции iTime(symbol,timeframe,shift). В одном случае несколько тактов, а в другом полная проходка с поиском графика(символ,период) и обращением к данным
В связи с этим вопрос - не является ли использование этих функий замедлением процесса тестирования?
- вызова дорогущей (многопараметрической и универсальной) функции iTime(symbol,timeframe,shift). В одном случае несколько тактов, а в другом полная проходка с поиском графика(символ,период) и обращением к данным
В связи с этим вопрос - не является ли использование этих функий замедлением процесса тестирования?
Если на своем символе, то в тестере время текущего (тестируемого) бара можно брать из Time[0]
Было у меня такое начинание, но отказался от него раньше, чем закончил :). Базовую конструкцию пробовал такую:
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; }То есть идея в том, что если история не дошла до точки в файле прокручиваем историю, если наоборот (скажем пропуски баров в истории) прокручиваем файл. Проблемы со значениями на старых барах не вижу - если читать текущие значения без пропусков, то ко всем предыдущим стандартное обращение по индексу, как и в расчётном индикаторе. Проблема с разными таймфреймами тоже не совсем понятна - в общем случае значения индикатора будут для разных таймфреймов отличаться, даже если привести входные параметры к одному времени. Выход может быть в том, чтобы зашивать таймфрейм в название файла.
На прошлой неделе проводил такие опыты. Придумана некая технология для автоматического расчета и кеширования требуемых индикаторов. Постараюсь до конца года выложить.
Любых индикаторов, с произвольным набором параметров?
В принципе, если совсем не использовать в экспертах 0-й бар, можно
всегда кешировать расчёты в файл на диск для индикаторов 1-го
бара и ранее, и читать значения при надобности получения из
файл-кеша. Расчёты ведь прошлых баров (не 0-го) по идее меняться
не должны.
Я помещал в text-файл в строки текст даты/времени и через запятую значения нужных индикаторов. По метке даты/времени ищется нужная строка, и в ней через ";" значение нужного индикатора. Однако чтобы избежать дорогостоящих операций к диску, весь файл в init() кешировался в массивы в памяти, т.е. операции поиска и извлечения значений шли по массиву.
Я помещал в text-файл в строки текст даты/времени и через запятую значения нужных индикаторов. По метке даты/времени ищется нужная строка, и в ней через ";" значение нужного индикатора. Однако чтобы избежать дорогостоящих операций к диску, весь файл в init() кешировался в массивы в памяти, т.е. операции поиска и извлечения значений шли по массиву.
Идея такая же, в основном. Остается только придумать как это автоматизировать. Придумал, но реализацию еще не начинал.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Идея в плане реализации уже на 95%, просто возник вопрос, если кто-нибудь это уже делал, каково сравнение производительности двух вариантов - расчёт на лету и чтение значений из файлов?