Вопросец по индикатору

 

Добрый день. Есть задача построить боллинджера, а оно не прокатывает на присваивании цены, вот кусочек кода:

      Price[i]=high[i];

      NormalizeDouble(Price[i],2);

      ExtMLBuffer1[i]=SimpleMA(i,Inp_Bands_bands_period,Price);

Строится примерная дичь, и иного варианта как через хендл с ним работать не получится? Благодарю.

 
pips:

Добрый день. Есть задача построить боллинджера, а оно не прокатывает на присваивании цены, вот кусочек кода:

      Price[i]=high[i];

      NormalizeDouble(Price[i],2);

      ExtMLBuffer1[i]=SimpleMA(i,Inp_Bands_bands_period,Price);

Строится примерная дичь, и иного варианта как через хендл с ним работать не получится? Благодарю.

Для начала уберите NormalizeDouble, который срезает данные до двух цифр после запятой. Вообще никогда не используйте эту функцию. Она не только бесполезная, но и вредная.
Также стандартный BB весьма примитивно написан и поэтому очень медленный. Его производительность зависит от периода, а в оптимизированном алгоритме не зависит. 
 
вопросец к школьникам во дворе, дичь тудаже , а код надо вставлять корректно а не как на стене в подъезде, если видели такое
 
Nikolai Semko #:
Для начала уберите NormalizeDouble, который срезает данные до двух цифр после запятой. Вообще никогда не используйте эту функцию. Она не только бесполезная, но и вредная.
Также стандартный BB весьма примитивно написан и поэтому очень медленный. Его производительность зависит от периода, а в оптимизированном алгоритме не зависит. 

И без неё и с ней, не вычисляет корректно.

 
Volodymyr Zubov #:
вопросец к школьникам во дворе, дичь тудаже , а код надо вставлять корректно а не как на стене в подъезде, если видели такое

Пока найдёшь причину ошибки, лезет она всякая... 

 
pips #:

И без неё и с ней, не вычисляет корректно.

А чего не вычисляет?
Где код?
3 строки это не код.
Рискуете быть отправленным к телепатам.
 
pips:

Добрый день. Есть задача построить боллинджера, а оно не прокатывает на присваивании цены, вот кусочек кода:

      Price[i]=high[i];

      NormalizeDouble(Price[i],2);

      ExtMLBuffer1[i]=SimpleMA(i,Inp_Bands_bands_period,Price);

Строится примерная дичь, и иного варианта как через хендл с ним работать не получится? Благодарю.

поставте не "прайс 2"

 NormalizeDouble(Price[i],_Digits);
 
Volodymyr Zubov #:

поставте не "прайс 2"

Спасибо, но нет. Вот сокращённый вариант индикатора, сравниваю с боллинджером на графике и не идут расчёты, 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);
  }
//+------------------------------------------------------------------+
 
pips #:

Спасибо, но нет. Вот сокращённый вариант индикатора, сравниваю с боллинджером на графике и не идут расчёты, high подставляем и всё правильно, а так Price[i]=high[i]  уже нет. И от #property indicator_buffers 40 значения индикатора всегда разные.

короче лучше забыть про этот код. Видимо Вы совсем новичок.
Лучше скажите что Вам нужно получить на выходе. Какую картинку хотите увидеть?
Почему ВВ в отдельном окне (indicator_separate_window)?
Почему рассчитываете два BB c однинаковыми характеристиками, а пытаетесь нарисовать один?
Почему верхняя граница ВВ у Вас линия, а нижняя гистограмма?

 
Nikolai Semko #:

короче лучше забыть про этот код. Видимо Вы совсем новичок.
Лучше скажите что Вам нужно получить на выходе. Какую картинку хотите увидеть?
Почему ВВ в отдельном окне (indicator_separate_window)?
Почему рассчитываете два BB c однинаковыми характеристиками, а пытаетесь нарисовать один?
Почему верхняя граница ВВ у Вас линия, а нижняя гистограмма?

Буду использовать хендлы) ветку можно удолить!

 
pips #:

Спасибо, но нет. Вот сокращённый вариант индикатора, сравниваю с боллинджером на графике и не идут расчёты, high подставляем и всё правильно, а так Price[i]=high[i]  уже нет. И от #property indicator_buffers 40 значения индикатора всегда разные.

Вот это строку - 

std_dev=MathSqrt(std_dev/period);

надо вытащить из цикла.

Может, и еще ошибки есть, но это первое что заметно.

Причина обращения: