117 lines
6.1 KiB
Markdown
117 lines
6.1 KiB
Markdown
# SetIndexBuffer
|
||
|
||
The function binds a specified indicator buffer with one-dimensional dynamic array of the [double](/en/docs/basis/types/double) type.
|
||
|
||
```
|
||
bool SetIndexBuffer(
|
||
int index, // buffer index
|
||
double buffer[], // array
|
||
ENUM_INDEXBUFFER_TYPE data_type // what will be stored
|
||
);
|
||
|
||
```
|
||
|
||
Parameters
|
||
|
||
index
|
||
|
||
[in] Number of the indicator buffer. The numbering starts with 0. The number must be less than the value declared in [#property indicator_buffers](/en/docs/basis/preprosessor/compilation).
|
||
|
||
buffer[]
|
||
|
||
[in] An array declared in the custom indicator program.
|
||
|
||
data_type
|
||
|
||
[in] Type of data stored in the indicator array. By default it is [INDICATOR_DATA](/en/docs/constants/indicatorconstants/customindicatorproperties#enum_indexbuffer_type_enum) (values of the calculated indicator). It may also take the value of [INDICATOR_COLOR_INDEX](/en/docs/constants/indicatorconstants/customindicatorproperties#enum_indexbuffer_type_enum); in this case this buffer is used for storing color indexes for the previous indicator buffer. You can specify up to 64 [colors](/en/docs/constants/objectconstants/webcolors) in the [#property indicator_colorN](/en/docs/basis/preprosessor/compilation) line. The [INDICATOR_CALCULATIONS](/en/docs/constants/indicatorconstants/customindicatorproperties#enum_indexbuffer_type_enum) value means that the buffer is used in intermediate calculations of the indicator and is not intended for drawing.
|
||
|
||
Return Value
|
||
|
||
If successful, returns [true](/en/docs/basis/types/integer/boolconst), otherwise - [false](/en/docs/basis/types/integer/boolconst).
|
||
|
||
Note
|
||
|
||
After binding, the dynamic array buffer[] will be indexed as in common arrays, even if the indexing of [timeseries](/en/docs/series) is pre-installed for the bound array. If you want to change the order of access to elements of the indicator array, use the [ArraySetAsSeries()](/en/docs/array/arraysetasseries) function after binding the array using the SetIndexBuffer() function. Please note that you can't change the size for dynamic arrays set as indicator buffers by the function [SetIndexBuffer()](/en/docs/customind/setindexbuffer). For indicator buffers, all operations of size changes are performed by the executing sub-system of the terminal.
|
||
|
||
Example:
|
||
|
||
```
|
||
//+------------------------------------------------------------------+
|
||
//| TestCopyBuffer1.mq5 |
|
||
//| Copyright 2009, MetaQuotes Software Corp. |
|
||
//| https://www.mql5.com |
|
||
//+------------------------------------------------------------------+
|
||
#property copyright "2009, MetaQuotes Software Corp."
|
||
#property link "https://www.mql5.com"
|
||
#property version "1.00"
|
||
|
||
#property indicator_separate_window
|
||
#property indicator_buffers 1
|
||
#property indicator_plots 1
|
||
//---- plot MA
|
||
#property indicator_label1 "MA"
|
||
#property indicator_type1 DRAW_LINE
|
||
#property indicator_color1 clrRed
|
||
#property indicator_style1 STYLE_SOLID
|
||
#property indicator_width1 1
|
||
//--- input parameters
|
||
input bool AsSeries=true;
|
||
input int period=15;
|
||
input ENUM_MA_METHOD smootMode=MODE_EMA;
|
||
input ENUM_APPLIED_PRICE price=PRICE_CLOSE;
|
||
input int shift=0;
|
||
//--- indicator buffers
|
||
double MABuffer[];
|
||
int ma_handle;
|
||
//+------------------------------------------------------------------+
|
||
//| Custom indicator initialization function |
|
||
//+------------------------------------------------------------------+
|
||
int OnInit()
|
||
{
|
||
//--- indicator buffers mapping
|
||
if(AsSeries) ArraySetAsSeries(MABuffer,true);
|
||
Print("Indicator buffer is timeseries = ",ArrayGetAsSeries(MABuffer));
|
||
SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
|
||
Print("Indicator buffer after SetIndexBuffer() is timeseries = ",
|
||
ArrayGetAsSeries(MABuffer));
|
||
|
||
//--- change the order of accessing elements of the indicator buffer
|
||
ArraySetAsSeries(MABuffer,AsSeries);
|
||
|
||
IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries);
|
||
//---
|
||
ma_handle=iMA(Symbol(),0,period,shift,smootMode,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[])
|
||
{
|
||
//--- Copy the values of the moving average in the buffer MABuffer
|
||
int copied=CopyBuffer(ma_handle,0,0,rates_total,MABuffer);
|
||
|
||
Print("MABuffer[0] = ",MABuffer[0]);// Depending on the value AsSeries
|
||
// Will receive a very old value
|
||
// Or for the current unfinished bar
|
||
|
||
//--- return value of prev_calculated for next call
|
||
return(rates_total);
|
||
}
|
||
//+------------------------------------------------------------------+
|
||
|
||
```
|
||
|
||
See also
|
||
|
||
[Custom Indicator Properties](/en/docs/constants/indicatorconstants/customindicatorproperties), [Access to timeseries and indicators](/en/docs/series)
|