This is a very straight forward request.
What I need is for the Bollinger Bands Buy / Sell functions below to perform the same as the indicator that is attached.
Delivery will comprise of a video / demonstration that the functions will work within an expert advisor / work in a similar manner to the indicator.
I've shared the following below:
Photo of Indicator:

Functions - Bollinger Bands Buy & Sell:
bool BollingerBandsBuy(string symb) { bool state = false; double bid = SymbolInfoDouble(symb, SYMBOL_BID); double ask = SymbolInfoDouble(symb, SYMBOL_ASK); double close = iClose(symb, PERIOD_M5, 1); static bool conditionMet[12]; // Array to store conditionMet for each symbol string symbols_group[] = {symb1, symb2, symb3, symb4, symb5, symb6, symb7, symb9, symb10, symb11, symb12 }; int numSymbols = ArraySize(symbols_group); if (ArraySize(conditionMet) != numSymbols) { ArrayResize(conditionMet, numSymbols); } int symbolIndex = -1; for (int i = 0; i < numSymbols; i++) { if (symb == symbols_group[i]) { symbolIndex = i; break; } } if (symbolIndex == -1) { Print("Symbol not found in the group."); return false; } //------------------------------------------------------------------------ double iBandsMain1 = iBandsMQL4(symb, PERIOD_M15, 20, 2, 0, 1); double iBandsUpper1 = iBandsMQL4(symb, PERIOD_M15, 20, 2, 1, 1); double iBandsLower1 = iBandsMQL4(symb, PERIOD_M15, 20, 2, 2, 1); //------------------------------------------------------------------------ //---------------------- Buy Condition Initial Trigger ------------------- if (close > iBandsUpper1) { conditionMet[symbolIndex] = true; } else if (close < iBandsMain1) { conditionMet[symbolIndex] = false; } //---------------------- Condition Start --------------------------- if (conditionMet[symbolIndex] && ask > iBandsMain1) { state = true; } return state; } //-------------------------------------------------------------------------------------------------------------++ bool BollingerBandsSell(string symb) { bool state = false; double bid = SymbolInfoDouble(symb, SYMBOL_BID); double ask = SymbolInfoDouble(symb, SYMBOL_ASK); double close = iClose(symb, PERIOD_M5, 1); static bool conditionMet[12]; // Array to store conditionMet for each symbol string symbols_group[] = {symb1, symb2, symb3, symb4, symb5, symb6, symb7, symb9, symb10, symb11, symb12 }; int numSymbols = ArraySize(symbols_group); if (ArraySize(conditionMet) != numSymbols) { ArrayResize(conditionMet, numSymbols); } int symbolIndex = -1; for (int i = 0; i < numSymbols; i++) { if (symb == symbols_group[i]) { symbolIndex = i; break; } } if (symbolIndex == -1) { Print("Symbol not found in the group."); return false; } //------------------------------------------------------------------------ double iBandsMain1 = iBandsMQL4(symb, PERIOD_M15, 20, 2, 0, 1); double iBandsUpper1 = iBandsMQL4(symb, PERIOD_M15, 20, 2, 1, 1); double iBandsLower1 = iBandsMQL4(symb, PERIOD_M15, 20, 2, 2, 1); //------------------------------------------------------------------------ //---------------------- Buy Condition Initial Trigger ------------------- if (close < iBandsLower1) { conditionMet[symbolIndex] = true; } else if (close > iBandsMain1) { conditionMet[symbolIndex] = false; } //---------------------- Condition Start --------------------------- if (conditionMet[symbolIndex] && close < iBandsMain1) { state = true; } return state; }
iBands MQL4 Function:
double iBandsMQL4(string symb, ENUM_TIMEFRAMES tf, int period, double StdDeviation, int line, int shift) { ENUM_TIMEFRAMES timeframe3 = TFMigrate(tf); int handleBB = iBands(symb, timeframe3, period, 0, StdDeviation, PRICE_CLOSE); double bbUpper[], bbLower[], bbMiddle[]; ArraySetAsSeries(bbUpper, true); ArraySetAsSeries(bbLower, true); ArraySetAsSeries(bbMiddle, true); CopyBuffer(handleBB, BASE_LINE, 1, shift + 1, bbMiddle); CopyBuffer(handleBB, UPPER_BAND, 1, shift + 1, bbUpper); CopyBuffer(handleBB, LOWER_BAND, 1, shift + 1, bbLower); double iBandsValue; if (line == 0) { iBandsValue = NormalizeDouble(bbMiddle[shift], SymbolInfoInteger(symb, SYMBOL_DIGITS)); } else if (line == 1) { iBandsValue = NormalizeDouble(bbUpper[shift], SymbolInfoInteger(symb, SYMBOL_DIGITS)); } else if (line == 2) { iBandsValue = NormalizeDouble(bbLower[shift], SymbolInfoInteger(symb, SYMBOL_DIGITS)); } else { iBandsValue = 0.0; // Default value in case of invalid line parameter } return iBandsValue; }