gannswingsviii

Author: Copyright � 2005, Rosh
0 Views
0 Downloads
0 Favorites
gannswingsviii
//+------------------------------------------------------------------+
//|                                              GannSwingsVIII.mq5  |
//|                                          Copyright © 2005, Rosh  |
//|                                       http://www.metaquotes.net  |
//+------------------------------------------------------------------+
//--- àâòîðñòâî èíäèêàòîðà
#property copyright "Copyright © 2005, Rosh"
//--- ññûëêà íà ñàéò àâòîðà
#property link "http://www.metaquotes.net"
//--- íîìåð âåðñèè èíäèêàòîðà
#property version   "1.10"
//--- îòðèñîâêà èíäèêàòîðà â îñíîâíîì îêíå
#property indicator_chart_window
//--- äëÿ ðàñ÷åòà è îòðèñîâêè èíäèêàòîðà èñïîëüçîâàíî øåñòü áóôåðîâ
#property indicator_buffers 6
//--- èñïîëüçîâàíî ïÿòü ãðàôè÷åñêèõ ïîñòðîåíèé
#property indicator_plots   5
//+-----------------------------------------------+
//|  Ïàðàìåòðû îòðèñîâêè èíäèêàòîðà çèãçàãà       |
//+-----------------------------------------------+
//--- îòðèñîâêà èíäèêàòîðà â âèäå ñåêöèè
#property indicator_type1   DRAW_SECTION
//--- â êà÷åñòâå öâåòà ëèíèè èíäèêàòîðà èñïîëüçîâàí Gold öâåò
#property indicator_color1 clrGold
//--- ëèíèÿ èíäèêàòîðà - íåïðåðûâíàÿ êðèâàÿ
#property indicator_style1  STYLE_SOLID
//--- òîëùèíà ëèíèè èíäèêàòîðà ðàâíà 2
#property indicator_width1  2
//--- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label1  "BinaryWave"
//+----------------------------------------------+
//|  Ïàðàìåòðû îòðèñîâêè áû÷üåãî èíäèêàòîðà      |
//+----------------------------------------------+
//--- îòðèñîâêà èíäèêàòîðà 2 â âèäå çíà÷êà
#property indicator_type2   DRAW_ARROW
//--- â êà÷åñòâå öâåòà ëèíèè èíäèêàòîðà èñïîëüçîâàí Blue öâåò
#property indicator_color2  clrBlue
//--- ëèíèÿ èíäèêàòîðà 2 - øòðèõ-ïóíêòèð
#property indicator_style2  STYLE_DASHDOTDOT
//--- òîëùèíà ëèíèè èíäèêàòîðà 2 ðàâíà 2
#property indicator_width2  2
//--- îòîáðàæåíèå ìåòêè ëèíèè èíäèêàòîðà
#property indicator_label2  "Upper"
//+----------------------------------------------+
//|  Ïàðàìåòðû îòðèñîâêè ìåäâåæüåãî èíäèêàòîðà   |
//+----------------------------------------------+
//--- îòðèñîâêà èíäèêàòîðà 3 â âèäå çíà÷êà
#property indicator_type3   DRAW_ARROW
//--- â êà÷åñòâå öâåòà ëèíèè èíäèêàòîðà èñïîëüçîâàí öâåò MediumVioletRed
#property indicator_color3  clrMediumVioletRed
//--- ëèíèÿ èíäèêàòîðà 3 - øòðèõ-ïóíêòèð
#property indicator_style3  STYLE_DASHDOTDOT
//--- òîëùèíà ëèíèè èíäèêàòîðà 3 ðàâíà 2
#property indicator_width3  2
//--- îòîáðàæåíèå ìåòêè ëèíèè èíäèêàòîðà
#property indicator_label3  "Lower"
//+----------------------------------------------+
//|  Ïàðàìåòðû îòðèñîâêè áû÷üåãî èíäèêàòîðà      |
//+----------------------------------------------+
//--- îòðèñîâêà èíäèêàòîðà 4 â âèäå çíà÷êà
#property indicator_type4   DRAW_ARROW
//--- â êà÷åñòâå öâåòà èíäèêàòîðà èñïîëüçîâàí öâåò DeepSkyBlue
#property indicator_color4  clrDeepSkyBlue
//--- òîëùèíà èíäèêàòîðà 4 ðàâíà 1
#property indicator_width4  1
//--- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label4  "Buy"
//+----------------------------------------------+
//|  Ïàðàìåòðû îòðèñîâêè ìåäâåæüåãî èíäèêàòîðà   |
//+----------------------------------------------+
//--- îòðèñîâêà èíäèêàòîðà 5 â âèäå çíà÷êà
#property indicator_type5   DRAW_ARROW
//--- â êà÷åñòâå öâåòà èíäèêàòîðà èñïîëüçîâàí öâåò Magenta
#property indicator_color5  clrMagenta
//--- òîëùèíà èíäèêàòîðà 5 ðàâíà 1
#property indicator_width5  1
//--- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label5  "Sell"
//+----------------------------------------------+
//|  îáúÿâëåíèå ïåðå÷èñëåíèé                     |
//+----------------------------------------------+
enum Type
  {
   LITTLE=1,   // ìàëàÿ
   MIDLE,      // ïðîìåæóòî÷íàÿ
   MAIN        // îñíîâíàÿ
  };
