i_MF_Fractal_ZZ_3in1

Author: Copyright � 2008, BiViSi Corp.
i_MF_Fractal_ZZ_3in1
Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
i_MF_Fractal_ZZ_3in1
//-----------------------------------------------------------------------
// 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;
         }
      }         

}
//--------------------------------------------------------------------

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---