Добрый день. Есть задача построить боллинджера, а оно не прокатывает на присваивании цены, вот кусочек кода:
Price[i]=high[i];
NormalizeDouble(Price[i],2);
ExtMLBuffer1[i]=SimpleMA(i,Inp_Bands_bands_period,Price);
Строится примерная дичь, и иного варианта как через хендл с ним работать не получится? Благодарю.
Для начала уберите NormalizeDouble, который срезает данные до двух цифр после запятой. Вообще никогда не используйте эту функцию. Она не только бесполезная, но и вредная.
И без неё и с ней, не вычисляет корректно.
Добрый день. Есть задача построить боллинджера, а оно не прокатывает на присваивании цены, вот кусочек кода:
Price[i]=high[i];
NormalizeDouble(Price[i],2);
ExtMLBuffer1[i]=SimpleMA(i,Inp_Bands_bands_period,Price);
Строится примерная дичь, и иного варианта как через хендл с ним работать не получится? Благодарю.
поставте не "прайс 2"
NormalizeDouble(Price[i],_Digits);
Спасибо, но нет. Вот сокращённый вариант индикатора, сравниваю с боллинджером на графике и не идут расчёты, high подставляем и всё правильно, а так Price[i]=high[i] уже нет. И от #property indicator_buffers 40 значения индикатора всегда разные.
//+------------------------------------------------------------------+ //| ProjectName | //| Copyright 2020, CompanyName | //| http://www.companyname.net | //+------------------------------------------------------------------+ #property description "Bollinger Bands" #include <MovingAverages.mqh> //--- #property indicator_separate_window #property indicator_buffers 40 #property indicator_plots 1 //--- Bands High #property indicator_label1 "Bands High" #property indicator_type1 DRAW_LINE #property indicator_color1 clrRed #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- Bands Low #property indicator_label2 "Bands Low" #property indicator_type2 DRAW_HISTOGRAM #property indicator_color2 clrBlue #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //--- input parametrs int Inp_Bands_bands_period1 = 3; int Inp_Bands_bands_shift1 = 1; double Inp_Bands_deviation1 = 1.0; int Inp_Bands_bands_period2 = 3; int Inp_Bands_bands_shift2 = 1; double Inp_Bands_deviation2 = 1.0; //--- indicator buffer double MiddleSMABuffer1[]; double UpperSMABuffer1[]; double LowerSMABuffer1[]; double ExtMLBuffer1[]; double ExtTLBuffer1[]; double ExtBLBuffer1[]; double ExtStdDevBuffer1[]; double MiddleSMABuffer2[]; double UpperSMABuffer2[]; double LowerSMABuffer2[]; double ExtMLBuffer2[]; double ExtTLBuffer2[]; double ExtBLBuffer2[]; double ExtStdDevBuffer2[]; double BandsH[]; double BandsL[]; double Price[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //--- define buffers SetIndexBuffer(0,BandsH); SetIndexBuffer(1,BandsL); SetIndexBuffer(2,Price,INDICATOR_CALCULATIONS); SetIndexBuffer(3,MiddleSMABuffer1,INDICATOR_DATA); SetIndexBuffer(4,UpperSMABuffer1,INDICATOR_DATA); SetIndexBuffer(5,LowerSMABuffer1,INDICATOR_DATA); SetIndexBuffer(6,ExtMLBuffer1,INDICATOR_CALCULATIONS); SetIndexBuffer(7,ExtTLBuffer1,INDICATOR_CALCULATIONS); SetIndexBuffer(8,ExtBLBuffer1,INDICATOR_CALCULATIONS); SetIndexBuffer(9,ExtStdDevBuffer1,INDICATOR_CALCULATIONS); SetIndexBuffer(10,MiddleSMABuffer2,INDICATOR_DATA); SetIndexBuffer(11,UpperSMABuffer2,INDICATOR_DATA); SetIndexBuffer(12,LowerSMABuffer2,INDICATOR_DATA); SetIndexBuffer(13,ExtMLBuffer2,INDICATOR_CALCULATIONS); SetIndexBuffer(14,ExtTLBuffer2,INDICATOR_CALCULATIONS); SetIndexBuffer(15,ExtBLBuffer2,INDICATOR_CALCULATIONS); SetIndexBuffer(16,ExtStdDevBuffer2,INDICATOR_CALCULATIONS); // PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,Inp_Bands_bands_period1); PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,Inp_Bands_bands_period1-1); // PlotIndexSetInteger(0,PLOT_SHIFT,Inp_Bands_bands_shift1); PlotIndexSetInteger(1,PLOT_SHIFT,Inp_Bands_bands_shift2); IndicatorSetString(INDICATOR_SHORTNAME,"Bollinger Bands "); //--- number of digits of indicator value IndicatorSetInteger(INDICATOR_DIGITS,Digits()+1); } //+------------------------------------------------------------------+ //| Bollinger Bands | //+------------------------------------------------------------------+ 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[]) { if(rates_total<Inp_Bands_bands_period1-1 || rates_total<Inp_Bands_bands_period2-1) return(0); //(+) int Inp_Smoothing=1; //(+) //--- starting calculation int pos; if(prev_calculated>1) pos=prev_calculated-1; else pos=0; //--- main cycle for(int i=pos; i<rates_total && !IsStopped(); i++) { Price[i]=high[i]; Price[i]=NormalizeDouble(Price[i],_Digits); // Print(Price[i]," ",high[i]); ExtMLBuffer1[i]=SimpleMA(i,Inp_Bands_bands_period1,Price); ExtStdDevBuffer1[i]=StdDev_Func(i,Price,ExtMLBuffer1,Inp_Bands_bands_period1); ExtTLBuffer1[i]=ExtMLBuffer1[i]+Inp_Bands_deviation1*ExtStdDevBuffer1[i]; ExtBLBuffer1[i]=ExtMLBuffer1[i]-Inp_Bands_deviation1*ExtStdDevBuffer1[i]; MiddleSMABuffer1[i]=SimpleMA(i,Inp_Smoothing,ExtMLBuffer1); UpperSMABuffer1[i]=SimpleMA(i,Inp_Smoothing,ExtTLBuffer1); LowerSMABuffer1[i]=SimpleMA(i,Inp_Smoothing,ExtBLBuffer1); Price[i]=low[i]; ExtMLBuffer2[i]=SimpleMA(i,Inp_Bands_bands_period2,Price); ExtStdDevBuffer2[i]=StdDev_Func(i,Price,ExtMLBuffer2,Inp_Bands_bands_period2); ExtTLBuffer2[i]=ExtMLBuffer2[i]+Inp_Bands_deviation2*ExtStdDevBuffer2[i]; ExtBLBuffer2[i]=ExtMLBuffer2[i]-Inp_Bands_deviation2*ExtStdDevBuffer2[i]; MiddleSMABuffer2[i]=SimpleMA(i,Inp_Smoothing,ExtMLBuffer2); UpperSMABuffer2[i]=SimpleMA(i,Inp_Smoothing,ExtTLBuffer2); LowerSMABuffer2[i]=SimpleMA(i,Inp_Smoothing,ExtBLBuffer2); // Price[i]=(high[i]+low[i])/2; BandsH[i]=UpperSMABuffer1[i]; } return(rates_total); } //+------------------------------------------------------------------+ //| Calculate Standard Deviation | //+------------------------------------------------------------------+ double StdDev_Func(const int position,const double &price[],const double &ma_price[],const int period) { double std_dev=0.0; //--- calcualte StdDev if(position>=period) { for(int i=0; i<period; i++) std_dev+=MathPow(price[position-i]-ma_price[position],2.0); std_dev=MathSqrt(std_dev/period); } //--- return calculated value return(std_dev); } //+------------------------------------------------------------------+
Спасибо, но нет. Вот сокращённый вариант индикатора, сравниваю с боллинджером на графике и не идут расчёты, high подставляем и всё правильно, а так Price[i]=high[i] уже нет. И от #property indicator_buffers 40 значения индикатора всегда разные.
короче лучше забыть про этот код. Видимо Вы совсем новичок.
Лучше скажите что Вам нужно получить на выходе. Какую картинку хотите увидеть?
Почему ВВ в отдельном окне (indicator_separate_window)?
Почему рассчитываете два BB c однинаковыми характеристиками, а пытаетесь нарисовать один?
Почему верхняя граница ВВ у Вас линия, а нижняя гистограмма?
короче лучше забыть про этот код. Видимо Вы совсем новичок.
Лучше скажите что Вам нужно получить на выходе. Какую картинку хотите увидеть?
Почему ВВ в отдельном окне (indicator_separate_window)?
Почему рассчитываете два BB c однинаковыми характеристиками, а пытаетесь нарисовать один?
Почему верхняя граница ВВ у Вас линия, а нижняя гистограмма?
Буду использовать хендлы) ветку можно удолить!
Спасибо, но нет. Вот сокращённый вариант индикатора, сравниваю с боллинджером на графике и не идут расчёты, high подставляем и всё правильно, а так Price[i]=high[i] уже нет. И от #property indicator_buffers 40 значения индикатора всегда разные.
Вот это строку -
std_dev=MathSqrt(std_dev/period);
надо вытащить из цикла.
Может, и еще ошибки есть, но это первое что заметно.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день. Есть задача построить боллинджера, а оно не прокатывает на присваивании цены, вот кусочек кода:
Price[i]=high[i];
NormalizeDouble(Price[i],2);
ExtMLBuffer1[i]=SimpleMA(i,Inp_Bands_bands_period,Price);
Строится примерная дичь, и иного варианта как через хендл с ним работать не получится? Благодарю.