Pattern_Recognition_v1.0

Download script
Author: Copyright � 2005, Jason Robinson (jnrtrading).
Pattern_Recognition_v1.0

This script is designed as an automated visual assistant for traders who use "Candlestick Patterns" to predict potential movements in the financial markets. Rather than manual chart analysis, it scans historical and real-time price data to identify specific formations that signal where the market might turn bullish (upward) or bearish (downward).

Core Functionality

The tool systematically monitors the price action of recent candles to detect 16 different technical patterns. When it identifies one of these patterns, it performs three primary actions:

  1. Visual Labeling: It places a text label directly on the chart naming the specific pattern found (e.g., "Bearish Engulfing" or "Morning Doji Star").
  2. Graphic Indicators: It draws colored arrows—Magenta for bearish signals and Royal Blue for bullish signals—to provide a quick reference for price direction.
  3. Real-Time Alerts: If enabled, the script sends an instant notification (pop-up alert) on your trading platform the moment a new pattern is detected on the current live candle.

Pattern Categories

The logic is divided into two main directional categories:

  • Bearish Signals (Potential Downward Movement): The script looks for patterns like Bearish Engulfing, Three Outside Down, Dark Cloud Cover, Evening Doji Star, Bearish Harami, Three Inside Down, and Three Black Crows. These typically occur when buyers are losing momentum and sellers are taking control.
  • Bullish Signals (Potential Upward Movement): The script scans for Bullish Engulfing, Three Outside Up, Bullish Harami, Three Inside Up, Piercing Line, Three White Soldiers, and Morning Doji Star. These indicate that buyers are becoming aggressive and the price may rise.

How the Logic Works

To ensure accuracy, the script doesn't just look at one candle in isolation. It analyzes a sequence of recent candles to calculate:

  • Relative Size: It calculates the average range of the last 10 candles to determine how "large" or "significant" a new price movement is relative to recent volatility.
  • Price Relationships: It compares the opening and closing prices of the current candle against previous candles to see if they "engulf," "pierce," or "nest" inside one another.
  • Proportional Strength: For specific patterns (like Doji Stars or Piercing Lines), it checks if the price moved a significant percentage (e.g., more than 60% of the candle's total range) to confirm the strength of the reversal.

User Customization

The script includes several "toggle" switches that allow you to control what information is displayed. You can choose to turn specific patterns on or off, adjust the text size for better readability, and enable or disable the audible/visual alerts depending on your preferred trading style.

Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
12 Views
0 Downloads
0 Favorites
Pattern_Recognition_v1.0
//+------------------------------------------------------------------+
//|                                     Pattern Recognition v1.0     |
//|          (complete rewrite and name change of pattern alert)     |
//+------------------------------------------------------------------+
//|                                         Pattern Recognition.mq4  |
//|                                Copyright © 2005, Jason Robinson  |
//|                                  (jasonrobinsonuk,  jnrtrading)  |
//|                                     http://www.jnrtrading.co.uk  |
//|      This is still work in progress and needs LOTS of testing    |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Jason Robinson (jnrtrading)."
#property link      "http://www.jnrtrading.co.uk"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Magenta
#property indicator_color2 RoyalBlue
//----
extern bool Show_Alert = true;
extern bool Display_Bearish_Engulfing = true;
extern bool Display_Three_Outside_Down = true;
extern bool Display_Three_Inside_Down = true;
extern bool Display_Dark_Cloud_Cover = true;
extern bool Display_Three_Black_Crows = true;
extern bool Display_Bullish_Engulfing = true;
extern bool Display_Three_Outside_Up = true;
extern bool Display_Three_Inside_Up = true;
extern bool Display_Piercing_Line = true;
extern bool Display_Three_White_Soldiers = true;
extern bool Display_Stars = true;
extern bool Display_Harami = true;
extern int  fontsize = 7;
//---- buffers
double upArrow[];
double downArrow[];
string PatternText[5000];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() 
  {
   SetIndexStyle(0, DRAW_ARROW, 0, 1);
   SetIndexArrow(0, 72);
   SetIndexBuffer(0, downArrow);      
//----
   SetIndexStyle(1, DRAW_ARROW, 0, 1);
   SetIndexArrow(1, 71);
   SetIndexBuffer(1, upArrow);
      
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() 
  {
   ObjectsDeleteAll(0, OBJ_TEXT);
   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;
   string pattern, period;
   int setPattern = 0;
   int alert = 0;
   int arrowShift;
   int textShift;
   double O, O1, O2, C, C1, C2, L, L1, L2, H, H1, H2;     
//----
   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;      
       O = Open[shift1];
       O1 = Open[shift2];
       O2 = Open[shift3];
       H = High[shift1];
       H1 = High[shift2];
       H2 = High[shift3];
       L = Low[shift1];
       L1 = Low[shift2];
       L2 = Low[shift3];
       C = Close[shift1];
       C1 = Close[shift2];
       C2 = Close[shift3];         
       // Bearish Patterns   
       // Check for Bearish Engulfing pattern
       if((C1 > O1) && (O > C) && (O >= C1) && (O1 >= C) && ((O - C) > (C1 - O1))) 
         {
           if(Display_Bearish_Engulfing == true) 
             {
               ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], 
                            High[shift1] + Range*0.5);
               ObjectSetText(PatternText[shift], "Bearish Engulfing", fontsize, 
                             "Times New Roman", Magenta);
               downArrow[shift1] = High[shift1] + Range*0.1;
             }
           if(setalert == 0 && Show_Alert == true) 
             {
               pattern = "Bearish Engulfing Pattern";
               setalert = 1;
             }
         }
       // Check for a Three Outside Down pattern
       if((C2 > O2) && (O1 > C1) && (O1 >= C2) && (O2 >= C1) && ((O1 - C1) > (C2 - O2)) && 
          (O > C) && (C < C1)) 
         {
           if(Display_Three_Outside_Down == true) 
             {   
               ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], 
                            High[shift1] + Range*0.7);
               ObjectSetText(PatternText[shift], "Three Outside Down", fontsize, 
                             "Times New Roman", Magenta);
               downArrow[shift1] = High[shift1] + Range*0.1;
             }
           if(setalert == 0 && Show_Alert == true) 
             {
               pattern = "Three Oustide Down Pattern";
               setalert = 1;
             }
         }
       // Check for a Dark Cloud Cover pattern
       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) 
             {   
               ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], 
                            High[shift1] + Range*0.9);
               ObjectSetText(PatternText[shift], "Dark Cloud Cover", fontsize, 
                             "Times New Roman", Magenta);
               downArrow[shift1] = High[shift1] + Range*0.1;
             }
           //----
           if(setalert == 0 && Show_Alert == true) 
             {
               pattern = "Dark Cloud Cover Pattern";
               setalert = 1;
             }
         }     
       // Check for Evening Doji Star pattern
       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.1);
               ObjectSetText(PatternText[shift], "Evening Doji Star", fontsize, 
                             "Times New Roman", Magenta);
               downArrow[shift1] = High[shift1] + Range*0.1;
             }
           //----
           if(setalert == 0 && Show_Alert == true) 
             {
               pattern = "Evening Doji Star Pattern";
               setalert = 1;
             }
         }     
       // Check for Bearish Harami pattern
       if((C1 > O1) && (O > C) && (O <= C1) && (O1 <= C) && ((O - C) < (C1 - O1))) 
         {
           if(Display_Harami == true) 
             {   
               ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], 
                            High[shift1] + Range*1.3);
               ObjectSetText(PatternText[shift], "Bearish Harami", fontsize, 
                             "Times New Roman", Magenta);
               downArrow[shift1] = High[shift1] + Range*0.1;
             }
           if(shift == 0 && Show_Alert == true) 
             {
               pattern="Bearish Harami Pattern";
               setalert = 1;
             }
         }
       // Check for Three Inside Down pattern
       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], "Three Inside Down", fontsize, 
                             "Times New Roman", Magenta);
               downArrow[shift1] = High[shift1] + Range*0.1;
             }
           if(shift == 0 && Show_Alert == true) 
             {
               pattern = "Three Inside Down Pattern";
               setalert = 1;
             }
         }   
       // Check for Three Black Crows pattern
       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.7);
               ObjectSetText(PatternText[shift], "Three Black Crows", fontsize, 
                             "Times New Roman", Magenta);
               downArrow[shift1] = High[shift1] + Range*0.1;
             }
           //----
           if(shift == 0 && Show_Alert == true) 
             {
               pattern = "Three Black Crows Pattern";
               setalert = 1;
             }
         }
       //Check for Evening Star Pattern
       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.9);
               ObjectSetText(PatternText[shift], "Evening Star", fontsize, "Times New Roman", Magenta);
               downArrow[shift1] = High[shift1] + Range*0.1;
             }
           //----
           if(shift == 0 && Show_Alert == true) 
             {
               pattern = "Evening Star Pattern";
               setalert = 1;
             }
         }
       // End of Bearish Patterns
       
       
       
       // Bullish Patterns
       // Check for Bullish Engulfing pattern
       if((O1 > C1) && (C > O) && (C >= O1) && (C1 >= O) && ((C - O) > (O1 - C1))) 
         {
           if(Display_Bullish_Engulfing) 
             {   
               ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], 
                            Low[shift1] - Range*0.5);
               ObjectSetText(PatternText[shift], "Bullish Engulfing", fontsize, 
                             "Times New Roman", RoyalBlue);
               upArrow[shift1] = Low[shift1] - Range*0.1;
             }
           if(shift == 0 && Show_Alert == true) 
             {
               pattern = "Bullish Engulfing Pattern";
               setalert = 1;
             }
         }
       // Check for Three Outside Up pattern
       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*0.7);
               ObjectSetText(PatternText[shift], "Three Outside Up", fontsize, 
                             "Times New Roman", RoyalBlue);
               upArrow[shift1] = Low[shift1] - Range*0.1;
             }
           if(shift == 0 && Show_Alert == true) 
             {
               pattern = "Three Outside Up Pattern";
               setalert = 1;
             }
         }
       // Check for Bullish Harami pattern
       if((O1 > C1) && (C > O) && (C <= O1) && (C1 <= O) && ((C - O) < (O1 - C1))) 
         {
           if(Display_Harami == true) 
             {   
               ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], 
                            Low[shift1] - Range*0.9);
               ObjectSetText(PatternText[shift], "Bullish Harami", fontsize, 
                             "Times New Roman", RoyalBlue);
               upArrow[shift1] = Low[shift1] - Range*0.1;
             }
           if(shift == 0 && Show_Alert == true) 
             {
               pattern = "Bullish Harami Pattern";
               setalert = 1;
             } 
         }
       // Check for Three Inside Up pattern
       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.1);
               ObjectSetText(PatternText[shift], "Three Inside Up", fontsize, 
                             "Times New Roman", RoyalBlue);
               upArrow[shift1] = Low[shift1] - Range*0.1;
             }
           if(shift == 0 && Show_Alert == true) 
             {
               pattern = "Three Inside Up Pattern";
               setalert = 1;
             }
         }      
       // Check for Piercing Line pattern
       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) 
             {   
               ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], 
                            Low[shift1] - Range*1.3);
               ObjectSetText(PatternText[shift], "Piercing Line", fontsize, 
                             "Times New Roman", RoyalBlue);
               upArrow[shift1] = Low[shift1] - Range*0.1;
             }
           if(shift == 0 && Show_Alert == true) 
             {
               pattern = "Piercing Line Pattern";
               setalert = 1;
             }
         }      
       // Check for Three White Soldiers pattern
       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], "Three White Soldiers", fontsize, 
                             "Times New Roman", RoyalBlue);
               upArrow[shift1] = Low[shift1] - Range*0.1;
             }
           if(shift == 0 && Show_Alert == true) 
             {
               pattern = "Three White Soldiers Pattern";
               setalert = 1;
             }
         }     
       // Check for Morning Doji Star
       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.7);
               ObjectSetText(PatternText[shift], "Morning Doji Star", fontsize, 
                             "Times New Roman", RoyalBlue);
               upArrow[shift1] = Low[shift1] - Range*0.1;
             }
           if(shift == 0 && Show_Alert == true) 
             {
               pattern = "Morning Doji Star Pattern";
               setalert = 1;
             }
         }
       if(setalert == 1 && shift == 0) 
         {
           Alert(Symbol(), " ", period, " ", pattern);
           setalert = 0;
         }
     } // End of for loop
   return(0);
  }
//+------------------------------------------------------------------+

Comments