Скачать MetaTrader 5

"Ускорение" эксперта

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114287
Forex Trader  
При добавлении индикатора скоростью тестирования упала. Индюк вроде простой,
а замедляет сильно. Пробовал ограничить по числу обсчитываемых баров. Ускорилю Вот только результаты совсем другие.Как можно ускорить эксперта, использующего данный индикатор?
#property indicator_separate_window 
#property indicator_buffers 1 
#property indicator_color1 Gold
//---- indicator parameters 
extern int Period1=7; 
extern int Period2=65; 
//---- buffers 
double ExtBuffer[]; 
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int init() 
  { 
//---- indicators 
   SetIndexStyle(0,DRAW_LINE,2); 
   SetIndexBuffer(0,ExtBuffer); 
   IndicatorShortName("RAVI_Change (" + Period1+ ","+Period2+")"); 
    
//---- 
   return(0); 
  } 
//+------------------------------------------------------------------+ 
//| Custor indicator deinitialization function                       | 
//+------------------------------------------------------------------+ 
int deinit() 
  { 
//---- TODO: add your code here 
    
//---- 
   return(0); 
  } 
//+------------------------------------------------------------------+ 
//| Custom indicator iteration function                              | 
//+------------------------------------------------------------------+ 
int start() 
  { 
   int    counted_bars=IndicatorCounted(); 
   int i=0; 
   double SMA1,SMA2,result; 
    
    
//---- TODO: add your code here 
  
  for(i=0;i<90;i++) 
   { 
   SMA1=iMA(NULL,0,Period1,0,MODE_SMA,PRICE_CLOSE,i); 
   SMA2=iMA(NULL,0,Period2,0,MODE_SMA,PRICE_CLOSE,i); 
   if(SMA2 == 0) result=0;
   else          result=((SMA1-SMA2)/SMA2)*100; 
   ExtBuffer[i]=result; 
   } 
  
//---- 
   return(0); 
  } 
//+------------------------------------------------------------------+ 
Forex Trader
114287
Forex Trader  
Для начала так:
int limit=Bars-counted_bars;
for(i=limit;i>=0;i--) 
   { 
   SMA1=iMA(NULL,0,Period1,0,MODE_SMA,PRICE_CLOSE,i); 
   SMA2=iMA(NULL,0,Period2,0,MODE_SMA,PRICE_CLOSE,i); 
   if(SMA2 == 0) result=0;
   else          result=((SMA1-SMA2)/SMA2)*100; 
   ExtBuffer[i]=result; 
   } 
Forex Trader
114287
Forex Trader  
Вот это выражение принципиально некрасиво!
   if(SMA2 == 0) result=0;
   else          result=((SMA1-SMA2)/SMA2)*100;


Если у вас SMA2 будет равно к примеру 1*10^(-20), то у вас на графике будет отображён один бесконечный всплеск и прямая линия на остальном промежутке времени. Вам это надо? Лучше сделать вот так

   if(MathAbs(SMA2)<delta) result=0;
   else          result=((SMA1-SMA2)/SMA2)*100;


delta - это то значение, которое для вас будет означать интервал нуля для SMA2. Значение определите вы сами.

Forex Trader
114287
Forex Trader  
Всем спасибо за помощь.
Forex Trader
114287
Forex Trader  
1. Рынки то реальные так что SMA2 не может быть 0.
2. Тормоза начнутся реальные если iMa заменить на АМА (адаптивный мувинг - кастомный индюк). Воттогда вообще на ночь ставить.
Forex Trader
114287
Forex Trader  
Хорошо ускорить работу эксперта позволяет еше и перенос расчета индикатора непосредственно в код эксперта в виде функции, которая будет заполнять не весь массив индикатора, а только необходимую глубину массива. Особенно это значимо для индикаторов вызываемых iCustom.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий