Индикаторы: Fractal Levels

 

Fractal Levels:

индикатор фрактальных уровней

Author: GameOver

 
Aleksei:

Что обозначает красное, зелёное, жёлтое?

на картинке всё написано. это наиболее сильные уровни, там ещё указано сколько фракталов приходится на уровень

 

полезная вещь

а 3-х барный фрактал это 1 ?

 

отличный индикатор спасибо........

 
forexigor:
Aleksei:

Что обозначает красное, зелёное, жёлтое?

на картинке всё написано. это наиболее сильные уровни, там ещё указано сколько фракталов приходится на уровень


Индикатор хороший. А как здесь выставить 3-х барный фрактал(и можно ли такое сделать), а то если поставить 1 оно пишет "некоректные параметры индикатора"

 
//+------------------------------------------------------------------+
//| Strongest3Levels.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
extern int Gr_Period = 100;
extern int sBars = 480; // количество баров, однако обрабатывается не более 200
extern int frNum = 2; // количество баров фрактала, 2=5-барный фрактал, 3=7-барный и тд
extern int frType = 1; // тип определения фрактала 0=строгий, 1=нестрогий
extern int frMode = 0; // режимы - MODE_LOW(1)=Sup, MODE_HIGH(2)=Res, 0=S&R
extern double dlt = 0.24; // погрешность от средей высоты баров




#property copyright ""
#property link ""

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 Red
#property indicator_color2 Red
#property indicator_color3 Green
#property indicator_color4 Green
#property indicator_color5 Blue
#property indicator_color6 Blue
//---- indicator buffers
double U0_Buffer0[];
double D0_Buffer1[];
double U1_Buffer2[];
double D1_Buffer3[];
double U2_Buffer4[];
double D2_Buffer5[];

double Levels[3][2];

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
SetIndexStyle (0, DRAW_LINE);
SetIndexBuffer (0, U0_Buffer0);
SetIndexDrawBegin(0, MathMax(Gr_Period, sBars));
SetIndexLabel (0,"Up0");

SetIndexStyle (1, DRAW_LINE);
SetIndexBuffer (1, D0_Buffer1);
SetIndexDrawBegin(1, MathMax(Gr_Period, sBars));
SetIndexLabel (1,"Dn0");

SetIndexStyle (2, DRAW_LINE);
SetIndexBuffer (2, U1_Buffer2);
SetIndexDrawBegin(2, MathMax(Gr_Period, sBars));
SetIndexLabel (2,"Up1");

SetIndexStyle (3, DRAW_LINE);
SetIndexBuffer (3, D1_Buffer3);
SetIndexDrawBegin(3, MathMax(Gr_Period, sBars));
SetIndexLabel (3, "Dn1");

SetIndexStyle (4, DRAW_LINE);
SetIndexBuffer (4, U2_Buffer4);
SetIndexDrawBegin(4, MathMax(Gr_Period, sBars));
SetIndexLabel (4, "Up2");

SetIndexStyle (5, DRAW_LINE);
SetIndexBuffer (5, D2_Buffer5);
SetIndexDrawBegin(5, MathMax(Gr_Period, sBars));
SetIndexLabel (5, "Dn2");

return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
if( Bars <= Gr_Period + sBars )
return(0);
int fixed_bars = IndicatorCounted();
//---- check for possible errors
if(fixed_bars < 0)
return(-1);
//---- last counted bar will be recounted
if(fixed_bars > 0)
fixed_bars--;
int limit = Bars - fixed_bars;
//----
for(int i = 0; i < limit; i++)
{
Get3Levels(Levels, Gr_Period, sBars, frNum, frType, frMode, dlt, i+1);
U0_Buffer0[i]= Levels[0][0];
D0_Buffer1[i]= Levels[0][1];
U1_Buffer2[i]= Levels[1][0];
D1_Buffer3[i]= Levels[1][1];
U2_Buffer4[i]= Levels[2][0];
D2_Buffer5[i]= Levels[2][1];
}


return(0);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Get3Levels.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""

//+------------------------------------------------------------------+
//| Get3Levels |
//+------------------------------------------------------------------+

bool Get3Levels(double& Levels[3][2],int Gr_Period = 480, int sBars = 480, int frNum = 3, int frType = 1, int frMode = 0, double dlt = 0.24, int shift = 0)
{
bool Go = true;
double aData[][2],aRes[3][2];
int aCol[6]={Plum, Khaki, LightGreen, Magenta, Yellow, Aqua};

Print("TotalBarsCountArray = ", ArrayResize(aData, Gr_Period));
if (frNum!=0 && frNum<2) Go=false;
if (sBars!=0 && sBars<frNum*10) Go=false;
if (sBars==0) sBars=Bars;

if (!Go) { Comment("Некорректные параметры индикатора!"); return(False); }
if (Bars<sBars) { Comment("Недостаточно баров на графике!"); return(False); }

//+------------
// ищем фракталы, заносим их в массив, но не более допустимого количества
int sh=0;
ArrayInitialize(aData,0);
double lastExt=0;
int start = shift + 1;
int end = shift + sBars;
for(int i= start + frNum; i< end - 2*frNum; i++)
{
if (frMode!=MODE_LOW && upFrac(i, frNum, frType)) { // добавляем вершины [кроме режима впадин]
// при нестрогом условии пропускаем дублирующие соседние вершины
if (!(frType!=0 && lastExt>0 && lastExt==High[i])){
aData[sh][0]=High[i]; lastExt=High[i]; sh++;
}
}
if (sh>=Gr_Period) break;
if (frMode!=MODE_HIGH && dwFrac(i, frNum, frType)) { // добавляем впадины [кроме режима вершин]
// при нестрогом условии пропускаем дублирующие соседние впадины
if (!(frType!=0 && lastExt>0 && lastExt==Low[i])){
aData[sh][0]=Low[i]; lastExt=Low[i]; sh++;
}
}
if (sh>=Gr_Period) break;
}

// определяем средний размах свеч и соотв допуск
double sHL=0;
for(i=start;i<=end;i++) sHL=sHL+(High[i]-Low[i]);
sHL=sHL/sBars;
dlt=sHL*dlt;

// определяем рейтинги для каждого уровня
for(i=0;i<sh;i++){
for(int j=i+1;j<sh;j++){
if (aData[j][0]>aData[i][0]-dlt && aData[j][0]<aData[i][0]+dlt) {
aData[i][1]=aData[i][1]+1; aData[j][1]=aData[j][1]+1;
}
}
}

// определяем три сильнейших уровня
double cur[2],tmp[2]; aRes[0][0]=aData[0][0]; aRes[0][1]=aData[0][1];
for(i=1;i<sh;i++){
cur[0]=aData[i][0]; cur[1]=aData[i][1];
if (cur[1]>aRes[0][1]) { // если рейтинг больше 1го места, то 1е становицо текущим
tmp[0]=aRes[0][0]; tmp[1]=aRes[0][1]; aRes[0][0]=cur[0]; aRes[0][1]=cur[1]; cur[0]=tmp[0]; cur[1]=tmp[1];
}
// если рейтинг выше 2го места и при этом не принадлежит 1му - замещаем 2е место
if (cur[1]>aRes[1][1] && (cur[0]<aRes[0][0]-dlt || cur[0]>aRes[0][0]+dlt)) {
tmp[0]=aRes[1][0]; tmp[1]=aRes[1][1]; aRes[1][0]=cur[0]; aRes[1][1]=cur[1]; cur[0]=tmp[0]; cur[1]=tmp[1];
}
// если рейтинг выше 3го места и при этом не принадлежит 1му и 2му - замещаем 3е место
if (cur[1]>aRes[2][1] && (cur[0]<aRes[0][0]-dlt || cur[0]>aRes[0][0]+dlt) && (cur[0]<aRes[1][0]-dlt || cur[0]>aRes[1][0]+dlt)) {
aRes[2][0]=cur[0]; aRes[2][1]=cur[1];
}
}

// передаем сильные уровни
for(i=0;i<3;i++)
{
Levels[i][0]=aRes[i][0]+dlt; //Up
Levels[i][1]=aRes[i][0]-dlt; //Dn
}


// выводим комментарии
string rem="";
if (frType==1) rem=rem+"Классические "; else rem=rem+"Строгие ";
rem=rem+(frNum*2+1)+"-барные фракталы";
if (frMode==MODE_LOW) rem=rem+", впадины"; else if (frMode==MODE_LOW) rem=rem+", вершины";
rem=rem+"\nНайдено "+(sh)+" фрактала(ов) \nНаиболее сильные уровни ";
rem=StringConcatenate(rem,aRes[0][0],"[",aRes[0][1],"], ",aRes[1][0],"[",aRes[1][1],"], ",aRes[2][0],"[",aRes[2][1],
"], погрешность ±",NormalizeDouble(dlt/Point,1)," пункта(ов)");

Comment(rem);

return(0);
}

bool upFrac(int cnt, int frNum = 3, int frType = 1)
{
for(int i=1;i<=frNum;i++){
if (frType==0) { // если строгое условие и пост или пред бары выше-равны соседа - нет фрактала
if (High[cnt+i]>=High[cnt+i-1] || High[cnt-i]>=High[cnt-i+1]) return(false);
}
else { // если нестрогое условие и пост или пред бары выше центра - нет фрактала
if (High[cnt+i]>High[cnt] || High[cnt-i]>High[cnt]) return(false);
}
}
return(true);
}

bool dwFrac(int cnt, int frNum = 3, int frType = 1){
for(int i=1;i<=frNum;i++){
if (frType==0) { // если строгое условие и пост или пред бары ниже-равны соседа - нет фрактала
if (Low[cnt+i]<=Low[cnt+i-1] || Low[cnt-i]<=Low[cnt-i+1]) return(false);
}
else { // если нестрогое условие и пост или пред бары ниже центра - нет фрактала
if (Low[cnt+i]<Low[cnt] || Low[cnt-i]<Low[cnt]) return(false);
}
}
return(true);

}


Накидал побыстрому буферный вариант индикатора, чтобы посмотреть его динамику во времени, немного грузит проц, код не опримизирован. Показания интересны сами по себе.

За индикатор спасибо.

 


Так это дело выглядит

 
Aleksei:

Индикатор хороший. А как здесь выставить 3-х барный фрактал(и можно ли такое сделать), а то если поставить 1 оно пишет "некоректные параметры индикатора"


поменять условия проверки


int init(){
if (frNum!=0 && frNum<1) { Go=false; return(-1); }
if (sBars!=0 && sBars<frNum*10) { Go=false; return(-1); }
if (sBars==0) sBars=Bars;
return(0);
}

не помню, зачем ставил это ограничение %-)

 
GameOver:
Aleksei:

Индикатор хороший. А как здесь выставить 3-х барный фрактал(и можно ли такое сделать), а то если поставить 1 оно пишет "некоректные параметры индикатора"


поменять условия проверки


int init(){
if (frNum!=0 && frNum<1) { Go=false; return(-1); }
if (sBars!=0 && sBars<frNum*10) { Go=false; return(-1); }
if (sBars==0) sBars=Bars;
return(0);
}

не помню, зачем ставил это ограничение %-)


СПАСИБО.

 
Aleksei:

А этот индикатор, что со временем не перерисовывается? 

Он и задуман таким, что бы не перерисовываться? Или с ним какие то бока?

Причина обращения: