//+------------------------------------------------------------------+ //| v04 | //| | //| v02 | //| Добавлен процент для отсеивания фракталов | //| v03 | //| Рисует линии | //| v04 | //| Фильтр для линий по аллигатору | //| v05 | //| выбор варианта построения линий | //| v06 | //| выбор количества баров в фрактале | //+------------------------------------------------------------------+ #property copyright "by olyakish" #property link "" //---- #property indicator_chart_window #property indicator_buffers 4 #property indicator_color1 Lime //Зеленый фрактал #property indicator_color2 Red // Приседающий #property indicator_color3 SaddleBrown //Увядающий #property indicator_color4 Blue // Фальшивый //---- extern int Pips = 15; extern int ShiftBars = 1000; extern string rem0="Количество баров в фрактале"; extern int BarsInFractal = 11; extern string rem1="Процент для отсеивания по объему"; extern int Percent=110; extern string rem2="Рисовать предыдущие линии?"; extern bool UseOldLine=true; extern string rem3="По каким фракталам рисуем линии"; extern string rem4="0-зеленые,1-приседающие"; extern string rem5="2-увядающие,3-фальшивые"; extern int FractalLines=1; double ExtLimeBuffer[]; double ExtRedBuffer[]; double ExtSaddleBrownBuffer[]; double ExtBlueBuffer[]; int i,j,z; double a_Fractal[2]; // 0- последний 1-предыдущий double a_MFI[2]; // 0- последний 1-предыдущий double a_Volume[2]; // 0- последний 1-предыдущий //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int init() { int test; test=BarsInFractal/2; if (test*2==BarsInFractal){Alert("Значение BarsInFractal должно быть нечетным");deinit();} if (BarsInFractal<3){Alert("Значение BarsInFractal должно быть >=3");deinit();} SetIndexShift(0,0); SetIndexShift(1,0); SetIndexShift(2,0); SetIndexShift(3,0); //---- SetIndexBuffer(0, ExtLimeBuffer); SetIndexBuffer(1, ExtRedBuffer); SetIndexBuffer(2, ExtSaddleBrownBuffer); SetIndexBuffer(3, ExtBlueBuffer); //---- SetIndexStyle(0, DRAW_ARROW ); SetIndexStyle(1, DRAW_ARROW); SetIndexStyle(2, DRAW_ARROW); SetIndexStyle(3, DRAW_ARROW); SetIndexArrow(0,177); SetIndexArrow(1,177); SetIndexArrow(2,177); SetIndexArrow(3,177); ///---- SetIndexLabel(0, "Зеленый фрактал"); SetIndexLabel(1, "Приседающий фрактал"); SetIndexLabel(2, "Увядающий фрактал"); SetIndexLabel(3, "Фальшивый фрактал"); //---- ObjectCreate("Up",OBJ_TREND,0,iTime(NULL, 0, 2),High[2],iTime(NULL, 0, 1),High[1],0,0); ObjectSet("Up",OBJPROP_COLOR,Aqua); ObjectSet("Up",OBJPROP_RAY,true); ObjectSet("Up",OBJPROP_BACK,1); ObjectCreate("Down",OBJ_TREND,0,iTime(NULL, 0, 2),Low[2],iTime(NULL, 0, 1),Low[1],0,0); ObjectSet("Down",OBJPROP_COLOR,Tomato); ObjectSet("Down",OBJPROP_RAY,true); ObjectSet("Down",OBJPROP_BACK,1); if (UseOldLine) { ObjectCreate("Up_Prev",OBJ_TREND,0,iTime(NULL, 0, 2),High[2],iTime(NULL, 0, 1),High[1],0,0); ObjectSet("Up_Prev",OBJPROP_COLOR,Aqua); ObjectSet("Up_Prev",OBJPROP_RAY,true); ObjectSet("Up_Prev",OBJPROP_STYLE,STYLE_DASH); ObjectSet("Up_Prev",OBJPROP_BACK,1); ObjectCreate("Down_Prev",OBJ_TREND,0,iTime(NULL, 0, 2),Low[2],iTime(NULL, 0, 1),Low[1],0,0); ObjectSet("Down_Prev",OBJPROP_COLOR,Tomato); ObjectSet("Down_Prev",OBJPROP_RAY,true); ObjectSet("Down_Prev",OBJPROP_STYLE,STYLE_DASH); ObjectSet("Down_Prev",OBJPROP_BACK,1); } //---- return(0); } int deinit() { ObjectDelete("Up"); ObjectDelete("Down"); if (UseOldLine) { ObjectDelete("Up_Prev"); ObjectDelete("Down_Prev"); } return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { int n=BarsInFractal; while (ExtLimeBuffer[n]!=NULL || ExtRedBuffer[n]!=NULL || ExtSaddleBrownBuffer[n]!=NULL || ExtBlueBuffer[n]!=NULL) { if (n>ShiftBars) {n=ShiftBars;break;} n++; } for(int i=n+20; i>=(BarsInFractal/2+1); i--) { //-- верхние фракталы ArrayInitialize(a_Fractal,0); ArrayInitialize(a_MFI,0); ArrayInitialize(a_Volume,0); if (High[i]==High[iHighest(Symbol(),0,MODE_HIGH,BarsInFractal,i-BarsInFractal/2)]) // на i баре есть фрактал вверх { a_Fractal[0]=High[i]; // цена на фрактале for (z=i-BarsInFractal/2;z<=i-BarsInFractal/2+BarsInFractal;z++){a_Volume[0]+=Volume[z];} // объем for (z=i-BarsInFractal/2;z<=i-BarsInFractal/2+BarsInFractal;z++){a_MFI[0]+=High[z]-Low[z];} a_MFI[0]=a_MFI[0]/a_Volume[0]; // пошли искать фрактал на вниз по истории j=i+1; while (a_Fractal[1]==0 && ja_Volume[1]*Percent/100 && a_MFI[0]a_Volume[1]*Percent/100 && a_MFI[0]>a_MFI[1]){ExtLimeBuffer[i]=High[i]+Pips*Point;break;} // имеем зеленый фрактал (MFI + объем +) if (a_Volume[0]*Percent/100a_MFI[1]){ExtBlueBuffer[i]=High[i]+Pips*Point;break;} // имеем фальшивый фрактал (MFI + объем -) if (a_Volume[0]*Percent/100a_Volume[1]*Percent/100 && a_MFI[0]a_Volume[1]*Percent/100 && a_MFI[0]>a_MFI[1]){ExtLimeBuffer[i]=Low[i]-Pips*Point;break;} // имеем зеленый фрактал (MFI + объем +) if (a_Volume[0]*Percent/100a_MFI[1]){ExtBlueBuffer[i]=Low[i]-Pips*Point;break;} // имеем фальшивый фрактал (MFI + объем -) if (a_Volume[0]*Percent/100iLips && iFractals(NULL,0,MODE_UPPER,i)>iTeeth && iFractals(NULL,0,MODE_UPPER,i)>iJaw) { _Price[up,0]=ExtLimeBuffer[i];_Time[up,0]=iTime(NULL, 0, i);up++; } if (ExtLimeBuffer[i]!=2147483647 && down<=2 && Low[i]>=ExtLimeBuffer[i]) //&& iFractals(NULL,0,MODE_LOWER,i)iLips && iFractals(NULL,0,MODE_UPPER,i)>iTeeth && iFractals(NULL,0,MODE_UPPER,i)>iJaw) { _Price[up,0]=ExtRedBuffer[i];_Time[up,0]=iTime(NULL, 0, i);up++; } if (ExtRedBuffer[i]!=2147483647 && down<=2 && Low[i]>=ExtRedBuffer[i]) //&& iFractals(NULL,0,MODE_LOWER,i)iLips && iFractals(NULL,0,MODE_UPPER,i)>iTeeth && iFractals(NULL,0,MODE_UPPER,i)>iJaw) { _Price[up,0]=ExtSaddleBrownBuffer[i];_Time[up,0]=iTime(NULL, 0, i);up++; } if (ExtSaddleBrownBuffer[i]!=2147483647 && down<=2 && Low[i]>=ExtSaddleBrownBuffer[i]) //&& iFractals(NULL,0,MODE_LOWER,i)iLips && iFractals(NULL,0,MODE_UPPER,i)>iTeeth && iFractals(NULL,0,MODE_UPPER,i)>iJaw) { _Price[up,0]=ExtBlueBuffer[i];_Time[up,0]=iTime(NULL, 0, i);up++; } if (ExtBlueBuffer[i]!=2147483647 && down<=2 && Low[i]>=ExtBlueBuffer[i]) //&& iFractals(NULL,0,MODE_LOWER,i)