Pattern Alert_v1





/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                  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);
}
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
Series array that contains close prices for each bar
Series array that contains open prices of each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar


Indicator Curves created:

Implements a curve of type DRAW_ARROW


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features:

It issuies visual alerts to the screen