//+------------------------------------------------------------------+
//| eNstrdms
//+------------------------------------------------------------------+
//| èññëåäîâàòåëü ïàòòåðíîâ
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
#property copyright "© valenok2003@mail.ru"
//-----------------
#define NAME_EXPERT "eNstrdms"
#define RELIZE "20120606"
//-----------------
#define MAXBARS 5
//-----------------
//-----------------
int PreviosTime = 0;
double Cnt[100];
double TopBar[100];
double BootBar[100];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init() {
//----
PreviosTime = 0;
Cnt[100] = {0,,0};
TopBar[100] = {0,,0};
BootBar[100] = {0,,0};
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit() {
//----
Comment("");
ObjectDelete("High");
ObjectDelete("Low");
ObjectDelete("Info");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start() {
//----
if(Time[0] == PreviosTime) return(0);
PreviosTime = Time[0];
for(int i=0;i<100;i++){
Cnt[i] = 0;
TopBar[i] = 0;
BootBar[i] = 0;
}
bool FLAGSTOP = false;
// íà÷èíàåì ïðîâåðêó íà÷èíàÿ èç-çà èñëåäóåìîãî ïàòòåðíà è íå äîâîäèì äî êîíöà íà ïàòòåðí
for(int BarsInPattern=MAXBARS; BarsInPattern>0; BarsInPattern--){
for(int Deviation = 0; Deviation < 100; Deviation++) {
for(int StartBar = BarsInPattern+1; StartBar < Bars-BarsInPattern-1; StartBar++){
// ïðîâåðêà ïàòòåðíà íà ñîâïàäåíèå
if(check_pattern(StartBar, BarsInPattern, Deviation)){
Cnt[Deviation] = Cnt[Deviation]+1;
TopBar[Deviation] = TopBar[Deviation] + (High[StartBar-1] - Open[StartBar-1]);
BootBar[Deviation] = BootBar[Deviation] + (Open[StartBar-1] - Low[StartBar-1]);
}
}
//Print(Deviation+" -> "+DoubleToStr(Cnt[Deviation],0));
if(Cnt[Deviation]>0){
TopBar[Deviation] = TopBar[Deviation]/Cnt[Deviation];
BootBar[Deviation] = BootBar[Deviation]/Cnt[Deviation];
FLAGSTOP = true;
break;
}
}
if(FLAGSTOP) break;
}
if(Cnt[Deviation] != 0) {
double Top = Open[0] + TopBar[Deviation];
double Boot = Open[0] - BootBar[Deviation];
drow_line("High",Top, Yellow);
drow_line("Low", Boot, Yellow);
double Probability = (Cnt[Deviation]*BarsInPattern*100)/(100+Deviation*3);
//--------------
ObjectDelete ("Info");
ObjectCreate ("Info", OBJ_LABEL, 0, 0, 0);
ObjectSet ("Info", OBJPROP_CORNER, 2);
ObjectSet ("Info", OBJPROP_XDISTANCE, 5);
ObjectSet ("Info", OBJPROP_YDISTANCE, 5);
ObjectSetText("Info", "Âåðîÿòíîñòü "+DoubleToStr(Probability,2)+"%", 10, "Arial", Yellow);
//--------------
Comment( "Ïàòòåðí "+DoubleToStr(BarsInPattern,0)+ " áàð" +
"\nÄîïóñê "+DoubleToStr(Deviation,0)+ "% íà áàð" +
"\nÑîâïàäåíèé "+DoubleToStr(Cnt[Deviation],0)
);
}
else {
ObjectDelete ("Info");
ObjectCreate ("Info", OBJ_LABEL, 0, 0, 0);
ObjectSet ("Info", OBJPROP_CORNER, 2);
ObjectSet ("Info", OBJPROP_XDISTANCE, 5);
ObjectSet ("Info", OBJPROP_YDISTANCE, 5);
ObjectSetText("Info", "Àíàëîãîâ íå îáíàðóæåíî", 10, "Arial", Yellow);
}
//----
return(0);
}
//+------------------------------------------------------------------+
//+-------
//+-------
//+------------------------------------------------------------------+
//| valenok2003@mail.ru 26.04.2012
//+------------------------------------------------------------------+
//| check_pattern()
//| ïðîâåðêà òåêóùåãî ïàòòåðíà íà ñîâïàäåíèå ñ ïàòòåðíîì îò çàäàííîãî áàðà
//| âîçâðàùàåò true â ñëó÷àå ñîâïàäåíèÿ
//+------------------------------------------------------------------+
bool check_pattern(int _StartBar, int _BarInPattern, int _Deviation) {
string _Function = "check_pattern():";
//-----------------
bool RET = true;
for(int i=0; i<_BarInPattern; i++){
if(!check_bar(_StartBar, i, _Deviation)){
RET = false;
}
}
//-----------------
return(RET);
}
//+------------------------------------------------------------------+
//+-------
//+-------
//+------------------------------------------------------------------+
//| valenok2003@mail.ru 26.04.2012
//+------------------------------------------------------------------+
//| check_bar()
//| ïðîâåðêà òåêóùåãî áàðà íà ñîâïàäåíèå ñ çàäàííûì áàðîì
//| âîçâðàùàåò true â ñëó÷àå ñîâïàäåíèÿ
//+------------------------------------------------------------------+
bool check_bar(int _StartBar, int _Shift, int _Deviation) {
string _Function = "check_bar():";
//-----------------
bool RET = true;
int _CurBar = _StartBar+_Shift+1;
//-----------------
if(High[_CurBar]-Open[_CurBar-1] > max_limit(High[_Shift+1]-Open[_Shift], _Deviation)
|| High[_CurBar]-Open[_CurBar-1] < min_limit(High[_Shift+1]-Open[_Shift], _Deviation)
) {
RET = false;
}
if(High[_CurBar]-Close[_CurBar] > max_limit(High[_Shift+1]-Close[_Shift+1], _Deviation)
&& High[_CurBar]-Close[_CurBar] < min_limit(High[_Shift+1]-Close[_Shift+1], _Deviation)
) {
RET = false;
}
if(High[_CurBar]-Low[_CurBar] > max_limit(High[_Shift+1]-Low[_Shift+1], _Deviation)
&& High[_CurBar]-Low[_CurBar] < min_limit(High[_Shift+1]-Low[_Shift+1], _Deviation)
) {
RET = false;
}
//-----------------
return(RET);
}
//+-------
//+------------------------------------------------------------------+
//| valenok2003@mail.ru 26.04.2012
//+------------------------------------------------------------------+
//| max_limit()
//|
//+------------------------------------------------------------------+
double max_limit(double _Value, int _Precision){
string _Function = "max_limit():";
//-----------------
double _Ret = (_Value*_Precision)/100;
_Value = _Value + _Ret;
//-----------------
return(_Value);
}
//+------------------------------------------------------------------+
//+-------
//+-------
//+------------------------------------------------------------------+
//| valenok2003@mail.ru 26.04.2012
//+------------------------------------------------------------------+
//| min_limit()
//|
//+------------------------------------------------------------------+
double min_limit(double _Value, int _Precision){
string _Function = "min_limit():";
//-----------------
double _Ret = (_Value*_Precision)/100;
_Value = _Value - _Ret;
//-----------------
return(_Value);
}
//+------------------------------------------------------------------+
//+-------
//+-------
//+------------------------------------------------------------------+
//| valenok2003@mail.ru 26.04.2012
//+------------------------------------------------------------------+
//| drow_line()
//| ðèñóåò ãîðèçîíòàëüíóþ ëèíèþ
//+------------------------------------------------------------------+
void drow_line(string _Name, double _Price, color _Color) {
ObjectDelete(_Name);
ObjectCreate(_Name,OBJ_HLINE,0,0,_Price);
ObjectSet (_Name,OBJPROP_COLOR,_Color);
return;
}
//+------------------------------------------------------------------+
//+-------
Comments