//+------------------------------------------------------------------+ //| Traders Dynamic Index.mq4 | //| Copyright © 2006, Dean Malone | //| www.compassfx.com | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //| Traders Dynamic Index | //| | //| This hybrid indicator is developed to assist traders in their | //| ability to decipher and monitor market conditions related to | //| trend direction, market strength, and market volatility. | //| | //| Even though comprehensive, the T.D.I. is easy to read and use. | //| | //| Green line = RSI Price line | //| Red line = Trade Signal line | //| Blue lines = Volatility Band | //| Yellow line = Market Base Line | //| | //| Trend Direction - Immediate and Overall | //| Immediate = Green over Red...price action is moving up. | //| Red over Green...price action is moving down. | //| | //| Overall = Yellow line trends up and down generally between the | //| lines 32 & 68. Watch for Yellow line to bounces off | //| these lines for market reversal. Trade long when | //| price is above the Yellow line, and trade short when | //| price is below. | //| | //| Market Strength & Volatility - Immediate and Overall | //| Immediate = Green Line - Strong = Steep slope up or down. | //| Weak = Moderate to Flat slope. | //| | //| Overall = Blue Lines - When expanding, market is strong and | //| trending. When constricting, market is weak and | //| in a range. When the Blue lines are extremely tight | //| in a narrow range, expect an economic announcement | //| or other market condition to spike the market. | //| | //| | //| Entry conditions | //| Scalping - Long = Green over Red, Short = Red over Green | //| Active - Long = Green over Red & Yellow lines | //| Short = Red over Green & Yellow lines | //| Moderate - Long = Green over Red, Yellow, & 50 lines | //| Short= Red over Green, Green below Yellow & 50 line| //| | //| Exit conditions* | //| Long = Green crosses below Red | //| Short = Green crosses above Red | //| * If Green crosses either Blue lines, consider exiting when | //| when the Green line crosses back over the Blue line. | //| | //| | //| IMPORTANT: The default settings are well tested and proven. | //| But, you can change the settings to fit your | //| trading style. | //| | //| Price & Line Type settings: | //| RSI Price settings | //| 0 = Close price [DEFAULT] | //| 1 = Open price. | //| 2 = High price. | //| 3 = Low price. | //| 4 = Median price, (high+low)/2. | //| 5 = Typical price, (high+low+close)/3. | //| 6 = Weighted close price, (high+low+close+close)/4. | //| | //| RSI Price Line & Signal Line Type settings | //| 0 = Simple moving average [DEFAULT] | //| 1 = Exponential moving average | //| 2 = Smoothed moving average | //| 3 = Linear weighted moving average | //| | //| Good trading, | //| | //| Dean | //+------------------------------------------------------------------+ #property indicator_separate_window #property indicator_buffers 7 //---- #property indicator_color1 Black #property indicator_color2 MediumBlue #property indicator_color3 Yellow #property indicator_color4 MediumBlue #property indicator_color5 Green #property indicator_color6 Red #property indicator_color7 Aqua #property indicator_style7 2 //#property indicator_maximum 85 //#property indicator_minimum 15 extern bool Show_VISUAL_Alerts=true; extern bool SoundON=true; extern int SHIFT_Sideway=0; extern int SHIFT_Up_Down=0; extern int RSI_Period=13; //8-25 extern int RSI_Price=0; //0-6 extern int Volatility_Band=34; //20-40 extern int RSI_Price_Line=2; extern int RSI_Price_Type=0; //0-3 extern int Trade_Signal_Line=7; extern bool SHOW_Trade_Signal_Line2=true; extern int Trade_Signal_Line2=18; extern int Trade_Signal_Type=0; //0-3 //---- #define UPPERLINE "UPPERLINE" #define MEDLINE "MEDLINE" #define LOWERLINE "LOWERLINE" //---- double RSIBuf[],UpZone[],MdZone[],DnZone[],MaBuf[],MbBuf[],McBuf[]; double alertTag; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int init() { IndicatorShortName("Traders Dynamic Index Visual"); SetIndexBuffer(0,RSIBuf); SetIndexBuffer(1,UpZone); SetIndexBuffer(2,MdZone); SetIndexBuffer(3,DnZone); SetIndexBuffer(4,MaBuf); SetIndexBuffer(5,MbBuf); //---- if(SHOW_Trade_Signal_Line2 ==true){SHOW_Trade_Signal_Line2=DRAW_LINE; } else {SHOW_Trade_Signal_Line2=DRAW_NONE; } SetIndexStyle(6,SHOW_Trade_Signal_Line2); SetIndexBuffer(6,McBuf); // SetIndexStyle(0,DRAW_NONE); SetIndexStyle(1,DRAW_LINE); SetIndexStyle(2,DRAW_LINE,0,2); SetIndexStyle(3,DRAW_LINE); SetIndexStyle(4,DRAW_LINE,0,2); SetIndexStyle(5,DRAW_LINE,0,1); // SetIndexLabel(0,NULL); SetIndexLabel(1,"VB High"); SetIndexLabel(2,"Market Base Line"); SetIndexLabel(3,"VB Low"); SetIndexLabel(4,"RSI Price Line"); SetIndexLabel(5,"Trade Signal Line"); SetIndexLabel(6,"Trade Signal2 Line"); /* SetLevelValue(0,50); SetLevelValue(1,68); SetLevelValue(2,32); SetLevelStyle(STYLE_DOT,1,DarkSlateGray);*/ return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int deinit() { ObjectsDeleteAll(0,OBJ_TREND); ObjectDelete("TDI_SIG");ObjectDelete("TDI_SIG1");ObjectDelete("TDI_SIG2"); ObjectDelete("TDI_SIG3");ObjectDelete("TDI_SIG4");ObjectDelete("TDI_SIG5"); ObjectDelete("TDI_SIG6");ObjectDelete("TDI_SIG7");ObjectDelete("TDI_SIG8"); ObjectDelete("TDI_SIG9"); //---- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { CreateLEVEL(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void Createline(string objName, double start, double end, color clr) { ObjectCreate(objName, OBJ_TREND,WindowFind("Traders Dynamic Index Visual"),0, start, Time[0], end); ObjectSet(objName, OBJPROP_COLOR, clr); ObjectSet(objName, OBJPROP_STYLE, 2); ObjectSet(objName, OBJPROP_RAY, false); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void DeleteCreateline() { ObjectDelete(UPPERLINE);ObjectDelete(LOWERLINE);ObjectDelete(MEDLINE); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CreateLEVEL() { DeleteCreateline(); Createline(UPPERLINE, 68, 68,C'70,70,70'); Createline(LOWERLINE, 50, 50,C'00,70,00'); Createline(MEDLINE, 32, 32,C'70,70,70'); //---- double MA,RSI[]; ArrayResize(RSI,Volatility_Band); int counted_bars=IndicatorCounted(); int limit=Bars-counted_bars-1; for(int i=limit; i>=0; i--) { RSIBuf[i]=(iRSI(NULL,0,RSI_Period,RSI_Price,i)); MA=0; for(int x=i; x<i+Volatility_Band; x++) { RSI[x-i]=RSIBuf[x]; MA+=RSIBuf[x]/Volatility_Band; } UpZone[i]=(MA + (1.6185 * StDev(RSI,Volatility_Band))); DnZone[i]=(MA - (1.6185 * StDev(RSI,Volatility_Band))); MdZone[i]=((UpZone[i] + DnZone[i])/2); } for(i=limit-1;i>=0;i--) { MaBuf[i]=(iMAOnArray(RSIBuf,0,RSI_Price_Line,0,RSI_Price_Type,i)); MbBuf[i]=(iMAOnArray(RSIBuf,0,Trade_Signal_Line,0,Trade_Signal_Type,i)); McBuf[i]=(iMAOnArray(RSIBuf,0,Trade_Signal_Line2,0,Trade_Signal_Type,i)); //---- string Signal="", Signal2="",Signal2A="", Signal3="",Signal4="",Signal5=""; color TDI_col,TDI_col2,TDI_col3,TDI_col4; if(Show_VISUAL_Alerts==true) { static double crossPrice; int crossDirection;crossDirection =0; //signals if((MaBuf[0]>MbBuf[0])&&(MbBuf[0]<MdZone[0])&&(MaBuf[0]< MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){Signal="?";TDI_col=SeaGreen;} if((MaBuf[0]>MbBuf[0])&&(MbBuf[0]<MdZone[0])&&(MaBuf[0]< MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){Signal2A="Weak Buy";TDI_col2=SeaGreen;} if((MaBuf[0]>MbBuf[0])&&(MbBuf[0]<MdZone[0])&&(MaBuf[0]< MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){Signal2=" @ "+DoubleToStr(crossPrice,Digits)+"";TDI_col2=SeaGreen;} if((MaBuf[0]>MbBuf[0])&&(MbBuf[0]<MdZone[0])&&(MaBuf[0]< MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){crossPrice=Bid;crossDirection =2;} // if((MaBuf[0]<MbBuf[0])&&(MbBuf[0]> MdZone[0])&&(MaBuf[0]> MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){Signal="?";TDI_col=Orange;} if((MaBuf[0]<MbBuf[0])&&(MbBuf[0]> MdZone[0])&&(MaBuf[0]> MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){Signal2A="Weak Sell";TDI_col2=Orange;} if((MaBuf[0]<MbBuf[0])&&(MbBuf[0]> MdZone[0])&&(MaBuf[0]> MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){Signal2=" @ "+DoubleToStr(crossPrice,Digits)+"";TDI_col2=Orange;} if((MaBuf[0]<MbBuf[0])&&(MbBuf[0]> MdZone[0])&&(MaBuf[0]> MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){crossPrice=Bid;crossDirection =1;} // if((MaBuf[0]>MbBuf[0])&&(MbBuf[0]> MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){Signal="?";TDI_col=Lime;} if((MaBuf[0]>MbBuf[0])&&(MbBuf[0]> MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){Signal2A="Strong Buy";TDI_col2=Lime;} if((MaBuf[0]>MbBuf[0])&&(MbBuf[0]> MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){Signal2=" @ "+DoubleToStr(crossPrice,Digits)+"";TDI_col2=Lime;} if((MaBuf[0]>MbBuf[0])&&(MbBuf[0]> MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){crossPrice=Bid;crossDirection =2;} if((SoundON==true && MaBuf[0]>MbBuf[0])&&(MbBuf[0]> MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68 && alertTag!=Time[0])){ Alert("Strong buy on ",Symbol()," ",Period());alertTag = Time[0];} // if((MaBuf[0]>MbBuf[0])&&(MaBuf[0]> MdZone[0])&&(MbBuf[0]< MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){Signal2A="Medium Buy";TDI_col2=Green;} if((MaBuf[0]>MbBuf[0])&&(MaBuf[0]> MdZone[0])&&(MbBuf[0]< MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){Signal2=" @ "+DoubleToStr(crossPrice,Digits)+"";TDI_col2=Green;} if((MaBuf[0]>MbBuf[0])&&(MaBuf[0]> MdZone[0])&&(MbBuf[0]< MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){Signal5="?";TDI_col2=Green;} if((MaBuf[0]>MbBuf[0])&&(MaBuf[0]> MdZone[0])&&(MbBuf[0]< MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){crossPrice=Bid;crossDirection =2;} // if((MaBuf[0]<MbBuf[0])&&(MbBuf[0]< MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){Signal="?";TDI_col=Red;} if((MaBuf[0]<MbBuf[0])&&(MbBuf[0]< MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){Signal2A="Strong Sell";TDI_col2=Red;} if((MaBuf[0]<MbBuf[0])&&(MbBuf[0]< MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){Signal2=" @ "+DoubleToStr(crossPrice,Digits)+"";TDI_col2=Red;} if((MaBuf[0]<MbBuf[0])&&(MbBuf[0]< MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){crossPrice=Bid;crossDirection =1;} if((SoundON==true && MaBuf[0]<MbBuf[0])&&(MbBuf[0]< MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68 && alertTag!=Time[0])){ Alert("Strong sell on ",Symbol()," ",Period());alertTag = Time[0];} // if((MaBuf[0]<MbBuf[0])&&(MaBuf[0]< MdZone[0])&&(MbBuf[0]> MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){Signal2A="Medium Sell";TDI_col2=Tomato;} if((MaBuf[0]<MbBuf[0])&&(MaBuf[0]< MdZone[0])&&(MbBuf[0]> MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){Signal2=" @ "+DoubleToStr(crossPrice,Digits)+"";TDI_col2=Tomato;} if((MaBuf[0]<MbBuf[0])&&(MaBuf[0]< MdZone[0])&&(MbBuf[0]> MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){Signal5="?";TDI_col2=Tomato;} if((MaBuf[0]<MbBuf[0])&&(MaBuf[0]< MdZone[0])&&(MbBuf[0]> MdZone[0])&&(MaBuf[0]>32)&&(MaBuf[0]<68)){crossPrice=Bid;crossDirection =1;} // reversals if(MaBuf[0]>=68){Signal="?";TDI_col=Red;} if(MaBuf[0]>=68){crossPrice=Bid;crossDirection =2;} if(MaBuf[0]>=68){Signal2A="Caution !";TDI_col2=Red;} if(MaBuf[0]>=68){Signal2=" @ "+DoubleToStr(crossPrice,Digits)+"";TDI_col2=Red;} if(MaBuf[0]<=32){Signal="?";TDI_col=Red;} if(MaBuf[0]<=32){crossPrice=Bid;crossDirection =1;} if(MaBuf[0]<=32){Signal2A="Caution !";TDI_col2=Red;} if(MaBuf[0]<=32){Signal2=" @ "+DoubleToStr(crossPrice,Digits)+"";TDI_col2=Red;} //trend if(MbBuf[0]>MdZone[0]){Signal3="?";TDI_col3=Lime;} if((MbBuf[0]<MdZone[0])&&(MaBuf[0]>MdZone[0])){Signal3="?";TDI_col3=Orange;} if(MbBuf[0]<MdZone[0]){Signal3="?";TDI_col3=Red;} if((MbBuf[0]>MdZone[0])&&(MaBuf[0]<MdZone[0])){Signal3="?";TDI_col3=Green;} //ranging if(UpZone[0]-DnZone[i]<20){Signal4="Consolidation";TDI_col4=Silver;} ObjectDelete("TDI_SIG"); ObjectCreate("TDI_SIG", OBJ_LABEL,WindowFind("Traders Dynamic Index Visual"), 0, 0); ObjectSetText("TDI_SIG",Signal, 25, "Wingdings",TDI_col ); ObjectSet("TDI_SIG", OBJPROP_CORNER, 1); ObjectSet("TDI_SIG", OBJPROP_XDISTANCE, 80+SHIFT_Sideway); ObjectSet("TDI_SIG", OBJPROP_YDISTANCE, 20+SHIFT_Up_Down); // ObjectDelete("TDI_SIG1"); ObjectCreate("TDI_SIG1", OBJ_LABEL,WindowFind("Traders Dynamic Index Visual"), 0, 0); ObjectSetText("TDI_SIG1",Signal2, 15, "Tahoma Narrow",TDI_col2); ObjectSet("TDI_SIG1", OBJPROP_CORNER, 1); ObjectSet("TDI_SIG1", OBJPROP_XDISTANCE, 120+SHIFT_Sideway); ObjectSet("TDI_SIG1", OBJPROP_YDISTANCE, 30+SHIFT_Up_Down); // ObjectDelete("TDI_SIG2"); ObjectCreate("TDI_SIG2", OBJ_LABEL,WindowFind("Traders Dynamic Index Visual"), 0, 0); ObjectSetText("TDI_SIG2",Signal2A, 15, "Tahoma Narrow",TDI_col2); ObjectSet("TDI_SIG2", OBJPROP_CORNER, 1); ObjectSet("TDI_SIG2", OBJPROP_XDISTANCE, 120+SHIFT_Sideway); ObjectSet("TDI_SIG2", OBJPROP_YDISTANCE, 10+SHIFT_Up_Down); // ObjectDelete("TDI_SIG3"); ObjectCreate("TDI_SIG3", OBJ_LABEL,WindowFind("Traders Dynamic Index Visual"), 0, 0); ObjectSetText("TDI_SIG3",Signal5, 25, "Wingdings",TDI_col2 ); ObjectSet("TDI_SIG3", OBJPROP_CORNER, 1); ObjectSet("TDI_SIG3", OBJPROP_XDISTANCE, 80+SHIFT_Sideway); ObjectSet("TDI_SIG3", OBJPROP_YDISTANCE, 20+SHIFT_Up_Down); // ObjectDelete("TDI_SIG4"); ObjectCreate("TDI_SIG4", OBJ_LABEL,WindowFind("Traders Dynamic Index Visual"), 0, 0); ObjectSetText("TDI_SIG4",Signal3, 25, "Wingdings",TDI_col3 ); ObjectSet("TDI_SIG4", OBJPROP_CORNER, 1); ObjectSet("TDI_SIG4", OBJPROP_XDISTANCE, 80+SHIFT_Sideway); ObjectSet("TDI_SIG4", OBJPROP_YDISTANCE, 55+SHIFT_Up_Down); // ObjectDelete("TDI_SIG5"); ObjectCreate("TDI_SIG5", OBJ_LABEL,WindowFind("Traders Dynamic Index Visual"), 0, 0); ObjectSetText("TDI_SIG5","TDI Trend", 15, "Tahoma Narrow",TDI_col3 ); ObjectSet("TDI_SIG5", OBJPROP_CORNER, 1); ObjectSet("TDI_SIG5", OBJPROP_XDISTANCE, 120+SHIFT_Sideway); ObjectSet("TDI_SIG5", OBJPROP_YDISTANCE, 60+SHIFT_Up_Down); // ObjectDelete("TDI_SIG6"); ObjectCreate("TDI_SIG6", OBJ_LABEL,WindowFind("Traders Dynamic Index Visual"), 0, 0); ObjectSetText("TDI_SIG6",Signal4, 15, "Tahoma Narrow",TDI_col4 ); ObjectSet("TDI_SIG6", OBJPROP_CORNER, 1); ObjectSet("TDI_SIG6", OBJPROP_XDISTANCE, 100+SHIFT_Sideway); ObjectSet("TDI_SIG6", OBJPROP_YDISTANCE, 100+SHIFT_Up_Down);} //line numbers ObjectDelete("TDI_SIG7"); ObjectDelete("TDI_SIG7"); if(ObjectFind("TDI_SIG7")!=0) { ObjectCreate("TDI_SIG7", OBJ_TEXT,WindowFind("Traders Dynamic Index Visual"), Time[0],70); ObjectSetText("TDI_SIG7"," 68 ",7, "Tahoma Narrow",CadetBlue); } else { ObjectMove("TDI_SIG7", 0, Time[0], 70); } ObjectDelete("TDI_SIG8"); ObjectDelete("TDI_SIG8"); if(ObjectFind("TDI_SIG8")!=0) { ObjectCreate("TDI_SIG8", OBJ_TEXT,WindowFind("Traders Dynamic Index Visual"), Time[0],52); ObjectSetText("TDI_SIG8"," 50 ",7, "Tahoma Narrow",CadetBlue); } else { ObjectMove("TDI_SIG8", 0, Time[0], 52); } ObjectDelete("TDI_SIG9"); ObjectDelete("TDI_SIG9"); if(ObjectFind("TDI_SIG9")!=0) { ObjectCreate("TDI_SIG9", OBJ_TEXT,WindowFind("Traders Dynamic Index Visual"), Time[0],34); ObjectSetText("TDI_SIG9"," 32 ",7, "Tahoma Narrow",CadetBlue); } else { ObjectMove("TDI_SIG9", 0, Time[0], 34); } } //---- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double StDev(double& Data[], int Per) { return(MathSqrt(Variance(Data,Per))); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double Variance(double& Data[], int Per) { double sum, ssum; for(int i=0; i<Per; i++) { sum+=Data[i]; ssum+=MathPow(Data[i],2); } return((ssum*Per - sum*sum)/(Per*(Per-1))); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains open time of each bar
Indicator Curves created:
Implements a curve of type SHOW_Trade_Signal_Line2
Implements a curve of type DRAW_NONE
Implements a curve of type DRAW_LINE
Indicators Used:
Relative strength index
Moving average indicator
Custom Indicators Used:
Order Management characteristics:
Other Features:
It issuies visual alerts to the screen