Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Не нашел нужную программу? Закажи ее!
Forex Trader
114237
Forex Trader 2007.01.18 18:48 
При добавлении индикатора скоростью тестирования упала. Индюк вроде простой,
а замедляет сильно. Пробовал ограничить по числу обсчитываемых баров. Ускорилю Вот только результаты совсем другие.Как можно ускорить эксперта, использующего данный индикатор?
#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
114237
Forex Trader 2007.01.18 19:03  
Для начала так:
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
114237
Forex Trader 2007.01.18 19:21  
Вот это выражение принципиально некрасиво!
   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
114237
Forex Trader 2007.01.20 14:12  
Всем спасибо за помощь.
Forex Trader
114237
Forex Trader 2007.01.20 19:37  
1. Рынки то реальные так что SMA2 не может быть 0.
2. Тормоза начнутся реальные если iMa заменить на АМА (адаптивный мувинг - кастомный индюк). Воттогда вообще на ночь ставить.
Forex Trader
114237
Forex Trader 2007.01.22 07:06  
Хорошо ускорить работу эксперта позволяет еше и перенос расчета индикатора непосредственно в код эксперта в виде функции, которая будет заполнять не весь массив индикатора, а только необходимую глубину массива. Особенно это значимо для индикаторов вызываемых iCustom.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий