//+------------------------------------------------------------------+ //| G Channel.mq4 | //| Copyright 2021,Kaustubh | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2021,Kaustubh" #property link "https://www.mql5.com" #property version "1.00" #property strict #property indicator_chart_window #property indicator_buffers 5 #property indicator_plots 5 //--- plot Upper #property indicator_label1 "Upper" #property indicator_type1 DRAW_LINE #property indicator_color1 clrCrimson #property indicator_style1 STYLE_SOLID #property indicator_width1 2 //--- plot Lower #property indicator_label2 "Lower" #property indicator_type2 DRAW_LINE #property indicator_color2 clrMidnightBlue #property indicator_style2 STYLE_SOLID #property indicator_width2 2 //--- plot Middle #property indicator_label3 "Middle" #property indicator_type3 DRAW_LINE #property indicator_color3 clrOrangeRed #property indicator_style3 STYLE_SOLID #property indicator_width3 2 //--- plot a #property indicator_label4 "a" #property indicator_type4 DRAW_NONE //--- plot b #property indicator_label5 "b" #property indicator_type5 DRAW_NONE #define src getPrice(InputPrice, open, close, high, low, i) #define nz NonZero #define max MathMax #define min MathMin #define abs MathAbs //--- input parameters input int ChannelPeriod =100; input ENUM_APPLIED_PRICE InputPrice = PRICE_CLOSE; // Input price //input ENUM_TIMEFRAMES TimeFrame = PERIOD_CURRENT; //Multi-TimeFrame period //--- indicator buffers double UpperBuffer[]; double LowerBuffer[]; double MiddleBuffer[]; double aBuffer[]; double bBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,UpperBuffer); SetIndexBuffer(1,LowerBuffer); SetIndexBuffer(2,MiddleBuffer); SetIndexBuffer(3,aBuffer); SetIndexBuffer(4,bBuffer); for(int i = 0; i <= 5; i++) SetIndexEmptyValue(i, 0.0); for(int i = 3; i <= 5; i++) SetIndexLabel(i, ""); //--- 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[]) { //--- int limit = rates_total - 1 - ChannelPeriod; if(prev_calculated > 0) limit = rates_total - prev_calculated + 1; for(int i = limit; i >= 0; i--) { aBuffer[i] = max(src, nz(aBuffer[i + 1])) - nz(aBuffer[i+1] - bBuffer[i+1]) / ChannelPeriod; bBuffer[i] = min(src, nz(bBuffer[i + 1])) + nz(aBuffer[i+1] - bBuffer[i+1])/ ChannelPeriod; UpperBuffer[i] = aBuffer[i]; LowerBuffer[i] = bBuffer[i]; MiddleBuffer[i] = (aBuffer[i] + bBuffer[i]) / 2; } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double getPrice(ENUM_APPLIED_PRICE tprice, const double &open[], const double &close[], const double &high[], const double &low[], int i) { if(i >= 0) switch(tprice) { case PRICE_CLOSE: return(close[i]); case PRICE_OPEN: return(open[i]); case PRICE_HIGH: return(high[i]); case PRICE_LOW: return(low[i]); case PRICE_MEDIAN: return((high[i] + low[i]) / 2.0); case PRICE_TYPICAL: return((high[i] + low[i] + close[i]) / 3.0); case PRICE_WEIGHTED: return((high[i] + low[i] + close[i] + close[i]) / 4.0); } return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double NonZero(double _a, double _b = 0) { if(_a == 0 || _a == EMPTY_VALUE) return _b; else return _a; } //+------------------------------------------------------------------+ //ORIGINL CODE FROM TRADINGVIEW by Alex Grover //@version=4 //study("G-Channels",overlay=true) //length = input(100),src = input(close) ////---- //a = 0.,b = 0. //a := max(src,nz(a[1])) - nz(a[1] - b[1])/length //b := min(src,nz(b[1])) + nz(a[1] - b[1])/length //avg = avg(a,b) ////---- //plot(a,"Upper",color=color.blue,linewidth=2,transp=0) //plot(avg,"Average",color=color.orange,linewidth=2,transp=0) //plot(b,"Lower",color=color.blue,linewidth=2,transp=0) //+------------------------------------------------------------------+