//+------------------------------------------------------------------+ //| Doji Reader 2.mq4 | //| Copyright © 2009, MQL PROGRAMMING | //| mailto:mqlprogramming@gmail.com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2009, MQL PROGRAMMING" #property link "mailto:mqlprogramming@gmail.com" #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Red #property indicator_width1 2 extern bool AnAlert=true; //false to disable alert extern bool ShowCandleBox=true; //false to hide the candle box extern color BoxColor=SkyBlue; //add your fav color extern bool ShowStar=true; //false to hide star extern color StarColor=NavajoWhite; //add your fav color extern int StarWidth=2; //add width size of star extern bool ShowText=true; //false to hide text extern color FontColor=White; //add your fav color extern int FontSize=8; //add font size extern bool VerticalText=false; //add true to verticalize text extern bool MyBrokerHas5Digits=false; //add true if use 5 decimals //---- input parameters for regular doji extern bool FindRegularDoji=true; //false to disable extern int MinLengthOfUpTail=3; //candle with upper tail equal or more than this will show up extern int MinLengthOfLoTail=3; //candle with lower tail equal or more than this will show up extern double MaxLengthOfBody=1; //candle with body less or equal with this will show up //---- input parameters for dragonfly doji extern bool FindDragonflyDoji=true; //false to disable extern int MaxLengthOfUpTail1=0; //candle with upper tail equal or more than this will show up extern int MinLengthOfLoTail1=3; //candle with lower tail equal or more than this will show up extern double MaxLengthOfBody1=1; //candle with body less or equal with this will show up //---- input parameters for gravestone doji extern bool FindGravestoneDoji=true; //false to disable extern int MinLengthOfUpTail2=3; //candle with upper tail equal or more than this will show up extern int MaxLengthOfLoTail2=0; //candle with lower tail equal or more than this will show up extern double MaxLengthOfBody2=1; //candle with body less or equal with this will show up //---- initialization for variables int counter1=1, counter2=1, counter3=1; string name1="Doji", name2="Dragonfly", name3="Gravestone"; bool sound1=false, sound2=false, sound3=false; double H=0.0, L=0.0, C=0.0, O=0.0, pt=0, pt1=0, dis=0; datetime T=0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { ObjectCreate(name1, OBJ_LABEL, 0, 0, 0); ObjectSet(name1, OBJPROP_XDISTANCE, 15); ObjectSet(name1, OBJPROP_YDISTANCE, 21); ObjectSetText(name1, "Doji Reader 2, MQL PROGRAMMING", 8, "Tahoma", Gold); if(Digits<4) pt1=0.01; else pt1=0.0001; if(MyBrokerHas5Digits) { if(Digits<4) pt=0.001; else pt=0.00001; switch (Period()) { case 1: dis=10*pt1; break; case 5: dis=15*pt1; break; case 15: dis=25*pt1; break; case 30: dis=35*pt1; break; case 60: dis=45*pt1; break; case 240: dis=75*pt1; break; case 1440: dis=175*pt1; break; case 10080: dis=230*pt1; break; case 43200: dis=350*pt1; break; } } else { pt=pt1; switch (Period()) { case 1: dis=20*pt; break; case 5: dis=30*pt; break; case 15: dis=50*pt; break; case 30: dis=75*pt; break; case 60: dis=90*pt; break; case 240: dis=150*pt; break; case 1440: dis=350*pt; break; case 10080: dis=460*pt; break; case 43200: dis=700*pt; break; } } return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- delete all object ObjectsDeleteAll(0, OBJ_LABEL); ObjectsDeleteAll(0, OBJ_TREND); ObjectsDeleteAll(0, OBJ_RECTANGLE); ObjectsDeleteAll(0, OBJ_ARROW); ObjectsDeleteAll(0, OBJ_TEXT); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int i, counted_bars=IndicatorCounted(); if(counted_bars<0) return(-1); for(i=Bars-1; i>0; i--) { H=High[i]; L=Low[i]; C=Close[i]; O=Open[i]; T=Time[i]; if(FindRegularDoji) { if(H-C>=MinLengthOfUpTail*pt && C-L>=MinLengthOfLoTail*pt && MathAbs(C-O)<=MaxLengthOfBody*pt) { sound1=true; if(ShowCandleBox) { if(ObjectFind("box 1"+counter1)==-1) { ObjectCreate("box 1"+counter1, OBJ_RECTANGLE, 0, Time[i+1], High[i]+(MathMin(Open[i], Close[i])-Low[i])/2, Time[i-1], Low[i]-(MathMin(Open[i], Close[i])-Low[i])/2); ObjectSet("box 1"+counter1, OBJPROP_COLOR, BoxColor); } } if(ShowStar) { if(ObjectFind("star 1"+counter1)==-1) { ObjectCreate("star 1"+counter1, OBJ_ARROW, 0, Time[i], High[i]+(MathMin(Open[i], Close[i])-Low[i])/2+dis, 0); ObjectSet("star 1"+counter1, OBJPROP_ARROWCODE, 181); ObjectSet("star 1"+counter1, OBJPROP_COLOR, StarColor); ObjectSet("star 1"+counter1, OBJPROP_WIDTH, StarWidth); } } if(ShowText) { if(ObjectFind("txt 1"+counter1)==-1) { ObjectCreate("txt 1"+counter1, OBJ_TEXT, 0, Time[i], Low[i]-dis); ObjectSetText("txt 1"+counter1, name1, FontSize, "Tahoma", FontColor); if(VerticalText) ObjectSet("txt 1"+counter1, OBJPROP_ANGLE, 90); } } counter1++; } } if(FindDragonflyDoji) { if(H-C<=MaxLengthOfUpTail1*pt && C-L>=MinLengthOfLoTail1*pt && MathAbs(C-O)<=MaxLengthOfBody1*pt) { counter2++; sound2=true; if(ShowCandleBox) { if(ObjectFind("box 2"+counter2)==-1) { ObjectCreate("box 2"+counter2, OBJ_RECTANGLE, 0, Time[i+1], High[i]+(MathMin(Open[i], Close[i])-Low[i])/2, Time[i-1], Low[i]-(MathMin(Open[i], Close[i])-Low[i])/2); ObjectSet("box 2"+counter2, OBJPROP_COLOR, BoxColor); } } if(ShowStar) { if(ObjectFind("star 2"+counter2)==-1) { ObjectCreate("star 2"+counter2, OBJ_ARROW, 0, Time[i], High[i]+(MathMin(Open[i], Close[i])-Low[i])/2+dis, 0); ObjectSet("star 2"+counter2, OBJPROP_ARROWCODE, 181); ObjectSet("star 2"+counter2, OBJPROP_COLOR, StarColor); ObjectSet("star 2"+counter2, OBJPROP_WIDTH, StarWidth); } } if(ShowText) { if(ObjectFind("txt 2"+counter2)==-1) { ObjectCreate("txt 2"+counter2, OBJ_TEXT, 0, Time[i], Low[i]-dis); ObjectSetText("txt 2"+counter2, name2, FontSize, "Tahoma", FontColor); if(VerticalText) ObjectSet("txt 2"+counter2, OBJPROP_ANGLE, 90); } } } } if(FindGravestoneDoji) { if(H-C>=MinLengthOfUpTail2*pt && C-L<=MaxLengthOfLoTail2*pt && MathAbs(C-O)<=MaxLengthOfBody2*pt) { counter3++; sound3=true; if(ShowCandleBox) { if(ObjectFind("box 3"+counter3)==-1) { ObjectCreate("box 3"+counter3, OBJ_RECTANGLE, 0, Time[i+1], High[i]+(MathMin(Open[i], Close[i])-Low[i])/2, Time[i-1], Low[i]-(High[i]-MathMax(Open[i], Close[i]))/2); ObjectSet("box 3"+counter3, OBJPROP_COLOR, BoxColor); } } if(ShowStar) { if(ObjectFind("star 3"+counter3)==-1) { ObjectCreate("star 3"+counter3, OBJ_ARROW, 0, Time[i], High[i]+(MathMin(Open[i], Close[i])-Low[i])/3+dis, 0); ObjectSet("star 3"+counter3, OBJPROP_ARROWCODE, 181); ObjectSet("star 3"+counter3, OBJPROP_COLOR, StarColor); ObjectSet("star 3"+counter3, OBJPROP_WIDTH, StarWidth); } } if(ShowText) { if(ObjectFind("txt 3"+counter3)==-1) { ObjectCreate("txt 3"+counter3, OBJ_TEXT, 0, Time[i], Low[i]-dis); ObjectSetText("txt 3"+counter3, name3, FontSize, "Tahoma", FontColor); if(VerticalText) ObjectSet("txt 3"+counter3, OBJPROP_ANGLE, 90); } } } } } if(!AnAlert) return(0); if(Volume[0]>1) return(0); H=High[1]; L=Low[1]; C=Close[1]; O=Open[1]; if(FindRegularDoji) { if(H-C>=MinLengthOfUpTail*pt && C-L>=MinLengthOfLoTail*pt && MathAbs(C-O)<=MaxLengthOfBody*pt) { Alert("new regular doji at ",Symbol()," M",Period()); } } if(FindDragonflyDoji) { if(H-C<=MaxLengthOfUpTail1*pt && C-L>=MinLengthOfLoTail1*pt && MathAbs(C-O)<=MaxLengthOfBody1*pt) { Alert("new dragonfly doji at ",Symbol()," M",Period()); } } if(FindGravestoneDoji) { if(H-C>=MinLengthOfUpTail2*pt && C-L<=MaxLengthOfLoTail2*pt && MathAbs(C-O)<=MaxLengthOfBody2*pt) { Alert("new gravestone doji at ",Symbol()," M",Period()); } } return(0); } //end of file //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains close prices for each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains open prices of each bar
Series array that contains open time of each bar
Series array that contains tick volumes of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features:
It issuies visual alerts to the screen