Скачать MetaTrader 5

Проблема с кастомными индикаторами MQL4

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Что происходит в MQL5.community? Раздел Стена ответит на этот вопрос!
forexman77
2120
forexman77 2015.06.15 18:36 

Уже давно не могу решить проблему в MQL4, на новом билде.

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

Перехожу на новые билды скорость падает в десятки раз.

Проверка скриптом дает следующие результаты:

670 билд:

2015.06.15 20:24:16.598 проверка индикатора EURUSD,H1: TSI_2 = 764 ms
2015.06.15 20:24:15.834 проверка индикатора EURUSD,H1: TSI_1 = 827 ms

 новый билд:

2015.06.15 20:20:23.718 проверка индикатора EURUSD,H1: TSI_2 = 843 ms
2015.06.15 20:20:22.881 проверка индикатора EURUSD,H1: TSI_1 = 889 ms

 Код скрипта для проверки:

#property version   "1.00"
#property strict
extern int       Period_=14;
extern int       p2 =7;
extern int       p3 =5;
extern int       p4 =3;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
  double GustomTSI=0.0;
  uint start_=GetTickCount();
  for(int i=0;i<1000000;i++)
  {
  GustomTSI=iCustom(NULL,0,"TSI",Period_,p2,p3,p4,0,1);
  }
  uint time=GetTickCount()-start_;
  Print("TSI_1 = ",time," ms");
  
  start_=GetTickCount();
  for(int i=0;i<1000000;i++)
  {
  GustomTSI=iCustom(NULL,0,"TSI",Period_,p2,p3,p4,0,1);
  }
  time=GetTickCount()-start_;
  Print("TSI_2 = ",time," ms"); 
  }
//+------------------------------------------------------------------+

Как видно время почти одинаковое. Скорее всего небольшая разница обусловлена тем, что сколько на данный момент свободной памяти.

Сделал вообще пустой советник, где вызываю индикатор, результат тот же.

Кто, что скажет? Котировки подкачаны, интернет подключен.

В журнале вот такие данные на новом билде:

"C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\A79CE25A8EC885DE6A4ED0E2292C8FA8\tester\history\EURUSD60_2.fxt" found
2015.06.15 20:21:01.073 Tester: cache file "C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\A79CE25A8EC885DE6A4ED0E2292C8FA8\tester\caches\ExpertTSI.EURUSD60.2"
found and can be used for further optimization

 Данные журнала на старом билде:

"C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\A79CE25A8EC885DE6A4ED0E2292C8FA8\tester\history\EURUSD60_2.fxt" found
2015.06.15 20:25:12.629 Tester: cache file "C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\A79CE25A8EC885DE6A4ED0E2292C8FA8\tester\caches\ExpertTSI.EURUSD60.2" 
found and can be used for further optimization
Последний файл индикатор.
Файлы:
TSI.mq4 4 kb
MetaQuotes
Админ
24952
Renat Fatkhullin 2015.06.15 23:16  

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

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

Для чистоты эксперимента нужно обязательно стирать все кеш файлы перед тестами. 

forexman77
2120
forexman77 2015.06.16 10:22  
Renat Fatkhullin:

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

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

Для чистоты эксперимента нужно обязательно стирать все кеш файлы перед тестами. 

Скопировал все, что было в журнале (перед каждой оптимизацией предыдущие данные стирал):

БИЛД 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
forexman77
2120
forexman77 2015.06.16 10:32  

Тестировал по ценам открытия. Самое интересное, что советник основанный на MACD из стандартной поставки не тормозит и оптимизация проводится нормально.

TSI индикатор из первого сообщения использую в советнике больше года. 

В пятерке с ним и подобными индикаторами проблем не возникает. Но, вот засада не все брокеры с ним работают.

forexman77
2120
forexman77 2015.06.27 21:18  

 Кажется нашел причину тормозов при оптимизации. 

Попробовал вместо функции "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
Файлы:
TSI_New.mq4 5 kb
Stefan Stoyanov
16183
Stefan Stoyanov 2015.07.05 01:30  

Стары тестер 600 работал метко да быстро Ресурсы компютера не жрал

Что в ним не понравилось  ,что поменяли на эту щуковину -билд 870, которая сама не знает что  творить.

forexman77
2120
forexman77 2015.07.05 11:21  
Stefan Stoyanov:

Стары тестер 600 работал метко да быстро Ресурсы компютера не жрал

Что в ним не понравилось  ,что поменяли на эту щуковину -билд 870, которая сама не знает что  творить.

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

Либо это надо исправить. Либо переходить на метатрейдер 5, но когда откроют датафиды и тестировать стратегии там.

Vitalie Postolache
12141
Vitalie Postolache 2015.07.05 17:36  
Stefan Stoyanov:

Стары тестер 600 работал метко да быстро Ресурсы компютера не жрал

Что в ним не понравилось  ,что поменяли на эту щуковину -билд 870, которая сама не знает что  творить.

Где вы нашли билд 870? Тоже хочу такой.
MetaQuotes
Админ
24952
Renat Fatkhullin 2015.07.05 18:59  
Stefan Stoyanov:

Стары тестер 600 работал метко да быстро Ресурсы компютера не жрал

Что в ним не понравилось  ,что поменяли на эту щуковину -билд 870, которая сама не знает что  творить.

У вас есть доказательства?

К счастью, нет. В реальности тестер с 500-600 билдов стал еще быстрее, но никак не медленнее. Мы оптимизировали и ускорили как внутренние процессы, но самое главное - применили более производительный движок языка MQL5.

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

Dmitry Fedoseev
42924
Dmitry Fedoseev 2015.10.28 17:48  
От iMAOnArray() торможение, как будто индикатор на каждом тике рассчитывается на всю длину. Клянусь!
forexman77
2120
forexman77 2015.11.02 18:04  

Переделал индикатор, вместо "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.

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий