//+------------------------------------------------------------------+ //| MPC.mq4 | //| Copyright © 2007, Alexandre | //| http://www.kroufr.ru/content/view/885/124/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, Alexandre" #property link "http://www.kroufr.ru/content/view/885/124/" //---- #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 Magenta #property indicator_color2 Red #property indicator_color3 Aqua //---- input parameters extern int MPC_Range = 40; extern bool LastBarOnly = true; //---- buffers double UppValueBuffer[]; double MidPointBuffer[]; double LowValueBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- if (MPC_Range <= 1) { MPC_Range = 1; } //---- indicators IndicatorShortName("Middle Point Channel (" + MPC_Range + ")"); //---- SetIndexStyle(0, DRAW_LINE); SetIndexLabel(0, "Upper MPC Bound"); SetIndexBuffer(0, UppValueBuffer); SetIndexDrawBegin(0, MPC_Range); //---- SetIndexStyle(1, DRAW_LINE); SetIndexLabel(1, "MPC Line"); SetIndexBuffer(1, MidPointBuffer); SetIndexDrawBegin(1, MPC_Range); //---- SetIndexStyle(2, DRAW_LINE); SetIndexLabel(2, "Lower MPC Bound"); SetIndexBuffer(2, LowValueBuffer); SetIndexDrawBegin(2, MPC_Range); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars = IndicatorCounted(); int Limit; int i, cnt_bars; double hhv, llv, m_pr; static bool run_once; static double m_pr_old; //---- if(counted_bars < 0) return(-1); Limit = Bars - counted_bars; // run once on start if(run_once == false) cnt_bars = Limit - MPC_Range; else if(LastBarOnly == false) cnt_bars = Limit; else cnt_bars = 0; m_pr = (High[cnt_bars] + Low[cnt_bars]) / 2.0; //---- if(MathAbs(m_pr - m_pr_old) < Point) return(0); else m_pr_old = m_pr; //---- for(i = cnt_bars; i >= 0; i--) { hhv = High[iHighest(NULL, 0, MODE_HIGH, MPC_Range, i)]; llv = Low[iLowest (NULL, 0, MODE_LOW, MPC_Range, i)]; UppValueBuffer[i] = hhv; MidPointBuffer[i] = (hhv + llv) / 2.0; LowValueBuffer[i] = llv; } //---- if(run_once == false) run_once = true; //---- return(0); } //+------------------------------------------------------------------+