Stock Portfolio Organizer
The ultimate porfolio management solution.
Shares, Margin, CFD's, Futures and Forex
EOD and Realtime
Dividends and Trust Distributions
And Much More ....
WiseTrader Toolbox
#1 Selling Amibroker Plugin featuring:
Advanced Adaptive Indicators
Advanced Pattern Exploration
Neural Networks
And Much More ....
SuperTrend MULTI TIME FRAME FOR MT4 for Amibroker (AFL)
Copy & Paste Friendly
Back
#property copyright "Copyright © 2011, Xaphod" #property link "http://wwww.xaphod.com" #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 DimGray #property indicator_color2 OrangeRed #property indicator_color3 MediumSeaGreen #property indicator_width1 1 #property indicator_width2 2 #property indicator_width3 2 #property indicator_style1 STYLE_DOT #property indicator_maximum 1 #property indicator_minimum 0 #define INDICATOR_NAME "xSuperTrend MTF" #define INDICATOR_VERSION "v1.01, www.xaphod.com" // Indicator parameters extern string Version_Info=INDICATOR_VERSION; extern string SuperTrend_Settings="——————————————————————————————"; extern int SuperTrend_Period = 10; // SuperTrend ATR Period extern double SuperTrend_Multiplier= 1.7; // SuperTrend Multiplier extern int SuperTrend_TimeFrame = 0; // SuperTrend Timeframe extern bool SuperTrend_AutoTF = True; // Select next higher TF. If TF=M15 then H1 is selected extern bool alertsOn = False; extern bool alertsOnCurrentBar = true; extern bool alertsMessage = true; extern bool alertsSound = false; extern bool alertsEmail = false; // Global module varables double gadUpBuf[]; double gadDnBuf[]; double gadSuperTrend[]; int giTimeFrame; int giRepaintBars; //----------------------------------------------------------------------------- // function: init() // Description: Custom indicator initialization function. //----------------------------------------------------------------------------- int init() { // Set buffers SetIndexStyle(0, DRAW_LINE); SetIndexBuffer(0, gadSuperTrend); SetIndexLabel(0, "SuperTrend"); SetIndexStyle(1, DRAW_LINE); SetIndexBuffer(1, gadDnBuf); SetIndexLabel(1, "SuperTrend Down"); SetIndexStyle(2, DRAW_LINE); SetIndexBuffer(2, gadUpBuf); SetIndexLabel(2, "SuperTrend Up"); // Set Timeframe if (SuperTrend_TimeFrame==0) SuperTrend_TimeFrame=Period(); if (SuperTrend_AutoTF==True) SuperTrend_TimeFrame=NextHigherTF(Period()); // Calculation call via iCustom if (SuperTrend_AutoTF==False && SuperTrend_Settings=="") { giRepaintBars=0; } // Higher Time-frame else if (SuperTrend_TimeFrame!=Period()) { IndicatorShortName(INDICATOR_NAME+" "+TF2Str(SuperTrend_TimeFrame) +"["+SuperTrend_Period+";"+DoubleToStr(SuperTrend_Multiplier,1)+"]"); giRepaintBars=SuperTrend_TimeFrame/Period()*2+1; } // Current Time-frame else { IndicatorShortName(INDICATOR_NAME+" "+TF2Str(SuperTrend_TimeFrame) +"["+SuperTrend_Period+";"+DoubleToStr(SuperTrend_Multiplier,1)+"]"); giRepaintBars=0; } return(0); } //----------------------------------------------------------------------------- // function: deinit() // Description: Custom indicator deinitialization function. //----------------------------------------------------------------------------- int deinit() { return (0); } ///----------------------------------------------------------------------------- // function: start() // Description: Custom indicator iteration function. //----------------------------------------------------------------------------- int start() { int iNewBars, iCountedBars, i; double dAtr,dUpperLevel, dLowerLevel; // Get unprocessed ticks iCountedBars=IndicatorCounted(); if(iCountedBars < 0) return (-1); if(iCountedBars>0) iCountedBars--; iNewBars=MathMax(giRepaintBars,Bars-iCountedBars); for(i=iNewBars; i>=0; i--) { // Calc SuperTrend Locally if (SuperTrend_TimeFrame==Period()) { dAtr = iATR(NULL, 0, SuperTrend_Period, i); dUpperLevel=(High[i]+Low[i])/2+SuperTrend_Multiplier*dAtr; dLowerLevel=(High[i]+Low[i])/2-SuperTrend_Multiplier*dAtr; // Set supertrend levels if (Close[i]>gadSuperTrend[i+1] && Close[i+1]<=gadSuperTrend[i+1]) { gadSuperTrend[i]=dLowerLevel; } else if (Close[i]<gadSuperTrend[i+1] && Close[i+1]>=gadSuperTrend[i+1]) { gadSuperTrend[i]=dUpperLevel; } else if (gadSuperTrend[i+1]<dLowerLevel) gadSuperTrend[i]=dLowerLevel; else if (gadSuperTrend[i+1]>dUpperLevel) gadSuperTrend[i]=dUpperLevel; else gadSuperTrend[i]=gadSuperTrend[i+1]; // Draw Histo gadUpBuf[i]=EMPTY_VALUE; gadDnBuf[i]=EMPTY_VALUE; if (Close[i]>gadSuperTrend[i] || (Close[i]==gadSuperTrend[i] && Close[i+1]>gadSuperTrend[i+1])) gadUpBuf[i]=gadSuperTrend[i]; else if (Close[i]<gadSuperTrend[i] || (Close[i]==gadSuperTrend[i] && Close[i+1]<gadSuperTrend[i+1])) gadDnBuf[i]=gadSuperTrend[i]; } // Calc higher TF SuperTrend via iCustom else { gadUpBuf[i]=EMPTY_VALUE; gadDnBuf[i]=EMPTY_VALUE; gadSuperTrend[i]=iCustom(Symbol(),SuperTrend_TimeFrame,WindowExpertName(),"","",SuperTrend_Period, SuperTrend_Multiplier,SuperTrend_TimeFrame,False,alertsOn,alertsOnCurrentBar,alertsMessage,alertsSound,alertsEmail,0,iBarShift(Symbol(), SuperTrend_TimeFrame, Time[i])); gadDnBuf[i]=iCustom(Symbol(),SuperTrend_TimeFrame,WindowExpertName(),"","",SuperTrend_Period, SuperTrend_Multiplier,SuperTrend_TimeFrame,False,alertsOn,alertsOnCurrentBar,alertsMessage,alertsSound,alertsEmail,1,iBarShift(Symbol(), SuperTrend_TimeFrame, Time[i])); gadUpBuf[i]=iCustom(Symbol(),SuperTrend_TimeFrame,WindowExpertName(),"","",SuperTrend_Period, SuperTrend_Multiplier,SuperTrend_TimeFrame,False,alertsOn,alertsOnCurrentBar,alertsMessage,alertsSound,alertsEmail,2,iBarShift(Symbol(), SuperTrend_TimeFrame, Time[i])); } } if (SuperTrend_TimeFrame==Period()) manageAlerts(); return(0); } //+------------------------------------------------------------------+ //----------------------------------------------------------------------------- // function: TF2Str() // Description: Convert time-frame to a string //----------------------------------------------------------------------------- string TF2Str(int iPeriod) { switch(iPeriod) { case PERIOD_M1: return("M1"); case PERIOD_M5: return("M5"); case PERIOD_M15: return("M15"); case PERIOD_M30: return("M30"); case PERIOD_H1: return("H1"); case PERIOD_H4: return("H4"); case PERIOD_D1: return("D1"); case PERIOD_W1: return("W1"); case PERIOD_MN1: return("MN1"); default: return("M"+iPeriod); } } //----------------------------------------------------------------------------- // function: NextHigherTF() // Description: Select the next higher time-frame. // Note: M15 and M30 both select H1 as next higher TF. //----------------------------------------------------------------------------- int NextHigherTF(int iPeriod) { if (iPeriod==0) iPeriod=Period(); switch(iPeriod) { case PERIOD_M1: return(PERIOD_M5); case PERIOD_M5: return(PERIOD_M15); case PERIOD_M15: return(PERIOD_H1); case PERIOD_M30: return(PERIOD_H1); case PERIOD_H1: return(PERIOD_H4); case PERIOD_H4: return(PERIOD_D1); case PERIOD_D1: return(PERIOD_W1); case PERIOD_W1: return(PERIOD_MN1); case PERIOD_MN1: return(PERIOD_MN1); default: return(Period()); } } //------------------------------------------------------------------- // //------------------------------------------------------------------- // // // // // void manageAlerts() { if (alertsOn) { if (alertsOnCurrentBar) int whichBar = 0; else whichBar = 1; if ((gadUpBuf[whichBar] != EMPTY_VALUE && gadUpBuf[whichBar+1] == EMPTY_VALUE) || (gadDnBuf[whichBar]!=EMPTY_VALUE && gadDnBuf[whichBar+1]==EMPTY_VALUE)) { if (gadUpBuf[whichBar] != EMPTY_VALUE) doAlert(whichBar,"up"); if (gadDnBuf[whichBar] != EMPTY_VALUE) doAlert(whichBar,"down"); } } } // // // // // void doAlert(int forBar, string doWhat) { static string previousAlert="nothing"; static datetime previousTime; string message; if (previousAlert != doWhat || previousTime != Time[forBar]) { previousAlert = doWhat; previousTime = Time[forBar]; // // // // // message = TF2Str(Period())+" "+Symbol()+" at "+TimeToStr(TimeLocal(),TIME_SECONDS)+" super trend signal changed to "+doWhat; if (alertsMessage) Alert(message); if (alertsEmail) SendMail(StringConcatenate(Symbol(),"super trend "),message); if (alertsSound) PlaySound("alert2.wav"); } }