//+----------------------------------------------+
//| Âõîäíûå ïàðàìåòðû èíäèêàòîðà                 |
//+----------------------------------------------+
input Type  kind=LITTLE;            // Òèï òåíäåíöèè
input bool  MoveLastSwing=false;    // Ñäâèã õâîñòà çèãçàãà ê íóëåâîìó áàðó äëÿ äâóõ îäèíàêîâûõ áàðîâ ïî High èëè Low
input int   Shift=0;                // Ñäâèã èíäèêàòîðà ïî ãîðèçîíòàëè â áàðàõ
//+----------------------------------------------+
//--- îáúÿâëåíèå äèíàìè÷åñêèõ ìàññèâîâ, êîòîðûå â äàëüíåéøåì
//--- áóäóò èñïîëüçîâàíû â êà÷åñòâå èíäèêàòîðíûõ áóôåðîâ
double SwingsBuffer[];
double HighsBuffer[];
double LowsBuffer[];
double TrendBuffer[];
double UpCloseOutSideBuffers[];
double DownCloseOutSideBuffers[];
//---
double SwingHigh,SwingLow;
int LastSwing,lowCounter,highCounter;
//--- îáúÿâëåíèå öåëî÷èñëåííûõ ïåðåìåííûõ íà÷àëà îòñ÷åòà äàííûõ
int min_rates_total;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+  
int OnInit()
  {
//--- èíèöèàëèçàöèÿ ïåðåìåííûõ íà÷àëà îòñ÷åòà äàííûõ
   min_rates_total=2;

//--- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
   SetIndexBuffer(0,SwingsBuffer,INDICATOR_DATA);
//--- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà ïî ãîðèçîíòàëè íà Shift
   PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
//--- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷åòà îòðèñîâêè èíäèêàòîðà
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
//--- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðàõ, êàê â òàéìñåðèÿõ   
   ArraySetAsSeries(SwingsBuffer,true);
//--- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);

//--- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
   SetIndexBuffer(1,HighsBuffer,INDICATOR_DATA);
//--- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà ïî ãîðèçîíòàëè íà Shift
   PlotIndexSetInteger(1,PLOT_SHIFT,Shift);
//--- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷åòà îòðèñîâêè èíäèêàòîðà
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
//--- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðàõ, êàê â òàéìñåðèÿõ   
   ArraySetAsSeries(HighsBuffer,true);
//--- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
//--- ñèìâîë äëÿ èíäèêàòîðà
   PlotIndexSetInteger(1,PLOT_ARROW,159);

//--- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
   SetIndexBuffer(2,LowsBuffer,INDICATOR_DATA);
//--- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà ïî ãîðèçîíòàëè íà Shift
   PlotIndexSetInteger(2,PLOT_SHIFT,Shift);
//--- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷åòà îòðèñîâêè èíäèêàòîðà
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total);
//--- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðàõ, êàê â òàéìñåðèÿõ   
   ArraySetAsSeries(LowsBuffer,true);
//--- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
//--- ñèìâîë äëÿ èíäèêàòîðà
   PlotIndexSetInteger(2,PLOT_ARROW,159);

//--- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
   SetIndexBuffer(3,UpCloseOutSideBuffers,INDICATOR_DATA);
//--- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà ïî ãîðèçîíòàëè íà Shift
   PlotIndexSetInteger(3,PLOT_SHIFT,Shift);
//--- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷åòà îòðèñîâêè èíäèêàòîðà
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,min_rates_total);
//--- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðàõ, êàê â òàéìñåðèÿõ   
   ArraySetAsSeries(UpCloseOutSideBuffers,true);
