copy buffer problem

 

hi.

when i want to copy 100 number of rsi information to buffer , it copy all time information to buffer and plot unwanted line in all time.

//+------------------------------------------------------------------+
//|                                                       3 time.mq5 |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Rsi1
#property indicator_label1  "Rsi1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

//--- indicator buffers
double         Rsi1Buffer[];
int Rsi1Handle=0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Rsi1Buffer,INDICATOR_DATA);
   //PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
   Rsi1Handle=iRSI(_Symbol,PERIOD_H4,14,PRICE_CLOSE);
   
   ArraySetAsSeries(Rsi1Buffer,true);
  
//---
   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[])
  {
//---
  CopyBuffer(Rsi1Handle,0,0,100,Rsi1Buffer);

  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
SGHAHREMANI419:

hi.

when i want to copy 100 number of rsi information to buffer , it copy all time information to buffer and plot unwanted line in all time.

There's a great article I read that may help you, it's written in a way that's easy to follow, here's the link.




 
SGHAHREMANI419:

hi.

when i want to copy 100 number of rsi information to buffer , it copy all time information to buffer and plot unwanted line in all time.

Remove the Rsi1Handle variable from the global scope and declared it inside the OnInit()function. This ensures that it's properly initialized.
In the OnCalculate()function, modify the CopyBuffer()function to copy all available RSI values (up to rates_total ) into the Rsi1Buffer. This will ensure you're copying all the relevant data.
After copying the buffer, loop through the remaining values in Rsi1Buffer(if any) and set them to EMPTY_VALUE . This ensures that any remaining values beyond rates_total are not plotted, preventing unwanted lines.
 
Gamuchirai Zororo Ndawana #:
There's a great article I read that may help you, it's written in a way that's easy to follow, here's the link.




thanks a lot
 
Nardus Van Staden #:
Remove the Rsi1Handle variable from the global scope and declared it inside the OnInit()function. This ensures that it's properly initialized.
In the OnCalculate()function, modify the CopyBuffer()function to copy all available RSI values (up to rates_total ) into the Rsi1Buffer. This will ensure you're copying all the relevant data.
After copying the buffer, loop through the remaining values in Rsi1Buffer(if any) and set them to EMPTY_VALUE . This ensures that any remaining values beyond rates_total are not plotted, preventing unwanted lines.

thanks a lot. its so helpful;

do you know how can i set default value to buffer. i want set default value empty-value to buffer and don't use loop.

 
Nardus Van Staden #: Remove the Rsi1Handle variable from the global scope and declared it inside the OnInit()function. This ensures that it's properly initialized.

Wrong! It must be global as to be remembered. It must be properly initialized in OnInit.


Perhaps you should read the manual, especially the examples.
   How To Ask Questions The Smart Way. (2004)
      How To Interpret Answers.
         RTFM and STFW: How To Tell You've Seriously Screwed Up.

They all (including iCustom) return a handle (an int). You get that in OnInit. In OnTick/OnCalculate (after the indicator has updated its buffers), you use the handle, shift and count to get the data.
          Technical Indicators - Reference on algorithmic/automated trading language for MetaTrader 5
          Timeseries and Indicators Access / CopyBuffer - Reference on algorithmic/automated trading language for MetaTrader 5
          How to start with MQL5 - General - MQL5 programming forum - Page 3 #22 (2020)
          How to start with MQL5 - MetaTrader 5 - General - MQL5 programming forum - Page 7 #61 (2020)
          MQL5 for Newbies: Guide to Using Technical Indicators in Expert Advisors - MQL5 Articles (2010)
          How to call indicators in MQL5 - MQL5 Articles (2010)