Скачать MetaTrader 5

Ускорение тестирования на МТ4

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Где найти программиста? В сервисе Фриланс!
Andrey Egorov
3822
Andrey Egorov 2015.12.12 07:02 

У меня индикатор очень сильно затратный в общете(забирает много ресурсов процессоров), Тестирование занимает много времени, надо как-то оптимизировать работу.

Есть-ли какие-то пути ускорения расчетов ?

То что уже применил: расчет не на каждом тике, а только на новой свечке, стратегия это позволяет делать. Всеравно время тестирования на 4 годах TF 30мин занимает более часа

Что делать ?

Victor Nikolaev
Модератор
14527
Victor Nikolaev 2015.12.12 16:44  

Оптимизировать индикатор.

При возможности лучше расчеты перенести в советник 

Andrey Egorov
3822
Andrey Egorov 2015.12.13 02:51  

Спасибо, Vinin, я бы хотел расчеты индикатора перенести в советник.

Как я понимаю это можно сделать пользуясь массивами,

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

может есть где почитать про перенесение индикатора в советник с улучшением скорости ?

Andrey Egorov
3822
Andrey Egorov 2015.12.13 03:03  
я вроде сделал уже в расчет внутри советника, но все стало еще медленнее, что я упустил..
Victor Nikolaev
Модератор
14527
Victor Nikolaev 2015.12.13 07:52  
Mr_Goods:

Спасибо, Vinin, я бы хотел расчеты индикатора перенести в советник.

Как я понимаю это можно сделать пользуясь массивами,

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

может есть где почитать про перенесение индикатора в советник с улучшением скорости ?

Без кода индикатора помочь трудно.
Andrey Egorov
3822
Andrey Egorov 2015.12.13 10:30  
int start()
  {
   int counted_bars=IndicatorCounted();
   int limit;
   int i;
//----
        if (bars == 0) limit = Bars;
        else
    limit = bars;
     if(counted_bars>0) counted_bars--; 
     limit=Bars-counted_bars;     

      for(i= limit; i >= 0; i--) 
     {
         double bb_top = iCustom(NULL,0,"Bands",BandsPeriod,0, BandsDeviations, Bands_ma_mode, 1, i); 
         double bb_low = iCustom(NULL,0,"Bands",BandsPeriod,0, BandsDeviations, Bands_ma_mode, 2, i); 
         if (bb_top != 0)
         BB[i] = -(bb_low/bb_top - 1); 
            MA_bb[i] =iMAOnArray(BB,0,ma_per,0,MODE_EMA,i); 
            Buf_6[i] =iMAOnArray(BB,0,ma_per2,0,MODE_EMA,i); 
          
     }       
 
   return(0);
  }
Victor Nikolaev
Модератор
14527
Victor Nikolaev 2015.12.13 10:46  
Mr_Goods:

Про индикатор Bands забыли.

Похоже Вам пора переводить индикаторы в новый формат. Будут быстрее работать.

Этот индикатор не совсем корректно построен.

Надо переделывать.

Но было бы лучше из двух индикаторов сделать один с максимальным быстродействием 

Andrey Egorov
3822
Andrey Egorov 2015.12.13 10:59  

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

я сделал так, через глобальные static массивы :

static double BB[];
static double MA_bb[], Ma_bb_plus[];

.......

void calc_ind(int TF)
{

 int    BandsPeriod=24;
 double BandsDeviations=2.0;
 int ma_per = 10;
 int ma_per2 = 5;
 int Bands_ma_mode=MODE_EMA;
 int bars  = 300;
 int to_calc = 0;

   int limit;
   int i;
//----

      if (BB[1] != 0 ) to_calc = 2; else to_calc = bars; 

      for(i= to_calc; i >= 0; i--) // for(i=limit - 1; i>=0; i --) 
     {
         double bb_top = iCustom(NULL,TF,"Bands",BandsPeriod,0, BandsDeviations, Bands_ma_mode, 1, i); 
         double bb_low = iCustom(NULL,TF,"Bands",BandsPeriod,0, BandsDeviations, Bands_ma_mode, 2, i); 
         if (bb_top != 0)
         BB[i] = -(bb_low/bb_top - 1); 

         MA_bb[i] =iMAOnArray(BB,0,ma_per,0,MODE_EMA,i); 
         Ma_bb_plus[i] =iMAOnArray(BB,0,ma_per2,0,MODE_EMA,i); 

     }       

  }

в результате ничего не считает, или не сохраняет или ... что не правильно ?

есть-ли где нибудь, пример вставки кода индикатора в советник, уже все обыскал, помогите

Victor Nikolaev
Модератор
14527
Victor Nikolaev 2015.12.13 11:10  
Mr_Goods:

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

я сделал так, через глобальные static массивы :

в результате ничего не считает, или не сохраняет или ... что не правильно ?

есть-ли где нибудь, пример вставки кода индикатора в советник, уже все обыскал, помогите

Этот вариант индикатора будет работать быстрее

//+------------------------------------------------------------------+
//|                                                     Mr_Goods.mq4 |
//|                                            Copyright 2015, Vinin |
//|                                             http://vinin.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Vinin"
#property link      "http://vinin.ucoz.ru"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots   3
//--- plot BB
#property indicator_label1  "BB"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot MA_bb
#property indicator_label1  "MA_bb"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Buf_6
#property indicator_label1  "Buf_6"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

//--- input parameters
input int      BandsPeriod=14;
input int      Bands_ma_mode=0;
input int      BandsDeviations=1;
input int      ma_per=14;
input int      ma_per2=14;
//--- indicator buffers

double BB[];
double MA_bb[],Buf_6[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BB);
   SetIndexBuffer(1,MA_bb);
   SetIndexBuffer(2,Buf_6);

//---
   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 limit1=rates_total-prev_calculated;
   int limit2=limit1;
   if(limit1>1)
     {
      limit1=rates_total-BandsPeriod-1;
      limit2=limit1-MathMax(ma_per, ma_per2);
     }
   for(int i=limit1; i>=0; i--)
     {
      double bb_top = iCustom(NULL,0,"Bands",BandsPeriod,0, BandsDeviations, Bands_ma_mode, 1, i);
      double bb_low = iCustom(NULL,0,"Bands",BandsPeriod,0, BandsDeviations, Bands_ma_mode, 2, i);
      BB[i]=0;
      if(bb_top!=0)
         BB[i]=1.0-bb_low/bb_top;
     }
   for(int i=limit2;i>=0;i--)
     {
      MA_bb[i] =iMAOnArray(BB,0,ma_per,0,MODE_EMA,i);
      Buf_6[i] =iMAOnArray(BB,0,ma_per2,0,MODE_EMA,i);

     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

 Но нужно еще второй оптимизировать или объединить два в одном (и это будет лучше)

Andrey Egorov
3822
Andrey Egorov 2015.12.13 11:37  

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

скажите, как можно включить этот код в советник и обращаться к нему не через iCustom, а внутри самого советника, как к данным например, что-бы не было отдельного индикатора, что-бы он входил уже в систему как функция и с ним можно было бы работать  ?

Victor Nikolaev
Модератор
14527
Victor Nikolaev 2015.12.13 11:44  
Mr_Goods:

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

скажите, как можно включить этот код в советник и обращаться к нему не через iCustom, а внутри самого советника, как к данным например, что-бы не было отдельного индикатора, что-бы он входил уже в систему как функция и с ним можно было бы работать  ?


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