//+------------------------------------------------------------------+ //| Doji Reader d 01.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 extern bool AnAlert=true; //---- input parameters for regular doji extern bool FindRegularDoji=true; extern int MinLengthOfUpTail=3; extern int MinLengthOfLoTail=3; //---- input parameters for dragonfly doji extern bool FindDragonflyDoji=true; extern int MaxLengthOfUpTail1=0; extern int MinLengthOfLoTail1=3; //---- input parameters for gravestone doji extern bool FindGravestoneDoji=true; extern int MinLengthOfUpTail2=3; extern int MaxLengthOfLoTail2=0; //---- initialization for variables int counter1=1, counter2=1, counter3=1, counterA=0, counterB=0, counterC=0, counterX=0, counterY=0, counterZ=0, counterH=0, counterI=0, counterJ=0; string name1="Regular Doji", name2="Dragonfly Doji", name3="Gravestone Doji"; bool sound1=false, sound2=false, sound3=false; double H=0.0, L=0.0, C=0.0, O=0.0; datetime T=0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- set texts for regular doji's notes ObjectCreate(name1, OBJ_LABEL, 0, 0, 0); ObjectSet(name1, OBJPROP_XDISTANCE, 15); ObjectSet(name1, OBJPROP_YDISTANCE, 21); ObjectSetText(name1, "Candle with red tail is Regular Doji", 9, "Tahoma", Red); //---- set texts for dragonfly doji's notes ObjectCreate(name2, OBJ_LABEL, 0, 0, 0); ObjectSet(name2, OBJPROP_XDISTANCE, 15); ObjectSet(name2, OBJPROP_YDISTANCE, 42); ObjectSetText(name2, "Candle with blue tail is Dragonfly Doji", 9, "Tahoma", Blue); //---- set texts for gravestone doji's notes ObjectCreate(name3, OBJ_LABEL, 0, 0, 0); ObjectSet(name3, OBJPROP_XDISTANCE, 15); ObjectSet(name3, OBJPROP_YDISTANCE, 63); ObjectSetText(name3, "Candle with gold tail is Gravestone Doji", 9, "Tahoma", Gold); //---- initialization done return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- delete all object ObjectsDeleteAll(0, OBJ_LABEL); ObjectsDeleteAll(0, OBJ_TREND); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int i, counted_bars=IndicatorCounted(); //---- check for error if(counted_bars<0) return(-1); //---- scan all bars except current bar for doji for(i=Bars-1; i>0; i--) { //---- save bar price into variables H=High[i]; L=Low[i]; C=Close[i]; O=Open[i]; //---- save bar open time into variable T=Time[i]; //---- find regular doji if desired by user if(FindRegularDoji) { //---- if high price minus close price is higher or equal with MinLengthOfUpTail and //---- close price minus low price is higher or equal with MinLengthOfLoTail and //---- close price is equal with open price, it is a regular doji if(H-C>=MinLengthOfUpTail*Point && C-L>=MinLengthOfLoTail*Point && C==O) { //---- than we have to color its tail if(ObjectFind(name1+counter1)==-1) //if tail is not colored yet { if(ObjectCreate(name1+counter1, OBJ_TREND, 0, T, H, T, L)) { ObjectSet(name1+counter1, OBJPROP_COLOR, Red); ObjectSet(name1+counter1, OBJPROP_WIDTH, 1); ObjectSet(name1+counter1, OBJPROP_RAY, false); counter1++; sound1=true; } } } } //---- find dragonfly doji if desired by user if(FindDragonflyDoji) { //---- if high price minus close price lower or equal with MaxLengthOfUpTail1 and //---- close price minus low price is higher or equal with MinLengthOfLoTail1 and //---- close price is equal with open price , it is dragonfly doji if(H-C<=MaxLengthOfUpTail1*Point && C-L>=MinLengthOfLoTail1*Point && C==O) { //---- than we have to color its tail if(ObjectFind(name2+counter2)==-1) //if tail is not colored yet { if(ObjectCreate(name2+counter2, OBJ_TREND, 0, T, H, T, L)) { ObjectSet(name2+counter2, OBJPROP_COLOR, Blue); ObjectSet(name2+counter2, OBJPROP_WIDTH, 1); ObjectSet(name2+counter2, OBJPROP_RAY, false); counter2++; sound2=true; } } } } //---- find gravestone doji if desired by user if(FindGravestoneDoji) { //---- if high price minus close price higher or equal with MinLengthOfUpTail2 and //---- close price minus low price is lower or equal with MaxLengthOfLoTail2 and //---- close price is equal with open price, it is gravestone doji if(H-C>=MinLengthOfUpTail2*Point && C-L<=MaxLengthOfLoTail2*Point && C==O) { if(ObjectFind(name3+counter3)==-1) //if tail is not colored yet { if(ObjectCreate(name3+counter3, OBJ_TREND, 0, T, H, T, L)) { ObjectSet(name3+counter3, OBJPROP_COLOR, Gold); ObjectSet(name3+counter3, OBJPROP_WIDTH, 1); ObjectSet(name3+counter3, OBJPROP_RAY, false); counter3++; sound3=true; } } } } } //---- if an alert is false, than we discontinued the program if(!AnAlert) return(0); //---- working once per bar if(Volume[0]>1) return(0); //---- save latest completed bar price into variables H=High[1]; L=Low[1]; C=Close[1]; O=Open[1]; //---- we looking for latest doji and give an alert if we found it //---- if find regular doji is true, than we looking for it if(FindRegularDoji) { //---- if high price minus close price is higher or equal with MinLengthOfUpTail and //---- close price minus low price is higher or equal with MinLengthOfLoTail and //---- close price is equal with open price, it is a regular doji if(H-C>=MinLengthOfUpTail*Point && C-L>=MinLengthOfLoTail*Point && C==O) { //---- than we have to give an alert to user Alert("new regular doji at ",Symbol()," M",Period()); } } //---- if find deagonfly doji is true, than we looking for it if(FindDragonflyDoji) { //---- if high price minus close price lower or equal with MaxLengthOfUpTail1 and //---- close price minus low price is higher or equal with MinLengthOfLoTail1 and //---- close price is equal with open price , it is dragonfly doji if(H-C<=MaxLengthOfUpTail1*Point && C-L>=MinLengthOfLoTail1*Point && C==O) { //---- than we have to give an alert to user Alert("new dragonfly doji at ",Symbol()," M",Period()); } } //---- if find gravestone doji is true, than we looking for it if(FindGravestoneDoji) { //---- if high price minus close price higher or equal with MinLengthOfUpTail2 and //---- close price minus low price is lower or equal with MaxLengthOfLoTail2 and //---- close price is equal with open price, it is gravestone doji if(H-C>=MinLengthOfUpTail2*Point && C-L<=MaxLengthOfLoTail2*Point && C==O) { //---- than we have to give an alert to user 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