//+------------------------------------------------------------------+ //| Pattern Alert v1.1 (Official) | //| | //| You may improve and add to this code but please send it back to | //| me for an official release. Thanks. | //| | //| Copyright © 2005, Jason Robinson | //| (jasonrobinsonuk, jnrtrading) | //| http://www.jnrtrading.co.uk | //| | //| **THE ONLY OFFICIAL VERSION IS FROM MY WEBSITE** | //| (unless it has been posted by me on a forum) | //| | //|Obviously this is still work in progress and needs LOTS of testing| //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Red #property indicator_color2 Red extern bool Show_Text_Labels = true; extern bool Show_Bearish_Engulfing_Patterns = true; extern bool Show_Bullish_Engulfing_Patterns = true; extern bool Show_Star_Patterns = true; extern bool Show_Tweezer_Bottoms = true; extern bool Show_Tweezer_Tops = true; //---- buffers double ExtMapBuffer1[]; double ExtMapBuffer2[]; string PatternText[2000]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators for (int i = 0; i < Bars; i++) { // Clear buffer //ExtMapBuffer1[i] = 0; //ExtMapBuffer2[i] = 0; } for (int j = 0; j < Bars; j++) { PatternText[j] = CharToStr(j); } SetIndexStyle(0,DRAW_ARROW, EMPTY); SetIndexArrow(0,242); SetIndexBuffer(0, ExtMapBuffer1); SetIndexStyle(1,DRAW_ARROW, EMPTY); SetIndexArrow(1,241); SetIndexBuffer(1, ExtMapBuffer2); return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { ObjectsDeleteAll(0, OBJ_TEXT); return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start(){ Comment("Pattern Alert v1.1 Official"); static datetime prevtime = 0; int shift; int shift1; int shift2; int shift3; string pattern; int setPattern = 0; int alert = 0; int arrowShift; int textShift; if(prevtime == Time[0]) { return(0); } prevtime = Time[0]; // Code to determine a good place to put the text and arrow switch (Period()) { case 1: arrowShift = 1; textShift = 3; break; case 5: arrowShift = 3; textShift = 8; break; case 30: arrowShift = 7; textShift = 13; break; case 15: arrowShift = 7; textShift = 15; break; case 60: arrowShift = 9; textShift = 25; break; case 1440: arrowShift = 3; textShift = 7; break; case 10080: arrowShift = 95; textShift = 235; break; case 43200: arrowShift = 150; textShift = 260; break; } for (int j = 0; j < Bars; j++) { PatternText[j] = j; } for (shift = 0; shift < Bars; shift++) { shift1 = shift + 1; shift2 = shift + 2; shift3 = shift + 3; // Check for a Bearish Engulfing pattern if (Show_Bearish_Engulfing_Patterns == true) { if ((Close[shift2] > Open[shift2]) && (Open[shift1] > Close[shift2]) && (Close[shift1] < Open[shift2])) { if (Show_Text_Labels) { ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], High[shift1] + (Point * textShift)); ObjectSetText(PatternText[shift], "Bearish Engulfing", 9, "Times New Roman", Red); } ExtMapBuffer1[shift1] = High[shift1] + (Point * arrowShift); if (setPattern == 0) { pattern="Bearish Engulfing Pattern"; setPattern = 1; alert = 1; } continue; } } // Check for a Bullish Engulfing pattern if (Show_Bullish_Engulfing_Patterns == true) { if ((Close[shift2] < Open[shift2]) && (Open[shift1] < Close[shift2]) && (Close[shift1] > Open[shift2])) { if (Show_Text_Labels == true) { ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], High[shift1] + (Point * textShift)); ObjectSetText(PatternText[shift], "Bullish Engulfing", 9, "Times New Roman", Red); } ExtMapBuffer1[shift1] = High[shift1] + (Point * arrowShift); if (setPattern == 0) { pattern="Bullish Engulfing Pattern"; setPattern = 1; alert = 1; } continue; } } // Check for a Dark Cloud Cover pattern if ((Close[2] > Open[2]) && (Open[1] > High[2]) && (Close[1] < ((Open[2] + Close[2]) / 2)) && (Close[1] > Open[2])) { if (Show_Text_Labels == true) { ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], High[shift1] + (Point * textShift)); ObjectSetText(PatternText[shift], "Dark Cloud Cover", 9, "Times New Roman", Red); } ExtMapBuffer1[shift1] = High[shift1] + (Point * arrowShift); if (setPattern == 0) { pattern="Dark Cloud Cover"; setPattern = 1; alert = 1; } continue; } if (Show_Star_Patterns == true) { // Check for Evening Doji Star pattern if ( (Close[3] > Open[3]) //Bullish candle && (Open[2] == Close[2]) && (Low[2] < Open[2]) && (High[2] > Open[2]) // Doji && (Low[2] >= Close[3]) // Doji close higher or equal to Bullish close && (High[1] <= Close[2]) && (Open[1] <= Low[2]) && (Open[1] >= Close[3]) && (Close[1] < ((Open[3] + Close[3]) / 2)) && (Close[1] > Open[3]) // Bearish candle in pattern ) { if (Show_Text_Labels == true) { ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], High[shift1] + (Point * textShift)); ObjectSetText(PatternText[shift], "Evening Doji Star", 9, "Times New Roman", Red); } ExtMapBuffer1[shift1] = High[shift1] + (Point * arrowShift); if (setPattern == 0) { pattern = "Evening Doji Star"; setPattern = 1; alert = 1; } continue; } // Check for Morning Doji Star pattern if ( (Close[3] < Open[3]) //Bearish candle && (Open[2] == Close[2]) && (Low[2] < Open[2]) && (High[2] > Open[2]) // Doji && (High[2] <= Close[3]) // Doji close lower or equal to bearish close && (Low[1] >= Close[2]) && (Open[1] >= High[2]) && (Open[1] <= Close[3]) && (Close[1] > ((Open[3] + Close[3]) / 2)) && (Close[1] < Open[3]) // Bullish candle in pattern ) { if (Show_Text_Labels == true) { ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], High[shift1] + (Point * textShift)); ObjectSetText(PatternText[shift], "Morning Doji Star", 9, "Times New Roman", Red); } ExtMapBuffer1[shift1] = High[shift1] + (Point * arrowShift); if (setPattern == 0) { pattern = "Morning Doji Star"; setPattern = 1; alert = 1; } continue; } // Check for Evening Star pattern if( (Close[3] > Open[3]) //Bullish candle && (Open[2] > Close[2]) && (Low[2] < Open[2]) && (High[2] > Open[2]) // Second, small candle && (Low[2] > Close[3]) // small candle gaps up. && (High[1] < Close[2]) && (Open[1] <= Low[2]) && (Open[1] > Close[3]) && (Close[1] < ((Open[3] + Close[3]) / 2)) && (Close[1] > Open[3]) // Bearish candle in pattern ) { if (Show_Text_Labels == true) { ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], High[shift1] + (Point * textShift)); ObjectSetText(PatternText[shift], "Evening Star", 9, "Times New Roman", Red); } ExtMapBuffer1[shift1] = High[shift1] + (Point * arrowShift); if (setPattern == 0) { pattern = "Evening Star"; setPattern = 1; alert = 1; } continue; } // Check for Morning Star pattern if ( (Close[3] < Open[3]) //Bearish candle && (Open[2] < Close[2]) && (Low[2] < Open[2]) && (High[2] > Open[2]) // Second, small candle && (High[2] < Close[3]) // Small candle gaps down && (Low[1] > Close[2]) && (Open[1] >= High[2]) && (Open[1] < Close[3]) && (Close[1] > ((Open[3] + Close[3]) / 2)) && (Close[1] < Open[3]) // Bullish candle in pattern ) { if (Show_Text_Labels == true) { ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], High[shift1] + (Point * textShift)); ObjectSetText(PatternText[shift], "Morning Star", 9, "Times New Roman", Red); } ExtMapBuffer1[shift1] = High[shift1] + (Point * arrowShift); if (setPattern == 0) { pattern = "Morning Star"; setPattern = 1; alert = 1; } continue; } } // End of Show_Star_Patterns condition // Check for Tweezer Top if (Show_Tweezer_Tops == true) { if ((High[shift1] == High[shift2])) { if (Show_Text_Labels == true) { ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], High[shift1] + (Point * textShift)); ObjectSetText(PatternText[shift], "Tweezer Top", 9, "Times New Roman", Red); } ExtMapBuffer1[shift1] = High[shift1] + (Point * arrowShift); if (setPattern == 0) { pattern = "Tweezer Top"; setPattern = 1; alert = 1; } continue; } } // Check for Tweezer Bottom if (Show_Tweezer_Bottoms == true) { if ((Low[shift1] == Low[shift2])) { if (Show_Text_Labels == true) { ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], High[shift1] - (Point * textShift)); ObjectSetText(PatternText[shift], "Tweezer Bottom", 9, "Times New Roman", Red); } ExtMapBuffer2[shift1] = High[shift1] - (Point * (arrowShift + 7)); if (setPattern == 0) { pattern = "Tweezer Bottom"; setPattern = 1; alert = 1; } continue; } } if (shift == 1 && alert == 1) { Print(Symbol()," M", Period()," ", pattern); Alert(Symbol()," M", Period()," ", pattern); } } // End of for loop return(0); } //+------------------------------------------------------------------+