Для начала так:
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;
}
Вот это выражение принципиально некрасиво!
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. Значение определите вы сами.
Всем спасибо за помощь.
Хорошо ускорить работу эксперта позволяет еше и перенос расчета индикатора непосредственно в код эксперта в виде функции, которая будет заполнять не весь массив индикатора, а только необходимую глубину массива. Особенно это значимо для индикаторов вызываемых iCustom.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
а замедляет сильно. Пробовал ограничить по числу обсчитываемых баров. Ускорилю Вот только результаты совсем другие.Как можно ускорить эксперта, использующего данный индикатор?
#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); } //+------------------------------------------------------------------+