MT5 小白关于自定义指标代码碰到的疑问,望大家帮帮忙。

 

目的:想在本时段图上显示其他级别的布林线,但只要规定K线内的数据,且循环中当产生新的K线时,旧的非“显示根数”内的被清除掉。(显示根数见代码的参数)

有附件:截图(后面的不要的数据如何才能清除掉?)

出现的问题:只想要“显示根数”的布林线显示在一小时的图上,后面的一大截非“显示根数”内的数据都不显示,请问可以做到么?

#property copyright "Copyright 2022, MetaQuotes Ltd."

#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3
//--- plot BL_UP
#property indicator_label1  "BL_UP"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrYellow
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot BL_MIDDLE
#property indicator_label2  "BL_MIDDLE"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrWhite
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot BL_DOWN
#property indicator_label3  "BL_DOWN"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrYellow
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//--- input parameters
input bool     AsSeries=true;
input ENUM_TIMEFRAMES 时间选择=PERIOD_H4;
input int      period=20;
input double   标准差=2.0;
input ENUM_APPLIED_PRICE price=PRICE_CLOSE;
input int 显示根数=23;
//--- indicator buffers
double         BL_UPBuffer[];
double         BL_MIDDLEBuffer[];
double         BL_DOWNBuffer[];

int bl_handle;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BL_UPBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,BL_MIDDLEBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,BL_DOWNBuffer,INDICATOR_DATA);
   
   ArraySetAsSeries(BL_UPBuffer,AsSeries);
   ArraySetAsSeries(BL_MIDDLEBuffer,AsSeries);
   ArraySetAsSeries(BL_DOWNBuffer,AsSeries);
   
   bl_handle=iBands(Symbol(),时间选择,period,0,标准差,price);

//---
   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[])
  {
//---
   double bl1[];
   ArraySetAsSeries(bl1,true);
   CopyBuffer(bl_handle,0,0,rates_total,bl1);
   
   double bl2[];
   ArraySetAsSeries(bl2,true);
   CopyBuffer(bl_handle,1,0,rates_total,bl2);
   
   double bl3[];
   ArraySetAsSeries(bl3,true);
   CopyBuffer(bl_handle,2,0,rates_total,bl3);
   
   datetime time_bl[];
   ArraySetAsSeries(time_bl,true);
   CopyTime(NULL,时间选择,0,rates_total,time_bl);
   ArraySetAsSeries(time,true);
   
   int y=0;
   for(int i=0;i<显示根数;i++)
   {
      if(time[i]<time_bl[y]) y++;
      BL_UPBuffer[i]=bl2[y];
      BL_MIDDLEBuffer[i]=bl1[y];
      BL_DOWNBuffer[i]=bl3[y];
   }  
   return(rates_total);

  }



附加的文件:
 
//+------------------------------------------------------------------+
//|                                               test_mtf_bands.mq5 |
//|                                           Copyright 2022,fxMeter |
//|                           https://www.mql5.com/en/users/fxmeter |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022,fxMeter"
#property link      "https://www.mql5.com/en/users/fxmeter"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3
//--- plot BL_UP
#property indicator_label1  "BL_UP"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrYellow
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot BL_MIDDLE
#property indicator_label2  "BL_MIDDLE"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrWhite
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot BL_DOWN
#property indicator_label3  "BL_DOWN"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrYellow
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//--- input parameters

input ENUM_TIMEFRAMES 时间选择=PERIOD_H4;
input int      period=20;
input double   标准差=2.0;
input ENUM_APPLIED_PRICE price=PRICE_CLOSE;
input int 显示根数=23;
//--- indicator buffers
double         BL_UPBuffer[];
double         BL_MIDDLEBuffer[];
double         BL_DOWNBuffer[];

int bl_handle;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
   SetIndexBuffer(0,BL_UPBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,BL_MIDDLEBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,BL_DOWNBuffer,INDICATOR_DATA);

   ArraySetAsSeries(BL_UPBuffer,true);
   ArraySetAsSeries(BL_MIDDLEBuffer,true);
   ArraySetAsSeries(BL_DOWNBuffer,true);

   bl_handle=iBands(Symbol(),时间选择,period,0,标准差,price);
   
   if(bl_handle==-1)return(INIT_FAILED);

   for(int i=0; i<3; i++)
      PlotIndexSetDouble(i,PLOT_EMPTY_VALUE,0.0);

//---
   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[])
{
//---
   double bl1[];
   ArraySetAsSeries(bl1,true);

   double bl2[];
   ArraySetAsSeries(bl2,true);

   double bl3[];
   ArraySetAsSeries(bl3,true);

   if(CopyBuffer(bl_handle,0,0,显示根数,bl1)!=显示根数)return(0);
   if(CopyBuffer(bl_handle,1,0,显示根数,bl2)!=显示根数)return(0);
   if(CopyBuffer(bl_handle,2,0,显示根数,bl3)!=显示根数)return(0);

   datetime time_bl[];
   ArraySetAsSeries(time_bl,true);
   int copied = CopyTime(NULL,时间选择,0,显示根数,time_bl);
   if(copied!=显示根数)
      return(0);

   ArraySetAsSeries(time,true);

   if(prev_calculated<=0)
   {
      ArrayInitialize(BL_DOWNBuffer,0.0);
      ArrayInitialize(BL_MIDDLEBuffer,0.0);
      ArrayInitialize(BL_UPBuffer,0.0);
   }

   int i,y=0;
   for(i=0; i<显示根数; i++)
   {
      if(time[i]<time_bl[y])
         y++;
      BL_UPBuffer[i]=bl2[y];
      BL_MIDDLEBuffer[i]=bl1[y];
      BL_DOWNBuffer[i]=bl3[y];
      if(y>=copied)
         break;
   }

   BL_UPBuffer[i]=0.0;
   BL_MIDDLEBuffer[i]=0.0;
   BL_DOWNBuffer[i]=0.0;

   return(rates_total);
}


//+------------------------------------------------------------------+
附加的文件: