GANN_rvm_v4





//+------------------------------------------------------------------+
//|                                                  GANN_rvm_v4.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 DeepSkyBlue
#property indicator_color2 Black
#property indicator_color3 DeepSkyBlue
#property indicator_color4 Black
#property indicator_color5 Yellow
#property indicator_color6 Green
#property indicator_color7 Red
#property indicator_color8 Red
//---- input parameters
extern int       NextTF=15;
extern int       BL_Range=5;
extern int       HLN_Range=3;
extern bool      HLN_UseFullTF=false;
//---- buffers
double HLNUp_sl[];
double HLNDn_sl[];
double HLNUp[];
double HLNDn[];
double BLLev[];
double BLStep[];
double ExtMapBuffer7[];
double ExtMapBuffer8[];
//---- 
int NextTFs;
int initfl;
int Displacement;
int dig;
int ArrSize;
int ArrIdx;
int lb;
double MyArr[][10];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexStyle(4,DRAW_LINE);
   SetIndexStyle(5,DRAW_LINE);
   SetIndexStyle(6,DRAW_LINE);
   SetIndexStyle(7,DRAW_LINE);
   SetIndexBuffer(0,HLNUp_sl);
   SetIndexBuffer(1,HLNDn_sl);
   SetIndexBuffer(2,HLNUp);
   SetIndexBuffer(3,HLNDn);
   SetIndexBuffer(4,BLLev);
   SetIndexBuffer(5,BLStep);
   SetIndexBuffer(6,ExtMapBuffer7);
   SetIndexBuffer(7,ExtMapBuffer8);
   SetIndexLabel(0,"HLNextUp_sec (M"+NextTF+","+BL_Range+","+HLN_Range+","+HLN_UseFullTF+")");
   SetIndexLabel(1,"HLNextDn_sec (M"+NextTF+","+BL_Range+","+HLN_Range+","+HLN_UseFullTF+")");
   SetIndexLabel(2,"HLNextUp (M"+NextTF+","+BL_Range+","+HLN_Range+","+HLN_UseFullTF+")");
   SetIndexLabel(3,"HLNextDn (M"+NextTF+","+BL_Range+","+HLN_Range+","+HLN_UseFullTF+")");
   SetIndexLabel(4,"BalansLevel (M"+NextTF+","+BL_Range+","+HLN_Range+","+HLN_UseFullTF+")");
   SetIndexLabel(5,"BalansStep (M"+NextTF+","+BL_Range+","+HLN_Range+","+HLN_UseFullTF+")");
   SetIndexLabel(6,"1");
   SetIndexLabel(7,"2");
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   SetIndexEmptyValue(2,0.0);
   SetIndexEmptyValue(3,0.0);
   SetIndexEmptyValue(4,0.0);
   SetIndexEmptyValue(5,0.0);
   SetIndexEmptyValue(6,0.0);
   SetIndexEmptyValue(7,0.0);
//----
   NextTFs=NextTF*60;
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted();
   int cb,i,limit,index,ai;
