Навскидку по видео, не вдаваясь в код, можно сказать, что запускать программу командой "Начало отладки" по зеленой кнопке неправильно.
В режиме отладки компилятор генерит детальный, абсолютно неоптимизированный код специально под отладчик. Этот код может работать в разы медленнее обычного.
- www.mql5.com
//| AMA.mq5 | pos=periodAMA+2; while (pos<rates_total)Индикатор полностью пересчитывается на каждом тике.
Индикатор полностью пересчитывается на каждом тике.
на каждом тике перещитывается
а разве встроенный АМА от МТ5 не перещитывает на тике каждом? и тем не менее работает быстро
//+------------------------------------------------------------------+ //| AMA.mq5 | //| Copyright 2009, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "2009, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #property description "Adaptive Moving Average" #property indicator_chart_window #property indicator_buffers 1 #property indicator_plots 1 //---- plot ExtAMABuffer #property indicator_label1 "AMA" #property indicator_type1 DRAW_LINE #property indicator_color1 Red #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- default applied price #property indicator_applied_price PRICE_OPEN //--- input parameters input int InpPeriodAMA=10; // AMA period input int InpFastPeriodEMA=2; // Fast EMA period input int InpSlowPeriodEMA=30; // Slow EMA period input int InpShiftAMA=0; // AMA shift //--- indicator buffers double ExtAMABuffer[]; //--- global variables double ExtFastSC; double ExtSlowSC; int ExtPeriodAMA; int ExtSlowPeriodEMA; int ExtFastPeriodEMA; //+------------------------------------------------------------------+ //| AMA initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- check for input values if(InpPeriodAMA<=0) { ExtPeriodAMA=10; printf("Input parameter InpPeriodAMA has incorrect value (%d). Indicator will use value %d for calculations.", InpPeriodAMA,ExtPeriodAMA); } else ExtPeriodAMA=InpPeriodAMA; if(InpSlowPeriodEMA<=0) { ExtSlowPeriodEMA=30; printf("Input parameter InpSlowPeriodEMA has incorrect value (%d). Indicator will use value %d for calculations.", InpSlowPeriodEMA,ExtSlowPeriodEMA); } else ExtSlowPeriodEMA=InpSlowPeriodEMA; if(InpFastPeriodEMA<=0) { ExtFastPeriodEMA=2; printf("Input parameter InpFastPeriodEMA has incorrect value (%d). Indicator will use value %d for calculations.", InpFastPeriodEMA,ExtFastPeriodEMA); } else ExtFastPeriodEMA=InpFastPeriodEMA; //--- indicator buffers mapping SetIndexBuffer(0,ExtAMABuffer,INDICATOR_DATA); //--- set shortname and change label string short_name="AMA("+IntegerToString(ExtPeriodAMA)+","+ IntegerToString(ExtFastPeriodEMA)+","+ IntegerToString(ExtSlowPeriodEMA)+")"; IndicatorSetString(INDICATOR_SHORTNAME,short_name); PlotIndexSetString(0,PLOT_LABEL,short_name); //--- set accuracy IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1); //--- sets first bar from what index will be drawn PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtPeriodAMA); //--- set index shift PlotIndexSetInteger(0,PLOT_SHIFT,InpShiftAMA); //--- calculate ExtFastSC & ExtSlowSC ExtFastSC=2.0/(ExtFastPeriodEMA+1.0); ExtSlowSC=2.0/(ExtSlowPeriodEMA+1.0); //--- OnInit done return(0); } //+------------------------------------------------------------------+ //| AMA iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { int i; //--- check for rates count if(rates_total<ExtPeriodAMA+begin) return(0); //--- draw begin may be corrected if(begin!=0) PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtPeriodAMA+begin); //--- detect position int pos=prev_calculated-1; //--- first calculations if(pos<ExtPeriodAMA+begin) { pos=ExtPeriodAMA+begin; for(i=0;i<pos-1;i++) ExtAMABuffer[i]=0.0; ExtAMABuffer[pos-1]=price[pos-1]; } //--- main cycle for(i=pos;i<rates_total && !IsStopped();i++) { //--- calculate SSC double dCurrentSSC=(CalculateER(i,price)*(ExtFastSC-ExtSlowSC))+ExtSlowSC; //--- calculate AMA double dPrevAMA=ExtAMABuffer[i-1]; ExtAMABuffer[i]=pow(dCurrentSSC,2)*(price[i]-dPrevAMA)+dPrevAMA; } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //| Calculate ER value | //+------------------------------------------------------------------+ double CalculateER(const int nPosition,const double &PriceData[]) { double dSignal=fabs(PriceData[nPosition]-PriceData[nPosition-ExtPeriodAMA]); double dNoise=0.0; for(int delta=0;delta<ExtPeriodAMA;delta++) dNoise+=fabs(PriceData[nPosition-delta]-PriceData[nPosition-delta-1]); if(dNoise!=0.0) return(dSignal/dNoise); return(0.0); } //+------------------------------------------------------------------+
на каждом тике перещитывается
а разве встроенный АМА от МТ5 не перещитывает на тике каждом? и тем не менее работает быстро
пересчитывается, но таки только последние 1-2 бара.
поправил пред. пост.
а как мне починить АМА от МТ4 тогда?
а как мне починить АМА от МТ4 тогда?
Основной цикл сделайте по образу и подобию) любого стандартного MT5 индюкатора.
Например таки AMA.mq5
Как-то так:
//cbars=IndicatorCounted(prev_calculated); if(prev_calculated>0) cbars = prev_calculated-1; if(prev_calculated==0) cbars = 0; cbars=0; //Print(cbars); if (rates_total<=(periodAMA+2)) return (0); //---- check for possible errors if (cbars<0) return (-1); //---- last counted bar will be recounted if (cbars>0) cbars--; pos=periodAMA+2; AMA0=close[pos-1];
заменить на
//cbars=IndicatorCounted(prev_calculated); if (rates_total<=(periodAMA+2)) return (0); pos=periodAMA+2; if(prev_calculated>0) pos = prev_calculated-1; AMA0=close[pos-1];
проклятие, всё равно очень медленно в сравнении со встроенным АМА МТ5.
Сколько будет стоить ускорить АМА самодельный?
проклятие, всё равно очень медленно в сравнении со встроенным АМА МТ5.
Сколько будет стоить ускорить АМА самодельный?
В остальном всё вроде впорядке с кодом, можно пару переменных в Init вычислить, но таки это ускорит на совсем чуть-чуть..
В эксперте:
В mql5 это должно быть в Init() - получение хэндла индикатора..
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
тут видео проблемы http://imagicon.info/howto/mql5%20slow%20test%20ama.htm
почему такой медленный тест визуальный переведённого на МТ5 индикатора?
Все стандартные индюки работают быстро....