//+------------------------------------------------------------------+ //| CandleStick_Pattern_indicator| //| (complete rewrite and name change of pattern alert) | //+------------------------------------------------------------------+ //| Pattern Recognition.mq4 | //| Copyright © 2009 | //| http://www.forex-indicators.ru | //| This is still work in progress and needs LOTS of testing | //+------------------------------------------------------------------+ #property copyright "Copyright © 2010 FXWolfPack" #property link "http://www.fxwolfpack.com" #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Aqua #property indicator_color2 Red //---- extern bool Display_Bearish_Engulfing = false; extern bool Display_Bullish_Engulfing = false; extern bool Display_Piercing_Line = false; extern bool Display_Stars = false; extern bool Display_GU4barRangeBreakout=true; extern int GU4BarsTolerancePips=4; extern bool Display_Three_Outside_Down = false; extern bool Display_Three_Inside_Down = false; extern bool Display_Dark_Cloud_Cover = false; extern bool Display_Three_Outside_Up = false; extern bool Display_Three_Inside_Up = false; extern bool Display_Three_Black_Crows = false; extern bool Display_Three_White_Soldiers = false; extern bool Display_Harami = false; extern bool Alerts_ON = false; extern bool Email_Alert=false; extern bool PopUP_Alert = false; extern color Text_Color_Bearish = Red; extern color Text_Color_Bullish = Aqua; //---- buffers double upArrow[]; double downArrow[]; string PatternText[5000]; datetime lastimealert; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { SetIndexStyle(0, DRAW_ARROW, 0, 1); SetIndexArrow(0, 242); SetIndexBuffer(0, downArrow); //---- SetIndexStyle(1, DRAW_ARROW, 0, 1); SetIndexArrow(1, 241); SetIndexBuffer(1, upArrow); return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { ObjectsDeleteAll(0, OBJ_TEXT); ObjectsDeleteAll(0, OBJ_RECTANGLE); return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { double Range, AvgRange; int counter, setalert; static datetime prevtime = 0; int shift; int shift1; int shift2; int shift3; int shift4; int shift5; string pattern, period; int setPattern = 0; int alert = 0; int arrowShift; int textShift; double O, O1, O2, O3, O4, C, C1, C2, C3, C4, L, L1, L2, L3, L4, H, H1, H2, H3, H4; //---- if(prevtime == Time[0]) { return(0); } prevtime = Time[0]; //---- switch(Period()) { case 1: period = "M1"; break; case 5: period = "M5"; break; case 15: period = "M15"; break; case 30: period = "M30"; break; case 60: period = "H1"; break; case 240: period = "H4"; break; case 1440: period = "D1"; break; case 10080: period = "W1"; break; case 43200: period = "MN"; break; } //---- for(int j = 0; j < Bars; j++) { PatternText[j] = "pattern-" + j; } //---- for(shift = 0; shift < Bars; shift++) { setalert = 0; counter = shift; Range = 0; AvgRange = 0; for(counter = shift; counter <= shift + 9; counter++) { AvgRange = AvgRange + MathAbs(High[counter] - Low[counter]); } Range = AvgRange / 10; shift1 = shift + 1; shift2 = shift + 2; shift3 = shift + 3; shift4 = shift + 4; shift5 = shift + 5; O = Open[shift1]; O1 = Open[shift2]; O2 = Open[shift3]; O3 = Open[shift4]; O4 = Open[shift5]; H = High[shift1]; H1 = High[shift2]; H2 = High[shift3]; H3 = High[shift4]; H4 = High[shift5]; L = Low[shift1]; L1 = Low[shift2]; L2 = Low[shift3]; L3 = Low[shift4]; L4 = Low[shift5]; C = Close[shift1]; C1 = Close[shift2]; C2 = Close[shift3]; C3 = Close[shift4]; C4 = Close[shift5]; // Медвежьи модели //--------------------------------------------------------------------------- // Медвежье поглощение if((C1 > O1) && (O > C) && (H >= C1) && (O1 >= C) && ((O - C) > (C1 - O1))) { if(Display_Bearish_Engulfing == true) { PatternText[shift] = "Bearish Engulfing "+shift; ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], High[shift1] + Range*1.5); ObjectSetText(PatternText[shift], "BRE", 8, "Arial", Text_Color_Bullish); downArrow[shift1] = High[shift1] + Range*0.5; } if(setalert == 0 && Alerts_ON == true) { pattern = "Bearish Engulfing"; setalert = 1; } } //--------------------------------------------------------------------------- //GU 4 inside bars breakout double d = GU4BarsTolerancePips*Point; if((H4+d >= H3) && (H4+d >= H2) && (H4+d >= H1) && (H4+d >= H) && (L4-d <= L3) && (L4-d <= L2) && (L4-d <= L1) && (L4-d <= L)) { if(Display_GU4barRangeBreakout == true) { double UpperRange = High[ArrayMaximum(High,4,shift1)]; double LowerRange = Low[ArrayMinimum(Low, 4,shift1)]; // ObjectCreate(PatternText[shift]+" Support", OBJ_TREND, 0, Time[shift5], LowerRange, Time[shift5-3], LowerRange); // ObjectSet(PatternText[shift]+" Support", OBJPROP_COLOR, Text_Color_Bearish); ObjectCreate(PatternText[shift]+" Support", OBJ_RECTANGLE, 0, Time[shift5], LowerRange, Time[shift], UpperRange); ObjectSet(PatternText[shift]+" Support", OBJPROP_COLOR, Text_Color_Bullish); // ObjectCreate(PatternText[shift]+" Resistance", OBJ_TREND, 0, Time[shift5], UpperRange, Time[shift5-3], UpperRange); // ObjectSet(PatternText[shift]+" Resistance", OBJPROP_COLOR, Text_Color_Bearish); ObjectCreate (PatternText[shift]+" ResTxt", OBJ_TEXT, 0, Time[shift5], High[shift5] + Range*1.0); ObjectSetText(PatternText[shift]+" ResTxt", "4BBO: "+DoubleToStr(UpperRange+1*Point,Digits), 8,"Arial", Text_Color_Bullish); upArrow[shift5] = High[shift5] + Range*0.5; ObjectCreate (PatternText[shift]+" SupTxt", OBJ_TEXT, 0, Time[shift5], Low[shift5] - Range*1.0); ObjectSetText(PatternText[shift]+" SupTxt", "4BBO: "+DoubleToStr(LowerRange-1*Point,Digits), 8,"Arial", Text_Color_Bearish); downArrow[shift5] = Low[shift5] - Range*0.5; } if(shift == 0 && Alerts_ON == true) { pattern = "4 Bars Range Breakout"; setalert = 1; } } // Три внешних дня вниз if((C2 > O2) && (O1 > C1) && (O1 >= C2) && (O2 >= C1) && ((O1 - C1) > (C2 - O2)) && (O > C) && (C < C1)) { if(Display_Three_Outside_Down == true) { PatternText[shift]= "Three Outside Down "+shift; ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], Low[shift1] - Range*1.5); ObjectSetText(PatternText[shift], "3OD", 10, "Arial", Text_Color_Bearish); upArrow[shift1] = Low[shift1] - Range*0.5; } if(setalert == 0 && Alerts_ON == true) { pattern = "Three Outside Down"; setalert = 1; } } // Завеса из темных облаков if((C1 > O1) && (((C1 + O1) / 2) > C) && (O > C) && (O > C1) && (C > O1) && ((O - C) / (0.001 + (H - L)) > 0.6)) { if(Display_Dark_Cloud_Cover == true) { PatternText[shift] = "Dark Cloud Cover "+shift; ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], High[shift1] + Range*1.5); ObjectSetText(PatternText[shift], "DCC", 10, "Arial", Text_Color_Bullish); downArrow[shift1] = High[shift1] + Range*0.5; } //---- if(setalert == 0 && Alerts_ON == true) { pattern = "Dark Cloud Cover"; setalert = 1; } } // Вечерняя доджи звезда if((C2 > O2) && ((C2 - O2) / (0.001 + H2 - L2) > 0.6) && (C2 < O1) && (C1 > O1) && ((H1-L1) > (3*(C1 - O1))) && (O > C) && (O < O1)) { if(Display_Stars == true) { ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], High[shift1] + Range*1.5); ObjectSetText(PatternText[shift], "ES1", 10, "Arial", Text_Color_Bullish); downArrow[shift1] = High[shift1] + Range*0.5; } //---- if(setalert == 0 && Alerts_ON == true) { pattern = "Evening Star #1"; setalert = 1; } } // Медвежья Харами if((C1 > O1) && (O > C) && (O <= C1) && (O1 <= C) && ((O - C) < (C1 - O1))) { if(Display_Harami == true) { PatternText[shift]="Bear Harami "+shift; ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], High[shift1] + Range*1.5); ObjectSetText(PatternText[shift], "BRH", 10, "Arial", Text_Color_Bullish); downArrow[shift1] = High[shift1] + Range*0.5; } if(shift == 0 && Alerts_ON == true) { pattern="Bear Harami"; setalert = 1; } } // Три внутренних дня вниз if((C2 > O2) && (O1 > C1) && (O1 <= C2) && (O2 <= C1) && ((O1 - C1) < (C2 - O2)) && (O > C) && (C < C1) && (O < O1)) { if(Display_Three_Inside_Down == true) { ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], High[shift1] + Range*1.5); ObjectSetText(PatternText[shift], "3ID", 10, "Arial", Text_Color_Bullish); downArrow[shift1] = High[shift1] + Range*0.5; } if(shift == 0 && Alerts_ON == true) { pattern = "Three Inside Down"; setalert = 1; } } // Три черные вороны if((O > C*1.01) && (O1 > C1*1.01) && (O2 > C2*1.01) && (C < C1) && (C1 < C2) && (O > C1) && (O < O1) && (O1 > C2) && (O1 < O2) && (((C - L) / (H - L)) < 0.2) && (((C1 - L1) / (H1 - L1)) < 0.2) && (((C2 - L2) / (H2 - L2)) < 0.2)) { if(Display_Three_Black_Crows == true) { ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], High[shift1] + Range*1.5); ObjectSetText(PatternText[shift], "3BC", 10, "Arial", Text_Color_Bullish); downArrow[shift1] = High[shift1] + Range*0.5; } //---- if(shift == 0 && Alerts_ON == true) { pattern = "Three Black Crows"; setalert = 1; } } //Вечерняя звезда if((C2 > O2) && ((C2 - O2) / (0.001 + H2 - L2) > 0.6) && (C2 < O1) && (C1 > O1) && ((H1 - L1) > (3*(C1 - O1))) && (O > C) && (O < O1)) { if(Display_Stars == true) { ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], High[shift1] + Range*1.5); ObjectSetText(PatternText[shift], "ES2", 10, "Arial", Text_Color_Bullish); downArrow[shift1] = High[shift1] + Range*0.5; } //---- if(shift == 0 && Alerts_ON == true) { pattern = "Evening star #2"; setalert = 1; } } // Бычьи модели // Бычье поглощение if((O1 > C1) && (C > O) && (C >= O1) && (C1 >= L) && ((C - O) > (O1 - C1))) { if(Display_Bullish_Engulfing) { PatternText[shift] = "Bullish Engulfing "+shift; ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], Low[shift1] - Range*1.5); ObjectSetText(PatternText[shift], "BLE", 10, "Arial", Text_Color_Bearish); upArrow[shift1] = Low[shift1] - Range*0.5; } if(shift == 0 && Alerts_ON == true) { pattern = "Bullish Engulfing"; setalert = 1; } } // Три внешних дня вверх if((O2 > C2) && (C1 > O1) && (C1 >= O2) && (C2 >= O1) && ((C1 - O1) > (O2 - C2)) && (C > O) && (C > C1)) { if(Display_Three_Outside_Up == true) { ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], Low[shift1] - Range*1.5); ObjectSetText(PatternText[shift], "3OU", 10, "Arial", Text_Color_Bearish); upArrow[shift1] = Low[shift1] - Range*0.5; } if(shift == 0 && Alerts_ON == true) { pattern = "Three Outside Up"; setalert = 1; } } // Бычья Харами if((O1 > C1) && (C > O) && (C <= O1) && (C1 <= O) && ((C - O) < (O1 - C1))) { if(Display_Harami == true) { PatternText[shift] = "Bull Harami "+shift; ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], Low[shift1] - Range*1.5); ObjectSetText(PatternText[shift], "BLH", 10, "Arial", Text_Color_Bearish); upArrow[shift1] = Low[shift1] - Range*0.5; } if(shift == 0 && Alerts_ON == true) { pattern = "Bull Harami"; setalert = 1; } } // Три веншних дня вверх if((O2 > C2) && (C1 > O1) && (C1 <= O2) && (C2 <= O1) && ((C1 - O1) < (O2 - C2)) && (C > O) && (C > C1) && (O > O1)) { if(Display_Three_Inside_Up == true) { ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], Low[shift1] - Range*1.5); ObjectSetText(PatternText[shift], "3IU", 10, "Arial", Text_Color_Bearish); upArrow[shift1] = Low[shift1] - Range*0.5; } if(shift == 0 && Alerts_ON == true) { pattern = "Three Inside Up"; setalert = 1; } } // Просвет в облаках if((C1 < O1) && (((O1 + C1) / 2) < C) && (O < C) && (O < C1) && (C < O1) && ((C - O) / (0.001 + (H - L)) > 0.6)) { if(Display_Piercing_Line == true) { PatternText[shift] = "Piercing Line "+shift; ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], Low[shift1] - Range*1.5); ObjectSetText(PatternText[shift], "PL", 10, "Arial", Text_Color_Bearish); upArrow[shift1] = Low[shift1] - Range*0.5; } if(shift == 0 && Alerts_ON == true) { pattern = "Piercing Line"; setalert = 1; } } // Три белых солдата if((C > O*1.01) && (C1 > O1*1.01) && (C2 > O2*1.01) && (C > C1) && (C1 > C2) && (O < C1) && (O > O1) && (O1 < C2) && (O1 > O2) && (((H - C) / (H - L)) < 0.2) && (((H1 - C1) / (H1 - L1)) < 0.2) && (((H2 - C2) / (H2 - L2)) < 0.2)) { if(Display_Three_White_Soldiers == true) { ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], Low[shift1] - Range*1.5); ObjectSetText(PatternText[shift], "3WS", 10, "Arial", Text_Color_Bearish); upArrow[shift1] = Low[shift1] - Range*0.5; } if(shift == 0 && Alerts_ON == true) { pattern = "Three White Soldiers"; setalert = 1; } } // Утренняя доджи звезда if((O2 > C2) && ((O2 - C2) / (0.001 + H2 - L2) > 0.6) && (C2 > O1) && (O1 > C1) && ((H1 - L1) > (3*(C1 - O1))) && (C > O) && (O > O1)) { if(Display_Stars == true) { ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], Low[shift1] - Range*1.5); ObjectSetText(PatternText[shift], "MS", 10, "Arial", Text_Color_Bearish); upArrow[shift1] = Low[shift1] - Range*0.5; } if(shift == 0 && Alerts_ON == true) { pattern = "Morning Star"; setalert = 1; } } if(setalert == 1 && shift == 0) { if(PopUP_Alert) Alert(Symbol(), period, pattern); setalert = 0; if(Email_Alert) SendMail("CandleStick Pattern "+Symbol()+" "+period,Symbol()+" "+period+" CandleStick Pattern = "+pattern); setalert = 0; } } // End of for loop return(0); } //+------------------------------------------------------------------+