//---- 
   if( initfl!=1 )
   {
      myInit();
      if( initfl!=1 )
      {
         Alert("Èíäèêàòîð íå èíèöèàëèçèðîâàí!");
         return(-1);
      }
   }
   index=Bars-1;
   if( counted_bars>=0 )
   {
      if( index-counted_bars<=0 )
      {
         limit=0;
      }
      else
      {
         limit=index-counted_bars;
      }
   }
   else
   {
      Alert("Ñáîé! /n counted_bars < 0");
      return(-1);
   }
   //öèêë ïî áàðàì
   for( cb=limit;cb>=0;cb-- )
   {
      ai=index-cb;
      //åñëè ýòî ïåðâûé áàð
      if( cb==Bars-1 )
      {
         if( FBar(cb)<0 )
         {
            return(-1);
         }
         continue;
      }
      else
      {
         //åñëè ýòî íîâûé áàð
         if( lb!=ai )
         {
            lb=ai;
            //åñëè îí íå ÿâëÿåòñÿ íà÷àëîì íîâîãî áàðà íà ñòàðøåì ò-ô
            if( BBarBegin(cb,NextTF)!=1 )
            {
               if( NewBar(cb)<0 )
               {
                  return(-1);
               }
            }
            else
            {
               if( NBBar(cb)<0 )
               {
                  return(-1);
               }
            }
            //îòðèñîâêà õàé ëîó àêòèâàòîð
            if( HLN_UseFullTF!=1 )
            {
               if( Close[cb]>MyArr[ArrIdx-1][8] )
               {
                  HLNUp[cb]=0;
                  HLNDn[cb]=MyArr[ArrIdx-1][9];
                  
               }
               else
               {
                  if( Close[cb]<MyArr[ArrIdx-1][9] )
                  {
                     HLNUp[cb]=MyArr[ArrIdx-1][8];
                     HLNDn[cb]=0;
                  }
                  else
                  {
                     if( HLNUp[cb+1]>0 )
                     {
                        HLNUp[cb]=MyArr[ArrIdx-1][8];
                        HLNDn[cb]=0;
                     }
                     else
                     {
                        HLNUp[cb]=0;
                        HLNDn[cb]=MyArr[ArrIdx-1][9];
                     }
                  }
               }
            }
            else
            {
               if( MyArr[ArrIdx-1][5]>MyArr[ArrIdx-2][8] )
               {
                  HLNUp[cb]=0;
                  HLNDn[cb]=MyArr[ArrIdx-1][9];
               }
               else
               {
                  if( MyArr[ArrIdx-1][5]<MyArr[ArrIdx-2][9] )
                  {
                     HLNUp[cb]=MyArr[ArrIdx-1][8];
                     HLNDn[cb]=0;
                  }
                  else
                  {
                     if( HLNUp[cb+1]>0 )
                     {
                        HLNUp[cb]=MyArr[ArrIdx-1][8];
                        HLNDn[cb]=0;
                     }
                     else
                     {
                        HLNUp[cb]=0;
                        HLNDn[cb]=MyArr[ArrIdx-1][9];
                     }
                  }
               }
            }
         }
         else
         {
            if( NewTic(cb)<0 )
            {
               return(-1);
            }
         }
      }
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+

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

//+--------------------------------------------------------------------+
//| Ôóíêöèÿ âîçâðàùàåò èñòèíó, åñëè áàð ÿâëÿåòñÿ íà÷àëîì áàðà ñòàðøåãî |
//| ò-ô                                                                |
//+--------------------------------------------------------------------+
bool BBarBegin(int bar, int TF)
  {
//---- 
   bool bbegin=0;
   if(TF!=10080)
   {
      if( MathFloor(Time[bar]/NextTFs)*NextTFs>Time[bar+1] )
      {
         bbegin=1;
      }
   }
   else
   {
      if( (MathFloor((Time[bar]+259200)/NextTFs)*NextTFs-259200)>Time[bar+1] )
      {
         bbegin=1;
      }
   }
//----
   return(bbegin);
  }
//+--------------------------------------------------------------------+

//+------------------------------------------------------------------+
// Ôóíêöèÿ íà÷àëüíîé èíèöèàëèçàöèè èíäèêàòîðà                        |
//+------------------------------------------------------------------+
void myInit()
  {
  int ArrSize,Displacement,arcount,i,BR;
//---- 
   //îïðåäåëÿåì êîëè÷åñòâî áàðîâ ìëàäøåãî ò-ô ñîäåðæàùèõñÿ â áàðå ñòàðøåãî ò-ô
   if( NextTF<10080)
   {
      Displacement=NextTF/Period();
   }
   else
   {
      if( NextTF==10080 )
      {
         Displacement=7200/Period();
      }
      else
      {
         if( NextTF==43200 )
         {
            Displacement=31680/Period();
         }
      }
   }
//---------
   SetIndexShift(0,Displacement);
   SetIndexShift(1,Displacement);
   SetIndexShift(4,Displacement);
   SetIndexShift(5,Displacement);
   SetIndexDrawBegin(0,Displacement*HLN_Range);
   SetIndexDrawBegin(1,Displacement*HLN_Range);
   SetIndexDrawBegin(2,Displacement*HLN_Range);
   SetIndexDrawBegin(3,Displacement*HLN_Range);
   SetIndexDrawBegin(4,0);
   SetIndexDrawBegin(5,Displacement*BL_Range);
//---------
   //åñëè íåâåðíî óêàçàíû ïàðàìåòðû BL_Range,HLN_Range
   if( BL_Range<1 || HLN_Range<1 )
   {
      Alert("Íåâåðíî óêàçàíû ïàðàìåòðû èíèêàòîðà!");
      return(-1);
   }
   BR=MathMax(BL_Range,HLN_Range);
   //åñëè íà ãðàôèêå íåäîñòàòî÷íî äàííûõ
   if( Bars<BR*Displacement )
   {
      Alert("Íà ãðàôèêå íåäîñòàòî÷íî äàííûõ");
      return(-1);
   }
   //åñëè íåâåðíî óêàçàí ïàðàìåòð NextTF
   if( NextTF<=Period() )
   {
      Alert("Íåâåðíî óêàçàí ïàðàìåòð NextTF !/n Çíà÷åíèå äîëæíî áûòü áîëüøå /n òåêóùåãî ò-ô â ìèíóòàõ");
      return(-1);
   }
   //êîëè÷åñòâî çíàêîâ äî êîòîðûõ áóäóò îêðóãëÿòüñÿ ðàñ÷åòû
   dig=Digits;
   //îïðåäåëÿåì íåîáõîäèìûé ðàçìåð ìàññèâà è åãî ïîñëåäíèé èíäåêñ
   ArrSize=BR;
   ArrIdx=BR-1;
   //100 ïîïûòîê íà èçìåíåíèå ðàçìåðà ìàññèâà
   for( i=0;i<100;i++)
   {
      arcount=ArrayResize(MyArr,ArrSize);
      if( arcount>0 )
      {
         break;
      }
   }
   //100 ïîïûòîê íà èíèöèàëèçàöèþ ìàññèâà
   for( i=0;i<100;i++)
   {
      arcount=0;
      arcount=ArrayInitialize(MyArr,0.0);
      if( arcount>0 )
      {
         break;
      }
   }
   initfl=1;
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Ôóíêöèÿ îòðàáàòûâàþùàÿ íà êàæäûé òèê åñëè ýòî íå íîâûé áàð       |
//+------------------------------------------------------------------+
int NewTic( int Bar )
  {
//---- 
   int i;
   double sH,sL,sBL;
   if( High[Bar]>MyArr[ArrIdx][3] ) MyArr[ArrIdx][3]=High[Bar];
   if( Low[Bar] <MyArr[ArrIdx][4] ) MyArr[ArrIdx][4]=Low[Bar];
   MyArr[ArrIdx][5]=Close[Bar];
   MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig);
   //öèêë ïî ìàññèâó
   for( i=ArrIdx;i>=ArrIdx+1-BL_Range;i-- )
   {
      sBL+=MyArr[i][6];
   }
   MyArr[ArrIdx][7]=NormalizeDouble(sBL/BL_Range,dig);
   for( i=ArrIdx;i>=ArrIdx+1-HLN_Range;i-- )
   {
      sH+=MyArr[i][3];
      sL+=MyArr[i][4];
   }
   MyArr[ArrIdx][8]=NormalizeDouble(sH/HLN_Range,dig);
   MyArr[ArrIdx][9]=NormalizeDouble(sL/HLN_Range,dig);
   //îòðèñîâûâàåì íà ãðàôèêå
   for( i=Bars-1-MyArr[ArrIdx][0];i>=Bars-1-MyArr[ArrIdx][1];i-- )
   {
      BLLev[i]=MyArr[ArrIdx][6];
      BLStep[i]=MyArr[ArrIdx][7];
      HLNUp_sl[i]=MyArr[ArrIdx][8];
      HLNDn_sl[i]=MyArr[ArrIdx][9];
   }
   if( MyArr[ArrIdx][2]<=0 || MyArr[ArrIdx][3]<=0 || MyArr[ArrIdx][4]<=0 || MyArr[ArrIdx][5]<=0 || MyArr[ArrIdx][6]<=0 || BLLev[Bar]<=0 )
   {
      Alert("Ñáîé ðàñ÷åòà èíäèêàòîðà íà íîâîì òèêå!");
      return(-1);
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Ôóíêöèÿ îòðàáàòûâàþùàÿ íà ïåðâûé áàð íà ãðàôèêå                  |
//+------------------------------------------------------------------+
int FBar( int Bar )
  {
//---- 
   //íà÷èíàåì çàïèñûâàòü â ìàññèâ
   MyArr[ArrIdx][0]=Bars-1-Bar;
   MyArr[ArrIdx][1]=Bars-1-Bar;
   MyArr[ArrIdx][2]=Open[Bar];
   MyArr[ArrIdx][3]=High[Bar];
   MyArr[ArrIdx][4]=Low[Bar];
   MyArr[ArrIdx][5]=Close[Bar];
   MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig);
   BLLev[Bar]=MyArr[ArrIdx][6];
   if( MyArr[ArrIdx][2]<=0 || MyArr[ArrIdx][3]<=0 || MyArr[ArrIdx][4]<=0 || MyArr[ArrIdx][5]<=0 || MyArr[ArrIdx][6]<=0 || BLLev[Bar]<=0 )
   {
      Alert("Îøèáêà ïðîñ÷åòà 1 áàðà!");
      return(-1);
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Ôóíêöèÿ îòðàáàòûâàþùàÿ ïðè ïîÿâëåíèè íîâîãî áàðà 1 ðàç           |
//+------------------------------------------------------------------+
int NewBar( int Bar )
  {
//---- 
   int i;
   double sH,sL,sBL;
   MyArr[ArrIdx][1]=Bars-1-Bar;
   if( High[Bar]>MyArr[ArrIdx][3] ) MyArr[ArrIdx][3]=High[Bar];
   if( Low[Bar] <MyArr[ArrIdx][4] ) MyArr[ArrIdx][4]=Low[Bar];
   MyArr[ArrIdx][5]=Close[Bar];
   MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig);
   //öèêë ïî ìàññèâó
   for( i=ArrIdx;i>=ArrIdx+1-BL_Range;i-- )
   {
      sBL+=MyArr[i][6];
   }
   MyArr[ArrIdx][7]=NormalizeDouble(sBL/BL_Range,dig);
   for( i=ArrIdx;i>=ArrIdx+1-HLN_Range;i-- )
   {
      sH+=MyArr[i][3];
      sL+=MyArr[i][4];
   }
   MyArr[ArrIdx][8]=NormalizeDouble(sH/HLN_Range,dig);
   MyArr[ArrIdx][9]=NormalizeDouble(sL/HLN_Range,dig);
   //îòðèñîâûâàåì íà ãðàôèêå
   for( i=Bars-1-MyArr[ArrIdx][0];i>=Bars-1-MyArr[ArrIdx][1];i-- )
   {
      BLLev[i]=MyArr[ArrIdx][6];
      BLStep[i]=MyArr[ArrIdx][7];
      HLNUp_sl[i]=MyArr[ArrIdx][8];
      HLNDn_sl[i]=MyArr[ArrIdx][9];
   }
   if( MyArr[ArrIdx][2]<=0 || MyArr[ArrIdx][3]<=0 || MyArr[ArrIdx][4]<=0 || MyArr[ArrIdx][5]<=0 || MyArr[ArrIdx][6]<=0 || BLLev[Bar]<=0 )
   {
      Alert("Îøèáêà ïðîñ÷åòà íîâîãî áàðà!");
      return(-1);
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Ôóíêöèÿ îòðàáàòûâàþùàÿ ïðè ïîÿâëåíèè íîâîãî áàðà ñòàðøåãî ò-ô    |
//+------------------------------------------------------------------+
int NBBar( int Bar )
  {
//---- 
   int i;
   double sH,sL,sBL;
   //ñäèã ïî ñòåêó â ìàññèâå
   for( i=0;i<ArrIdx;i++)
   {
      MyArr[i][0]=MyArr[i+1][0];
      MyArr[i][1]=MyArr[i+1][1];
      MyArr[i][2]=MyArr[i+1][2];
      MyArr[i][3]=MyArr[i+1][3];
      MyArr[i][4]=MyArr[i+1][4];
      MyArr[i][5]=MyArr[i+1][5];
      MyArr[i][6]=MyArr[i+1][6];
      MyArr[i][7]=MyArr[i+1][7];
      MyArr[i][8]=MyArr[i+1][8];
      MyArr[i][9]=MyArr[i+1][9];
   }
   MyArr[ArrIdx][0]=Bars-1-Bar;
   MyArr[ArrIdx][1]=Bars-1-Bar;
   MyArr[ArrIdx][2]=Open[Bar];
   MyArr[ArrIdx][3]=High[Bar];
   MyArr[ArrIdx][4]=Low[Bar];
   MyArr[ArrIdx][5]=Close[Bar];
   MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig);
   //öèêë ïî ìàññèâó
   for( i=ArrIdx;i>=ArrIdx+1-BL_Range;i-- )
   {
      sBL+=MyArr[i][6];
   }
   MyArr[ArrIdx][7]=NormalizeDouble(sBL/BL_Range,dig);
   for( i=ArrIdx;i>=ArrIdx+1-HLN_Range;i-- )
   {
      sH+=MyArr[i][3];
      sL+=MyArr[i][4];
   }
   MyArr[ArrIdx][8]=NormalizeDouble(sH/HLN_Range,dig);
   MyArr[ArrIdx][9]=NormalizeDouble(sL/HLN_Range,dig);
   //îòðèñîâûâàåì íà ãðàôèêå
   BLLev[Bar]=MyArr[ArrIdx][6];
   BLStep[Bar]=MyArr[ArrIdx][7];
   HLNUp_sl[Bar]=MyArr[ArrIdx][8];
   HLNDn_sl[Bar]=MyArr[ArrIdx][9];
   if( MyArr[ArrIdx][2]<=0 || MyArr[ArrIdx][3]<=0 || MyArr[ArrIdx][4]<=0 || MyArr[ArrIdx][5]<=0 || MyArr[ArrIdx][6]<=0 || BLLev[Bar]<=0 )
   {
      Alert("Îøèáêà ïðîñ÷åòà íîâîãî áàðà ñòàðøåãî ò-ô!");
      return(-1);
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+





Sample





Analysis



Market Information Used:

Series array that contains close prices for each bar
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
Series array that contains open prices of each bar


Indicator Curves created:

Implements a curve of type DRAW_LINE


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features:

It issuies visual alerts to the screen