Miscellaneous
0
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
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---