//+------------------------------------------------------------------+ //| Supertrend.mq4 | //| Copyright © 2005, Jason Robinson (jnrtrading). | //| http://www.jnrtrading.co.uk | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, Jason Robinson (jnrtrading)." #property link "http://www.jnrtrading.co.uk" #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 MediumSpringGreen #property indicator_color2 Red double TrendUp[]; double TrendDown[]; double NonTrend[]; int st = 0; int UpDownShift; extern int TrendCCI_Period = 14; extern bool Automatic_Timeframe_setting; extern int M1_CCI_Period = 14; extern int M5_CCI_Period = 14; extern int M15_CCI_Period = 14; extern int M30_CCI_Period = 14; extern int H1_CCI_Period = 14; extern int H4_CCI_Period = 14; extern int D1_CCI_Period = 14; extern int W1_CCI_Period = 14; extern int MN_CCI_Period = 14; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0, DRAW_LINE, 0, 2); SetIndexBuffer(0, TrendUp); SetIndexStyle(1, DRAW_LINE, 0, 2); SetIndexBuffer(1, TrendDown); switch(Period()) { case 1: UpDownShift = 3; break; case 5: UpDownShift = 5; break; case 15: UpDownShift = 7; break; case 30: UpDownShift = 9; break; case 60: UpDownShift = 20; break; case 240: UpDownShift = 35; break; case 1440: UpDownShift = 40; break; case 10080: UpDownShift = 100; break; case 43200: UpDownShift = 120; break; } //---- return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int limit, i, cciPeriod; double cciTrendNow14, cciTrendPrevious14, cciTrendNow, cciTrendPrevious; int counted_bars = IndicatorCounted(); //---- check for possible errors if(counted_bars < 0) return(-1); //---- last counted bar will be recounted if(counted_bars > 0) counted_bars--; limit=Bars-counted_bars; if (Automatic_Timeframe_setting == true) { switch(Period()) { case 1: cciPeriod = M1_CCI_Period; break; case 5: cciPeriod = M5_CCI_Period; break; case 15: cciPeriod = M15_CCI_Period; break; case 30: cciPeriod = M30_CCI_Period; break; case 60: cciPeriod = H1_CCI_Period; break; case 240: cciPeriod = H4_CCI_Period; break; case 1440: cciPeriod = D1_CCI_Period; break; case 10080: cciPeriod = W1_CCI_Period; break; case 43200: cciPeriod = MN_CCI_Period; break; } } else { cciPeriod = TrendCCI_Period; } /*switch(cciPeriod) { case 14: break; }*/ //cciPeriod = TrendCCI_Period; SetIndexLabel(0, ("TrendUp " + cciPeriod)); SetIndexLabel(1, ("TrendDown " + cciPeriod)); for(i = limit; i >= 0; i--) { cciTrendNow = iCCI(NULL, 0, cciPeriod, PRICE_TYPICAL, i) + 70; cciTrendPrevious = iCCI(NULL, 0, cciPeriod, PRICE_TYPICAL, i+1) + 70; //cciTrendNow50 = iCCI(NULL, 0, 50, PRICE_TYPICAL, i) + 70; //cciTrendPrevious50 = iCCI(NULL, 0, 50, PRICE_TYPICAL, i+1) + 70; if (cciTrendNow > st && cciTrendPrevious < st) { TrendUp[i+1] = TrendDown[i+1]; //TrendDown[i] = EMPTY_VALUE; } if (cciTrendNow < st && cciTrendPrevious > st) { TrendDown[i+1] = TrendUp[i+1]; //TrendUp[i] = EMPTY_VALUE; } if (cciTrendNow > 0) { TrendUp[i] = Low[i] - Point*UpDownShift; TrendDown[i] = EMPTY_VALUE; if (Close[i] < Open[i] && TrendDown[i+1] != TrendUp[i+1]) { TrendUp[i] = TrendUp[i+1]; } if (TrendUp[i] < TrendUp[i+1] && TrendDown[i+1] != TrendUp[i+1]) { TrendUp[i] = TrendUp[i+1]; } if (High[i] < High[i+1] && TrendDown[i+1] != TrendUp[i+1]) { TrendUp[i] = TrendUp[i+1]; } } else if (cciTrendNow < 0) { TrendDown[i] = High[i] + Point*UpDownShift; TrendUp[i] = EMPTY_VALUE; if (Close[i] > Open[i] && TrendDown[i+1] != TrendUp[i+1]) { TrendDown[i] = TrendDown[i+1]; } if (TrendDown[i] > TrendDown[i+1] && TrendDown[i+1] != TrendUp[i+1]) { TrendDown[i] = TrendDown[i+1]; } if (Low[i] > Low[i+1] && TrendUp[i+1] != TrendDown[i+1]) { TrendDown[i] = TrendDown[i+1]; } } } //---- //---- return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains the lowest prices of each bar
Series array that contains close prices for each bar
Series array that contains open prices of each bar
Series array that contains the highest prices of each bar
Indicator Curves created:
Implements a curve of type DRAW_LINE
Indicators Used:
Commodity channel index
Custom Indicators Used:
Order Management characteristics:
Other Features: