//----------------------------------------------------------------------- // MF_Fractal_ZZ_3in1.mq4 // Èíäèêàòîð ôîðìèðóåò íà ðàáî÷åì òàéìôðåéìå ïîñëåäîâàòåëüíîñòü óçëîâ // çèãçàãà, âû÷èñëåííûõ íà ñýìóëèðîâàííûõ òðåõ ñòàðøèõ. // Ðàáîòàåò íà âñåõ è ñî âñåìè, â ò.÷. è íåñòàíäàðòíûìè ÒÔ // Îãðàíè÷åíèÿ: // - ñòàðøèå ÒÔ äîëæíû áûòü êðàòíû ðàáî÷åìó, åñëè íåò, òî çíà÷åíèÿ // óñòàíàâëèâàþòñÿ ïðèíóäèòåëüíî. // - ðàáî÷èé ÒÔ <= ñàìîìó ìåëêîìó èç ñòàðøèõ // - TFSmall < TFMidle && TFMidle < TFLarge // - TFLarge <=43200 (ìåñÿö) //----------------------------------------------------------------------- #property copyright "Copyright © 2008, BiViSi Corp." #property link "riderfin@bk.ru" #property link "ICQ 499949112" #property indicator_chart_window #property indicator_buffers 3 //---- ñòèëü èíäèêàòîðíîé ëèíèè #property indicator_color1 Blue #property indicator_color2 Red #property indicator_color3 Yellow #property indicator_style1 0 #property indicator_style2 0 #property indicator_style3 0 #property indicator_width1 5 #property indicator_width2 3 #property indicator_width3 1 //---- ÂÕÎÄÍÛÅ ÏÀÐÀÌÅÒÐÛ ÈÍÄÈÊÀÒÎÐÀ extern int VolExt=50; // âû÷èñëåíèå "VolExt+1" ïîñëåäíèõ îïîðíûõ òî÷åê extern int TFLarge=1440; extern int TFMidle=240; extern int TFSmall=60; //---- Variables double Large[],Midle[],Small[]; // îïîðíûå òî÷êè (áóôåðû èíäèêàòîðà) datetime PrevTimePer[4]; // âðåìåíà ïîñëåäíåãî ðàñ÷åòà ïî êàæäîìó ÒÔ datetime PrevTimeCalc=0; double P60,CP60; int CurPeriod, ErrorTF=0, NumberExt, Per, largelast=0, midlelast=0, smalllast=0; //----------------------------------------------------------------------- int init() { // èíèöèàëèçàöèÿ IndicatorBuffers(3); // ñòðîêà "íà ïåðñïåêòèâó" :) SetIndexBuffer(0,Large); SetIndexStyle(0,DRAW_SECTION); SetIndexEmptyValue(0,0.0); SetIndexBuffer(1,Midle); SetIndexStyle(1,DRAW_SECTION); SetIndexEmptyValue(1,0.0); SetIndexBuffer(2,Small); SetIndexStyle(2,DRAW_SECTION); SetIndexEmptyValue(2,0.0); ArrayInitialize(PrevTimePer,0); CurPeriod=Period(); CP60=CurPeriod*60; // Îãðàíè÷åíèÿ: // êîíòðîëü ÒÔ è ââåäåííûõ ïàðàìåòðîâ if (MathCeil(TFSmall/CurPeriod) != TFSmall/CurPeriod) TFSmall=MathCeil(TFSmall/CurPeriod)*CurPeriod; if (MathCeil(TFMidle/CurPeriod) != TFMidle/CurPeriod) TFMidle=MathCeil(TFMidle/CurPeriod)*CurPeriod; if (MathCeil(TFLarge/CurPeriod) != TFLarge/CurPeriod) TFLarge=MathCeil(TFLarge/CurPeriod)*CurPeriod; if (CurPeriod > TFSmall) {Alert ("Ïåðèîä ãðàôèêà äîëæåí áûòü ìåíüøå èëè ðàâåí ", TFSmall," ìèí."); ErrorTF=1;return;} if (TFSmall >= TFMidle || TFMidle >= TFLarge || TFLarge>43200) {Alert ("Íåêîððåêòíûé âûáîð òàéìôðåéìîâ äëÿ ðàñ÷åòà!!!"); ErrorTF=1;return;} return; } //-------------------------------------------------------------------- int start() { if ( ErrorTF==1 ) return; // íåêîððåêòíûé òàéìôðåéì FractalCalc(); return; } //====================================================================== // Ïîèñê 5-òè áàðíûõ ôðàêòàëîâ è âû÷èñëåíèå óçëîâ çèãçàãà // íà ýìóëÿöèè ñòàðøèõ ÒÔ, óäàëåíèå ëèøíèõ è îòîáðàæåíèå íà òåêóùåì ÒÔ //====================================================================== void FractalCalc () { // Force ¹1 - âû÷ òîëüêî íà ïîëíîñòüþ ñôîðìèðîâàâøåìñÿ áàðå ðàáî÷åãî ÒÔ if (PrevTimeCalc == Time[0]) return; else PrevTimeCalc=Time[0]; int y, x, k, i, j, extr=0; // âðåìÿ ïîñëåäíåãî áàðà òåê ÒÔ, çàêðûâàþùåãî áàð ¹1-5 ñòàðøåãî ÒÔ int t1, t2, t3, t4, t5; // íîìåð ïîñëåäíåãî áàðà òåê ÒÔ, çàêðûâàþùåãî áàð ¹1-5 ñòàðøåãî ÒÔ int limit1, limit2, limit3, limit4, limit5; // íîìåðà áàðîâ òåê ÒÔ ñ ïèêàìè è äîíûøêàìè ñîîòâ áàðàì 1-5 ñòàðøåãî ÒÔ int up1,up2,up3,up4,up5,dn1,dn2,dn3,dn4,dn5; for (y=1; y<=3; y++) // öèêë ïî ðàññ÷èòûâàåìûì ÒÔ { if (y==1) Per=TFLarge; if (y==2) Per=TFMidle; if (y==3) Per=TFSmall; P60=Per*60; // Force ¹2 - Âû÷èñëÿåì èçëîìû òîëüêî ñ ôîðìèðîâàíèåì áàðà ñòàðøåãî ÒÔ if (PrevTimePer[y] !=0) { if (Per<43200 && (Time[0] - PrevTimePer[y])<P60 )continue; if (Per==43200 && Month()==TimeMonth(PrevTimePer[y]))continue; } // Îáðàáîòêà ïðîïóñêà áàðîâ // Åñëè ïðÿìîëèíåéíî PrevTimePer[y]=Time[0], òî â ñëó÷àå ïðîïóñêà áàðîâ // íà ðàáî÷åì ÒÔ ïðîèçîéäåò ñäâèã âñåé öåïî÷êè ðàñ÷åòà íà âåëè÷èíó ïðîïóñêà PrevTimePer[y]=MathCeil(Time[0]/Per/60)*P60; NumberExt=0; extr=0; k=Per/CurPeriod; // îãðàíè÷åíèå öèêëà - â çàâèñèìîñòè îò òîãî êàêîé ÒÔ îáñ÷èòûâàåì // è îò ïîñëåäíåãî íàéäåííîãî ôðàêòàëà i=MathCeil(Bars/k)-5; // Force #3 - îáñ÷èòûâàåì, íà÷èíàÿ ñ ïîñëåäíåãî èçëîìà if(y==1 && largelast !=0) i=largelast+k; if(y==2 && midlelast !=0) i=midlelast+k; if(y==3 && smalllast !=0) i=smalllast+k; for (x=1; x<=i; x++) { // íàõîäèì ïèêè è äîíûøêè // âðåìÿ íà÷àëà ïîñëåäíåãî áàðà òåê ÒÔ, çàêðûâàþùåãî áàð ¹1 ñòàðøåãî ÒÔ if (PrevTimePer[y] !=0) t1=PrevTimePer[y]-x*P60+(k-1)*CP60; else t1=MathCeil(Time[0]/Per/60)*P60-x*P60+(k-1)*CP60; t2=t1-P60; t3=t2-P60; t4=t3-P60; t5=t4-P60; limit1=iBarShift(NULL,0,t1, false); limit2=iBarShift(NULL,0,t2, false); limit3=iBarShift(NULL,0,t3, false); limit4=iBarShift(NULL,0,t4, false); limit5=iBarShift(NULL,0,t5, false); up1=iHighest(NULL,0,MODE_HIGH,k,limit1); up2=iHighest(NULL,0,MODE_HIGH,k,limit2); up3=iHighest(NULL,0,MODE_HIGH,k,limit3); up4=iHighest(NULL,0,MODE_HIGH,k,limit4); up5=iHighest(NULL,0,MODE_HIGH,k,limit5); dn1=iLowest(NULL,0,MODE_LOW,k,limit1); dn2=iLowest(NULL,0,MODE_LOW,k,limit2); dn3=iLowest(NULL,0,MODE_LOW,k,limit3); dn4=iLowest(NULL,0,MODE_LOW,k,limit4); dn5=iLowest(NULL,0,MODE_LOW,k,limit5); // èùåì îïîðíûå òî÷êè if(High[up3]>High[up2] && High[up3]>High[up1] && High[up3]>=High[up4] && High[up3]>=High[up5]) { if (y==1){Large[up3]=High[up3];largelast=up3;} if (y==2){Midle[up3]=High[up3];midlelast=up3;} if (y==3){Small[up3]=High[up3];smalllast=up3;} NumberExt++; extr++; } if(Low[dn3]<Low[dn2] && Low[dn3]<Low[dn1] && Low[dn3]<=Low[dn4] && Low[dn3]<=Low[dn5]) { if (y==1){Large[dn3]=Low[dn3];largelast=dn3;} if (y==2){Midle[dn3]=Low[dn3];midlelast=dn3;} if (y==3){Small[dn3]=Low[dn3];smalllast=dn3;} NumberExt++; extr++; } if (NumberExt>VolExt) break; } } // Óäàëåíèå ëèøíèõ ýêñòðåìóìîâ äëÿ ôîðìèðîâàíèÿ ïðàâèëüíîãî çèãçàãà // èç 2-õ è áîëåå ïîäðÿä èäóùèõ ïèêîâ\äîíûøêîâ âûáèðàþòñÿ ìàêñèìàëüíûé\ìèíèìàëüíûé, // à ïðè ðàâåíñòâå - ñ íàèìåíüøèì íîìåðîì áàðà.... ëèøíèå îáíóëÿþòñÿ if (extr==0) return; for (y=1; y<=3; y++) { if (y==1) j=ArraySize(Large);if (y==2)j=ArraySize(Midle); if (y==3)j=ArraySize(Small); int min=0, max=0, extmin=0, extmax=0; NumberExt=0; for (x=1;x<=j;x++) { if (y==1) { if (Large[x] == 0.0 ) continue; if (Large[x] == High[x]) { NumberExt++; extmax++; extmin=0; if (extmax==2) { if (Large[max]>=Large[x])Large[x]=0.0; else {Large[max]=0.0;max=x;} extmax--; } else max=x; } if (Large[x] == Low[x]) { NumberExt++; extmax=0; extmin++; if (extmin==2) { if (Large[min]<=Large[x])Large[x]=0.0; else {Large[min]=0.0;min=x;} extmin--; } else min=x; } } if (y==2) { if (Midle[x] == 0.0 ) continue; if (Midle[x] == High[x]) { NumberExt++; extmax++; extmin=0; if (extmax==2) { if (Midle[max]>=Midle[x])Midle[x]=0.0; else {Midle[max]=0.0;max=x;} extmax--; // ìîæíî è ïîïðîùå, êàê âûøå, íî.... óáèðàåì ðàñõîæäåíèÿ /* if (Midle[max]>Midle[x])Midle[x]=0.0; if (Midle[max]==Midle[x]) { if (Large[x] == High[x]) {Midle[max]=0.0;max=x;} else Midle[x]=0.0; } if (Midle[max]<Midle[x]){Midle[max]=0.0;max=x;} */ } else max=x; } if (Midle[x] == Low[x]) { NumberExt++; extmax=0; extmin++; if (extmin==2) { if (Midle[min]<=Midle[x])Midle[x]=0.0; else {Midle[min]=0.0;min=x;} extmin--; // ìîæíî è ïîïðîùå, êàê âûøå, íî.... óáèðàåì ðàñõîæäåíèÿ /* if (Midle[min]<Midle[x])Midle[x]=0.0; if (Midle[min]==Midle[x]) { if (Large[x] == Low[x]) {Midle[min]=0.0;min=x;} else Midle[x]=0.0; } if (Midle[min]>Midle[x]){Midle[min]=0.0;min=x;} */ } else min=x; } } if (y==3) { if (Small[x] == 0.0 ) continue; if (Small[x] == High[x]) { NumberExt++; extmax++; extmin=0; if (extmax==2) { if (Small[max]>=Small[x])Small[x]=0.0; else {Small[max]=0.0;max=x;} extmax--; // ìîæíî è ïîïðîùå, êàê âûøå, íî.... óáèðàåì ðàñõîæäåíèÿ /* if (Small[max]>Small[x])Small[x]=0.0; if (Small[max]==Small[x]) { if (Midle[x] == High[x]) {Small[max]=0.0;max=x;} else Small[x]=0.0; } if (Small[max]<Small[x]){Small[max]=0.0;max=x;} */ } else max=x; } if (Small[x] == Low[x]) { NumberExt++; extmax=0; extmin++; if (extmin==2) { if (Small[min]<=Small[x])Small[x]=0.0; else {Small[min]=0.0;min=x;} extmin--; // ìîæíî è ïîïðîùå, êàê âûøå, íî.... óáèðàåì ðàñõîæäåíèÿ /* if (Small[min]<Small[x])Small[x]=0.0; if (Small[min]==Small[x]) { if (Midle[x] == Low[x]) {Small[min]=0.0;min=x;} else Small[x]=0.0; } if (Small[min]>Small[x]){Small[min]=0.0;max=x;} */ } else min=x; } } if (NumberExt>VolExt+5) break; } } } //--------------------------------------------------------------------
Sample
Analysis
Market Information Used:
Series array that contains open time 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_SECTION
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features: