Working with indicator buffers "Haven Market Structure Hl Ll Hl Lh"

Working with indicator buffers "Haven Market Structure Hl Ll Hl Lh"

5 May 2025, 09:25
Maksim Tarutin
0
522

Introduction

To use indicator buffers in your Expert Advisors or simply to read data from indicator buffers, you need to perform several steps:

1. Defining Input Parameters

You need to determine which input parameters the indicator has and which ones you want to modify or use when loading the indicator into your Expert Advisor. In our case, here is my list of input parameters that I use in the indicator Haven Market Structure Hl Ll Hl Lh.

We see these values in the Inputs window when loading the indicator onto the chart.

//=== IMPORTANT: All inputs must be in THE SAME ORDER ===//

input group "===== Structure Analysis =====";
input int   SwingPeriod = 2;
input int   HistoryBars = 500;
input bool  ShowCHoCH    = true;

input group "===== BOS Settings =====";
input bool  UseBodyForBreakout = false;
input int   LabelSize_Line     = 8;
input color BOSUpColor         = clrRoyalBlue;
input color BOSDownColor       = clrRed;
input int   BOSLineWidth       = 2;
input ENUM_LINE_STYLE bosStyle = STYLE_SOLID;

input group "===== CHoCH Settings =====";
input color CHoCHUpColor       = clrDodgerBlue;
input color CHoCHDownColor     = clrFireBrick;
input int   CHoCHLineWidth     = 2;
input ENUM_LINE_STYLE chchStyle = STYLE_DASH;

input group "===== Label Settings =====";
input int   LabelSize          = 10;
input color HHColor            = clrGreen;
input color HLColor            = clrBlue;
input color LHColor            = clrOrange;
input color LLColor            = clrRed;

input group "===== Notification Settings =====";
input bool EnablePushNotifications = false;
input bool EnableAlerts            = false;

2. Creating the Indicator Handle

Next, you need to create an indicator HANDLE and specify the desired indicator parameters for it (this is how we load into our program a version of the indicator with the correct settings), and then we can use it in our code. In this example, we load all available parameters via ICustom. However, you can omit them, and the indicator will load with its default settings defined in its code. The most important parameters here are "SwingPeriod", "ShowCHoCH" and "UseBodyForBreakout"; all others only affect the graphical representation of the indicator.
Note that in MQL5 you must pass parameters to ICustom exactly as they appear in the indicator code, preserving their order. You cannot specify only UseBodyForBreakout—ICustom will pass our parameter to the first listed parameter in the indicator code (which, oddly enough, is "===== Structure Analysis =====", because "input group" counts as a parameter even though it should only separate the inputs).

int marketStructureHandle = iCustom(
                               _Symbol, PERIOD_CURRENT,
                               "\\Indicators\\Market\\Haven Market Structure Hl Ll Hl Lh.ex5", // Specify where our file is located, by default in the Market folder
                               "===== Structure Analysis =====", // (group is entered as a parameter in the indicator, unfortunately this is a feature of MQL5)
                               SwingPeriod,
                               HistoryBars,
                               ShowCHoCH,
                               "===== BOS Settings =====",
                               UseBodyForBreakout,
                               LabelSize_Line,
                               BOSUpColor,
                               BOSDownColor,
                               BOSLineWidth,
                               bosStyle,
                               "===== CHoCH Settings =====",
                               CHoCHUpColor,
                               CHoCHDownColor,
                               CHoCHLineWidth,
                               chchStyle,
                               "===== Label Settings =====",
                               LabelSize,
                               HHColor,
                               HLColor,
                               LHColor,
                               LLColor,
                               "===== Notification Settings =====",
                               EnablePushNotifications,
                               EnableAlerts);

3. Using the CopyBuffer Function

Next, we use CopyBuffer to copy data from the buffers for use in our program. Example:

int bars_to_copy = 100;

CopyBuffer(marketStructureHandle, 0, 0, bars_to_copy, HH_Buffer);
CopyBuffer(marketStructureHandle, 1, 0, bars_to_copy, LL_Buffer);
CopyBuffer(marketStructureHandle, 2, 0, bars_to_copy, HL_Buffer);
CopyBuffer(marketStructureHandle, 3, 0, bars_to_copy, LH_Buffer);
CopyBuffer(marketStructureHandle, 4, 0, bars_to_copy, BOS_UP_Buffer);
CopyBuffer(marketStructureHandle, 5, 0, bars_to_copy, BOS_DOWN_Buffer);
CopyBuffer(marketStructureHandle, 6, 0, bars_to_copy, CHoCH_UP_Buffer);
CopyBuffer(marketStructureHandle, 7, 0, bars_to_copy, CHoCH_DOWN_Buffer);

Now, our arrays (HH_Buffer[], LL_Buffer[], HL_Buffer[], LH_Buffer[], BOS_UP_Buffer[], BOS_DOWN_Buffer[], CHoCH_UP_Buffer[], CHoCH_DOWN_Buffer[]) contain the indicator buffer values for the last bars_to_copy candles on the chart (including empty values when no buffer value exists for a given candle). This is necessary to accurately know which candle and when a specific indicator signal occurred.

5. Printing Data or Further Use in Your Logic

Now, simply print the values of our arrays along with the corresponding date and time.

// Output only non-zero values with date
for (int i = 0; i < bars_to_copy; i++)
{
   string time_str = TimeToString(times[i], TIME_DATE | TIME_MINUTES);

   if (HH_Buffer[i] != EMPTY_VALUE)
      Print(time_str, " | HH = ", DoubleToString(HH_Buffer[i], _Digits));
   if (LL_Buffer[i] != EMPTY_VALUE)
      Print(time_str, " | LL = ", DoubleToString(LL_Buffer[i], _Digits));
   if (HL_Buffer[i] != EMPTY_VALUE)
      Print(time_str, " | HL = ", DoubleToString(HL_Buffer[i], _Digits));
   if (LH_Buffer[i] != EMPTY_VALUE)
      Print(time_str, " | LH = ", DoubleToString(LH_Buffer[i], _Digits));
   if (BOS_UP_Buffer[i] != EMPTY_VALUE)
      Print(time_str, " | BOS UP = ", DoubleToString(BOS_UP_Buffer[i], _Digits));
   if (BOS_DOWN_Buffer[i] != EMPTY_VALUE)
      Print(time_str, " | BOS DOWN = ", DoubleToString(BOS_DOWN_Buffer[i], _Digits));
   if (CHoCH_UP_Buffer[i] != EMPTY_VALUE)
      Print(time_str, " | CHoCH UP = ", DoubleToString(CHoCH_UP_Buffer[i], _Digits));
   if (CHoCH_DOWN_Buffer[i] != EMPTY_VALUE)
      Print(time_str, " | CHoCH DOWN = ", DoubleToString(CHoCH_DOWN_Buffer[i], _Digits));
}

Indicator buffer values output to the terminal.

Conclusion

After obtaining the indicator buffer values in your Expert Advisor, you can use them in your advisor's trading logic.

For a more detailed article on how to use indicator buffers in your Expert Advisors: MQL5 for Newbies: Guide to Using Technical Indicators in Expert Advisors

🔵 My other products: https://www.mql5.com/en/users/maks19900/seller

🔵Telegram Channel: https://t.me/maks_haven

The script file from the example: