Может в "десятки раз" быстрее означает, что на повторных тестах результаты извлекались из автоматического кеш файла. Как раз в показанных логах об этом пишется.
Достаточно внимательно прочесть логи оптимизации, особенно последнюю часть, чтобы все стало ясно. Там пишется, сколько результатов было извлечено из кеша без расчета.
Для чистоты эксперимента нужно обязательно стирать все кеш файлы перед тестами.
Может в "десятки раз" быстрее означает, что на повторных тестах результаты извлекались из автоматического кеш файла. Как раз в показанных логах об этом пишется.
Достаточно внимательно прочесть логи оптимизации, особенно последнюю часть, чтобы все стало ясно. Там пишется, сколько результатов было извлечено из кеша без расчета.
Для чистоты эксперимента нужно обязательно стирать все кеш файлы перед тестами.
Скопировал все, что было в журнале (перед каждой оптимизацией предыдущие данные стирал):
БИЛД 670 2015.06.16 11:57:07.744 There were 584 passes done during optimization 2015.06.16 11:57:07.740 ExpertTSI: optimization finished, 530 cache records were used, 504 cache records rejected 2015.06.16 11:56:19.691 ExpertTSI: optimization started 2015.06.16 11:56:19.683 TestGenerator: actual tick file "C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\A79CE25A8EC885DE6A4ED0E2292C8FA8\tester\history\EURUSD60_2.fxt" found 2015.06.16 11:56:19.683 Tester: cache file "C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\A79CE25A8EC885DE6A4ED0E2292C8FA8\tester\caches\ExpertTSI.EURUSD60.2" found and can be used for further optimization 2015.06.16 11:56:19.680 TestGenerator: spread set to 15 БИЛД 840 2015.06.16 12:08:15.133 There were 554 passes done during optimization 2015.06.16 12:08:15.130 ExpertTSI: optimization finished, 587 cache records were used, 534 cache records rejected 2015.06.16 11:59:24.182 ExpertTSI: optimization started 2015.06.16 11:59:24.166 TestGenerator: actual tick file "C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\A79CE25A8EC885DE6A4ED0E2292C8FA8\tester\history\EURUSD60_2.fxt" found 2015.06.16 11:59:24.166 Tester: cache file "C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\A79CE25A8EC885DE6A4ED0E2292C8FA8\tester\caches\ExpertTSI.EURUSD60.2" found and can be used for further optimization 2015.06.16 11:59:24.165 TestGenerator: spread set to 15
Тестировал по ценам открытия. Самое интересное, что советник основанный на MACD из стандартной поставки не тормозит и оптимизация проводится нормально.
TSI индикатор из первого сообщения использую в советнике больше года.
В пятерке с ним и подобными индикаторами проблем не возникает. Но, вот засада не все брокеры с ним работают.
Кажется нашел причину тормозов при оптимизации.
Попробовал вместо функции "iMAOnArray" использовать включаемый файл "MovingAverages.mqh".
Индикатор в оффлайне показывает. Пробую провести оптимизацию:
видно, что в процессе оптимизации находятся тесты
1 0.00 0 0.00 0.00 0.00 0.00% -1.00000000 p2=43 p3=1 p4=47 p5=10 s=4 stop=0.024 p=0.018 Lots=0.01 Prots=0.07 Period_MA_1=1 2 -149.26 73 0.71 -2.04 189.53 18.86% 0.70528277 p2=13 p3=29 p4=31 p5=28 s=31 stop=0.014 p=0.014 Lots=0.01 Prots=0.07 Period_MA_1=1 3 -262.16 54 0.49 -4.85 264.85 26.47% 0.48957199 p2=19 p3=23 p4=27 p5=20 s=31 stop=0.018 p=0.028 Lots=0.01 Prots=0.07 Period_MA_1=1 4 415.14 280 1.18 1.48 256.61 16.29% 1.17500801 p2=61 p3=19 p4=37 p5=22 s=1 stop=0.022 p=0.02 Lots=0.01 Prots=0.07 Period_MA_1=1 5 67.81 362 1.04 0.19 259.31 19.81% 1.04263291 p2=63 p3=37 p4=35 p5=20 s=1 stop=0.03 p=0.004 Lots=0.01 Prots=0.07 Period_MA_1=1
то есть она проводится. Но когда запускаю одиночный прогон ни одной сделки и пустое окно индикатора в конце. Но скорость в раза 1,5-2 выше чем с использованием
"iMAOnArray"(скорость оптимизации в старом билде).
Самую главную проблему вроде, как обнаружил. Теперь помогите разобраться, что у меня не так с индикатором. Как писал вместо iMAOnArray, сглаживаю данные MovingAverages.mqh и
использую новую оболочку.
Одиночный прогон индикатора в тестере с iMAOnArray:
2015.06.28 00:13:42.132 2015.06.15 23:59 EURUSD,H1: 70897 tick events (71897 bars, 142742 bar states) processed in 0:02:40.525 (total time 0:02:40.556) 2015.06.28 00:11:01.613 2015.06.15 23:59 TSIErgodic inputs: p2=7; p3=5; p4=3; p5=3; 2015.06.28 00:11:01.587 2015.06.15 23:59 TestGenerator: spread set to 15
Одиночный прогон индикатора в тестере с MovingAverages.mqh:
2015.06.28 00:14:10.625 2015.06.15 23:59 EURUSD,H1: 70897 tick events (71897 bars, 142742 bar states) processed in 0:00:01.045 (total time 0:00:01.077) 2015.06.28 00:14:09.577 2015.06.15 23:59 TSI_New inputs: p2=7; p3=5; p4=3; p5=3; 2015.06.28 00:14:09.546 2015.06.15 23:59 TestGenerator: spread set to 15
Стары тестер 600 работал метко да быстро Ресурсы компютера не жрал
Что в ним не понравилось ,что поменяли на эту щуковину -билд 870, которая сама не знает что творить.
Стары тестер 600 работал метко да быстро Ресурсы компютера не жрал
Что в ним не понравилось ,что поменяли на эту щуковину -билд 870, которая сама не знает что творить.
Оказывается я не один с такой проблемой.
Либо это надо исправить. Либо переходить на метатрейдер 5, но когда откроют датафиды и тестировать стратегии там.
Стары тестер 600 работал метко да быстро Ресурсы компютера не жрал
Что в ним не понравилось ,что поменяли на эту щуковину -билд 870, которая сама не знает что творить.
Стары тестер 600 работал метко да быстро Ресурсы компютера не жрал
Что в ним не понравилось ,что поменяли на эту щуковину -билд 870, которая сама не знает что творить.
У вас есть доказательства?
К счастью, нет. В реальности тестер с 500-600 билдов стал еще быстрее, но никак не медленнее. Мы оптимизировали и ускорили как внутренние процессы, но самое главное - применили более производительный движок языка MQL5.
И конечно же, мы сами тесты производительности ведем почтоянно.
Переделал индикатор, вместо "iMAOnArray" сглаживаю данные "MovingAverages.mqh". Индикатор работает и сделки совпадают со старой версией на "iMAOnArray".
#include <MovingAverages.mqh> //+------------------------------------------------------------------+ //| TSI_New.mq4 | //| Kamil Gazizullin | //| forexman77@yandex.ru | //+------------------------------------------------------------------+ #property strict #property indicator_separate_window #property indicator_buffers 2 #property indicator_color1 Lime #property indicator_color2 Red #property indicator_level1 -25 // значение уровня #0 на вертикальной оси #property indicator_level2 25 // значение уровня #1 на вертикальной оси #property indicator_level3 0 //--- input parameters extern int p2 =7; extern int p3 =5; extern int p4 =3; extern int p5 =3; //--- buffers double ExtMapBuffer1[]; double ExtMapBuffer2[]; double ExtMapBuffer3[]; double ExtMapBuffer4[]; double ExtMapBuffer5[]; double ExtMapBuffer6[]; double ExtMapBuffer7[]; double ExtMapBuffer8[]; double ExtMapBuffer9[]; double ExtMapBuffer10[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping IndicatorBuffers(10); SetIndexBuffer(0,ExtMapBuffer1); SetIndexBuffer(1,ExtMapBuffer2); SetIndexBuffer(2,ExtMapBuffer3); SetIndexBuffer(3,ExtMapBuffer4); SetIndexBuffer(4,ExtMapBuffer5); SetIndexBuffer(5,ExtMapBuffer6); SetIndexBuffer(6,ExtMapBuffer7); SetIndexBuffer(7,ExtMapBuffer8); SetIndexBuffer(8,ExtMapBuffer9); SetIndexBuffer(9,ExtMapBuffer10); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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[]) { int i,limit; //--- если это первый вызов if(prev_calculated==0) limit=rates_total-1-p2-p3-p4-p5; else limit=1; for(i=limit;i>=0;i--){ExtMapBuffer3[i]=close[i]-close[i+1];} for(i=limit;i>=0;i--){ExtMapBuffer4[i]=MathAbs(close[i]-close[i+1]);} ExponentialMAOnBuffer(rates_total,prev_calculated,0,p2,ExtMapBuffer3,ExtMapBuffer5); ExponentialMAOnBuffer(rates_total,prev_calculated,0,p2,ExtMapBuffer4,ExtMapBuffer6); ExponentialMAOnBuffer(rates_total,prev_calculated,0,p3,ExtMapBuffer5,ExtMapBuffer7); ExponentialMAOnBuffer(rates_total,prev_calculated,0,p3,ExtMapBuffer6,ExtMapBuffer8); ExponentialMAOnBuffer(rates_total,prev_calculated,0,p4,ExtMapBuffer7,ExtMapBuffer9); ExponentialMAOnBuffer(rates_total,prev_calculated,0,p4,ExtMapBuffer8,ExtMapBuffer10); for(i=limit;i>=0;i--){if(ExtMapBuffer10[i]!=0)ExtMapBuffer1[i]=100*ExtMapBuffer9[i]/ExtMapBuffer10[i];} ExponentialMAOnBuffer(rates_total,prev_calculated,0,p5,ExtMapBuffer1,ExtMapBuffer2); //--- return value of prev_calculated for next call return(rates_total); }
Скорость приемлемая. Но, обнаружил явно баг.
К примеру условие в советнике такое:
static datetime b; double lineD=0,line1=0,line2=0; double signal_lineD=0,signal_line1=0,signal_line2=0,signal=0; lineD=iCustom(NULL,PERIOD_D1,"TSI_New",p2D,p3D,p4D,p5D,0,0); signal_lineD=iCustom(NULL,PERIOD_D1,"TSI_New",p2D,p3D,p4D,p5D,1,0); line1=iCustom(NULL,0,"TSI_New",p2,p3,p4,p5,0,1); signal_line1=iCustom(NULL,0,"TSI_New",p2,p3,p4,p5,1,1); line2=iCustom(NULL,0,"TSI_New",p2,p3,p4,p5,0,2); signal_line2=iCustom(NULL,0,"TSI_New",p2,p3,p4,p5,1,2); signal=line1-signal_line1; if (line1 > signal_line1 && line2 < signal_line2 && lineD > signal_lineD && Time[0] > b){Opn_B=true;}
сделки есть, все окей. Если ставлю условный оператор, то сделок почти или вообще нет:
static datetime b; double lineD=0,line1=0,line2=0; double signal_lineD=0,signal_line1=0,signal_line2=0,signal=0; lineD=iCustom(NULL,PERIOD_D1,"TSI_New",p2D,p3D,p4D,p5D,0,0); signal_lineD=iCustom(NULL,PERIOD_D1,"TSI_New",p2D,p3D,p4D,p5D,1,0); if (lineD > signal_lineD) { line1=iCustom(NULL,0,"TSI_New",p2,p3,p4,p5,0,1); signal_line1=iCustom(NULL,0,"TSI_New",p2,p3,p4,p5,1,1); line2=iCustom(NULL,0,"TSI_New",p2,p3,p4,p5,0,2); signal_line2=iCustom(NULL,0,"TSI_New",p2,p3,p4,p5,1,2); } signal=line1-signal_line1; if (line1 > signal_line1 && line2 < signal_line2 && lineD > signal_lineD && Time[0] > b){Opn_B=true;}
Пробовал сделать два советника и грузить условие с одного сет файла, то однозначно тот у которого есть следующий, условный оператор
if (lineD > signal_lineD)
не работает. Билд 902.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Уже давно не могу решить проблему в MQL4, на новом билде.
Сделал несколько индикаторов, с несколькими периодами сглаживания. Запускаю оптимизацию на 670 билде, скорость приемлемая.
Перехожу на новые билды скорость падает в десятки раз.
Проверка скриптом дает следующие результаты:
670 билд:
новый билд:
Код скрипта для проверки:
Как видно время почти одинаковое. Скорее всего небольшая разница обусловлена тем, что сколько на данный момент свободной памяти.
Сделал вообще пустой советник, где вызываю индикатор, результат тот же.
Кто, что скажет? Котировки подкачаны, интернет подключен.
В журнале вот такие данные на новом билде:
Данные журнала на старом билде: