ilnar Gabdrakhmanov:
Помогите разораться, что не так с кодом индикатора.
После запуска не обновляется данный. Нужно или запустить по новой или обновить тайминг.
Код:
//+------------------------------------------------------------------+ //| BB BLG.mq5 | //| Copyright © 2022, Vladimir Karputov | //| https://www.mql5.com/en/users/barabashkakvn | //+------------------------------------------------------------------+ #property copyright "Copyright © 2022, Vladimir Karputov" #property link "https://www.mql5.com/en/users/barabashkakvn" #property version "1.00" #property indicator_separate_window #property indicator_buffers 4 #property indicator_plots 1 //--- plot BLG #property indicator_label1 "BLG" #property indicator_type1 DRAW_LINE #property indicator_color1 clrDeepSkyBlue #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- input parameters input group "Bands" input int Inp_Bands_bands_period = 20; // Bands: period for average line calculation input int Inp_Bands_bands_shift = 0; // Bands: horizontal shift of the indicator input double Inp_Bands_deviation = 2.0; // Bands: number of standard deviations input ENUM_APPLIED_PRICE Inp_Bands_applied_price = PRICE_CLOSE; // Bands: type of price //--- indicator buffers double BLGBuffer[]; double BandsUpperBuffer[]; double BandsMiddleBuffer[]; double BandsLowerBuffer[]; //--- int handle_iBands; // variable for storing the handle of the iBands indicator int bars_calculated = 0; // we will keep the number of values in the Bollinger Bands indicator bool m_init_error = false; // error on InInit //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,BLGBuffer,INDICATOR_DATA); SetIndexBuffer(1,BandsUpperBuffer,INDICATOR_CALCULATIONS); SetIndexBuffer(2,BandsMiddleBuffer,INDICATOR_CALCULATIONS); SetIndexBuffer(3,BandsLowerBuffer,INDICATOR_CALCULATIONS); //--- create handle of the indicator iBands handle_iBands=iBands(Symbol(),Period(),Inp_Bands_bands_period, Inp_Bands_bands_shift,Inp_Bands_deviation,Inp_Bands_applied_price); //--- if the handle is not created if(handle_iBands==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iBands indicator for the symbol %s/%s, error code %d", Symbol(), EnumToString(Period()), GetLastError()); //--- the indicator is stopped early m_init_error=true; return(INIT_SUCCEEDED); } //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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(m_init_error) return(0); if(rates_total<Inp_Bands_bands_period) return(0); //--- number of values copied from the iBands indicator int values_to_copy; //--- determine the number of values calculated in the indicator int calculated=BarsCalculated(handle_iBands); if(calculated<=0) { PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError()); return(0); } //--- if it is the first start of calculation of the indicator or if the number of values in the iBands indicator changed //---or if it is necessary to calculated the indicator for two or more bars (it means something has changed in the price history) if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1) { //--- if the size of indicator buffers is greater than the number of values in the iBands indicator for symbol/period, then we don't copy everything //--- otherwise, we copy less than the size of indicator buffers if(calculated>rates_total) values_to_copy=rates_total; else values_to_copy=calculated; } else { //--- it means that it's not the first time of the indicator calculation, and since the last call of OnCalculate() //--- for calculation not more than one bar is added values_to_copy=(rates_total-prev_calculated)+1; } //--- fill the array with values of the Bollinger Bands indicator //--- if FillArraysFromBuffer returns false, it means the information is nor ready yet, quit operation if(!FillArraysFromBuffers(BandsMiddleBuffer,BandsUpperBuffer,BandsLowerBuffer,Inp_Bands_bands_shift,handle_iBands,values_to_copy)) return(0); //--- memorize the number of values in the Bollinger Bands indicator bars_calculated=calculated; int limit=prev_calculated-1; if(prev_calculated==0) limit=Inp_Bands_bands_period+3; for(int i=limit; i<rates_total; i++) { BLGBuffer[i]=(close[i]-BandsLowerBuffer[i])/(BandsUpperBuffer[i]-BandsLowerBuffer[i]); } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //| Filling indicator buffers from the iBands indicator | //+------------------------------------------------------------------+ bool FillArraysFromBuffers(double &base_values[], // indicator buffer of the middle line of Bollinger Bands double &upper_values[], // indicator buffer of the upper border double &lower_values[], // indicator buffer of the lower border int shift, // shift int ind_handle, // handle of the iBands indicator int amount // number of copied values ) { //--- reset error code ResetLastError(); //--- fill a part of the MiddleBuffer array with values from the indicator buffer that has 0 index if(CopyBuffer(ind_handle,0,-shift,amount,base_values)<0) { //--- if the copying fails, tell the error code PrintFormat("Failed to copy data from the iBands indicator, error code %d",GetLastError()); //--- quit with zero result - it means that the indicator is considered as not calculated return(false); } //--- fill a part of the UpperBuffer array with values from the indicator buffer that has index 1 if(CopyBuffer(ind_handle,1,-shift,amount,upper_values)<0) { //--- if the copying fails, tell the error code PrintFormat("Failed to copy data from the iBands indicator, error code %d",GetLastError()); //--- quit with zero result - it means that the indicator is considered as not calculated return(false); } //--- fill a part of the LowerBuffer array with values from the indicator buffer that has index 2 if(CopyBuffer(ind_handle,2,-shift,amount,lower_values)<0) { //--- if the copying fails, tell the error code PrintFormat("Failed to copy data from the iBands indicator, error code %d",GetLastError()); //--- quit with zero result - it means that the indicator is considered as not calculated return(false); } //--- everything is fine return(true); } //+------------------------------------------------------------------+ //| Indicator deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if(handle_iBands!=INVALID_HANDLE) IndicatorRelease(handle_iBands); } //+------------------------------------------------------------------+
Результат:
Файлы:
BB_BLG.mq5
17 kb
Спасибо

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Помогите разораться, что не так с кодом индикатора.
После запуска не обновляется данный. Нужно или запустить по новой или обновить тайминг.