//--- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
   PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,0);
//--- ñèìâîë äëÿ èíäèêàòîðà
   PlotIndexSetInteger(3,PLOT_ARROW,108);

//--- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
   SetIndexBuffer(4,DownCloseOutSideBuffers,INDICATOR_DATA);
//--- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà ïî ãîðèçîíòàëè íà Shift
   PlotIndexSetInteger(4,PLOT_SHIFT,Shift);
//--- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷åòà îòðèñîâêè èíäèêàòîðà
   PlotIndexSetInteger(4,PLOT_DRAW_BEGIN,min_rates_total);
//--- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðàõ, êàê â òàéìñåðèÿõ   
   ArraySetAsSeries(DownCloseOutSideBuffers,true);
//--- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
   PlotIndexSetDouble(4,PLOT_EMPTY_VALUE,0);
//--- ñèìâîë äëÿ èíäèêàòîðà
   PlotIndexSetInteger(4,PLOT_ARROW,108);

//--- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â áóôåð äëÿ õðàíåíèÿ äàííûõ
   SetIndexBuffer(5,TrendBuffer,INDICATOR_CALCULATIONS);
//--- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðàõ, êàê â òàéìñåðèÿõ   
   ArraySetAsSeries(TrendBuffer,true);

//--- ñîçäàíèå èìåíè äëÿ îòîáðàæåíèÿ â îòäåëüíîì ïîäîêíå è âî âñïëûâàþùåé ïîäñêàçêå
   IndicatorSetString(INDICATOR_SHORTNAME,"GannSwingsVIII");
//--- îïðåäåëåíèå òî÷íîñòè îòîáðàæåíèÿ çíà÷åíèé èíäèêàòîðà
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- çàâåðøåíèå èíèöèàëèçàöèè
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,    // êîëè÷åñòâî èñòîðèè â áàðàõ íà òåêóùåì òèêå
                const int prev_calculated,// êîëè÷åñòâî èñòîðèè â áàðàõ íà ïðåäûäóùåì òèêå
                const datetime &Time[],
                const double &Open[],
                const double& High[],     // öåíîâîé ìàññèâ ìàêñèìóìîâ öåíû äëÿ ðàñ÷åòà èíäèêàòîðà
                const double& Low[],      // öåíîâîé ìàññèâ ìèíèìóìîâ öåíû  äëÿ ðàñ÷åòà èíäèêàòîðà
                const double &Close[],
                const long &Tick_Volume[],
                const long &Volume[],
                const int &Spread[])
  {
//--- ïðîâåðêà êîëè÷åñòâà áàðîâ íà äîñòàòî÷íîñòü äëÿ ðàñ÷åòà
   if(rates_total<min_rates_total) return(0);
//--- îáúÿâëåíèÿ ëîêàëüíûõ ïåðåìåííûõ 
   int limit,bar,maxbar;
   bool nonOutSide;
//--- èíäåêñàöèÿ ýëåìåíòîâ â ìàññèâàõ, êàê â òàéìñåðèÿõ  
   ArraySetAsSeries(Close,true);
   ArraySetAsSeries(Open,true);
   ArraySetAsSeries(High,true);
   ArraySetAsSeries(Low,true);
//---
   maxbar=rates_total-min_rates_total-1;
//--- ðàñ÷åò ñòàðòîâîãî íîìåðà limit äëÿ öèêëà ïåðåñ÷åòà áàðîâ
   if(prev_calculated>rates_total || prev_calculated<=0) // ïðîâåðêà íà ïåðâûé ñòàðò ðàñ÷åòà èíäèêàòîðà
     {
      limit=maxbar;
      lowCounter=0;
      highCounter=0;                                  // ñòàðòîâûé íîìåð äëÿ ðàñ÷åòà âñåõ áàðîâ
      LowsBuffer[limit]=Low[limit];
      SwingsBuffer[limit]=High[limit];
      SwingsBuffer[limit]=Low[limit];
      SwingHigh=High[limit];
      SwingLow=Low[limit];
      LastSwing=0;
      TrendBuffer[limit+1]=-1.0;
      TrendBuffer[limit]=-1.0;
     }
   else
     {
      limit=maxbar;
      lowCounter=0;
      highCounter=0;                                  // ñòàðòîâûé íîìåð äëÿ ðàñ÷åòà âñåõ áàðîâ
      LowsBuffer[limit]=Low[limit];
      SwingsBuffer[limit]=High[limit];
      SwingsBuffer[limit]=Low[limit];
      SwingHigh=High[limit];
      SwingLow=Low[limit];
      LastSwing=0;
      TrendBuffer[limit+1]=-1.0;
      TrendBuffer[limit]=-1.0;
     }
//--- âîññòàíàâëèâàåì çíà÷åíèÿ ïåðåìåííûõ
   LastSwing+=limit;
//--- îñíîâíîé öèêë ðàñ÷åòà èíäèêàòîðà
   for(bar=limit; bar>=0 && !IsStopped(); bar--)
     {
      if(bar!=maxbar)
        {
         UpCloseOutSideBuffers[bar]=0.0;
         DownCloseOutSideBuffers[bar]=0.0;
         SwingsBuffer[bar]=0.0;
         HighsBuffer[bar]=0.0;
         LowsBuffer[bar]=0.0;
        }
      //---
      nonOutSide=!((High[bar]>High[bar+1]) && (Low[bar]<Low[bar+1]));
      if(!nonOutSide)
        {
         if(Close[bar]>Open[bar]) UpCloseOutSideBuffers[bar]=(High[bar]+Low[bar])/2.0;
         else DownCloseOutSideBuffers[bar]=(High[bar]+Low[bar])/2.0;
        }
      //---
      if(High[bar]>SwingHigh)
        {
         highCounter++;
         SwingHigh=High[bar];
         HighsBuffer[bar]=SwingHigh;
        }
      //---
      if(Low[bar]<SwingLow)
        {
         lowCounter++;
         SwingLow=Low[bar];
         LowsBuffer[bar]=SwingLow;
        }
      //---
      TrendBuffer[bar]=TrendBuffer[bar+1];// åñëè íå áóäóò èçìåíåíèé - òðåíä ñîõðàíèòñÿ
      if(TrendBuffer[bar+1]==-1.0 && lowCounter==1)// && nonOutSide) 
        {
         if(LastSwing!=maxbar) SwingsBuffer[LastSwing]=0.0; // çàòðåì ïðåäûäóùèé ñâèíã
         LastSwing=bar;
         SwingHigh=High[bar];
         SwingLow=Low[bar];
         highCounter=0;
         lowCounter=0;
         SwingsBuffer[bar]=Low[bar];
         HighsBuffer[bar]=SwingHigh;
        }
      else
        {
         if(TrendBuffer[bar+1]==-1.0 && highCounter==kind)
           {
            LastSwing=bar;
            SwingHigh=High[bar];
            SwingLow=Low[bar];
            TrendBuffer[bar]=+1.0;
            highCounter=0;
            lowCounter=0;
            SwingsBuffer[bar]=High[bar];
            LowsBuffer[bar]=SwingLow;
           }
         else
           {
            if(TrendBuffer[bar+1]==-1.0 && Low[bar]==SwingLow && MoveLastSwing)
              {
               SwingsBuffer[LastSwing]=0.0;
               LastSwing=bar;
               SwingsBuffer[bar]=Low[bar];
              }
           }
        }
      if(TrendBuffer[bar+1]==+1.0 && highCounter==1)// && nonOutSide) 
        {
         if(LastSwing!=maxbar) SwingsBuffer[LastSwing]=0.0; // çàòðåì ïðåäûäóùèé ñâèíã
         LastSwing=bar;
         SwingHigh=High[bar];
         SwingLow=Low[bar];
         highCounter=0;
         lowCounter=0;
         SwingsBuffer[bar]=High[bar];
         LowsBuffer[bar]=SwingLow;
         // ïðîäîëæåíèå àïòðåíäà
        }
      else
        {
         if(TrendBuffer[bar+1]==+1.0 && lowCounter==kind)
           {
            LastSwing=bar;
            SwingHigh=High[bar];
            SwingLow=Low[bar];
            TrendBuffer[bar]=-1.0;
            highCounter=0;
            lowCounter=0;
            SwingsBuffer[bar]=Low[bar];
            HighsBuffer[bar]=SwingHigh;
            // ðàçâîðîò àïòðåíäà
           }
         else
           {
            if(TrendBuffer[bar+1]==1.0 && High[bar]==SwingHigh && MoveLastSwing)
              {
               SwingsBuffer[LastSwing]=0.0;
               LastSwing=bar;
               SwingsBuffer[bar]=High[bar];
              }
           }
        }
     }
//---     
   return(rates_total);
  }
//+------------------------------------------------------------------+

Comments