donchianchannels

Author: Copyright � 2005, Luis Guilherme Damiani
0 Views
0 Downloads
0 Favorites
donchianchannels
//+------------------------------------------------------------------+
//|                      Donchian Channels - Generalized version.mq4 |
//|                         Copyright © 2005, Luis Guilherme Damiani |
//|                                      http://www.damianifx.com.br |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Luis Guilherme Damiani"
#property link      "http://www.damianifx.com.br"
//---- íîìåð âåðñèè èíäèêàòîðà
#property version   "1.00"
//---- îòðèñîâêà èíäèêàòîðà â ãëàâíîì îêíå
#property indicator_chart_window 
//---- êîëè÷åñòâî èíäèêàòîðíûõ áóôåðîâ
#property indicator_buffers 3 
//---- èñïîëüçîâàíî òðè ãðàôè÷åñêèõ ïîñòðîåíèÿ
#property indicator_plots   3
//+-----------------------------------+
//| Ïàðàìåòðû îòðèñîâêè èíäèêàòîðà    |
//+-----------------------------------+
//---- îòðèñîâêà èíäèêàòîðà â âèäå ëèíèè
#property indicator_type1   DRAW_LINE
//---- â êà÷åñòâå öâåòà ëèíèè èíäèêàòîðà èñïîëüçîâàí îëèâêîâûé öâåò
#property indicator_color1 OliveDrab
//---- ëèíèÿ èíäèêàòîðà - íåïðåðûâíàÿ êðèâàÿ
#property indicator_style1  STYLE_SOLID
//---- òîëùèíà ëèíèè èíäèêàòîðà ðàâíà 1
#property indicator_width1  1
//---- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label1  "Upper Donchian"
//---- îòðèñîâêà èíäèêàòîðà â âèäå ëèíèè
#property indicator_type2   DRAW_LINE
//---- â êà÷åñòâå öâåòà ëèíèè èíäèêàòîðà èñïîëüçîâàí ñåðûé öâåò
#property indicator_color2 Gray
//---- ëèíèÿ èíäèêàòîðà - íåïðåðûâíàÿ êðèâàÿ
#property indicator_style2  STYLE_SOLID
//---- òîëùèíà ëèíèè èíäèêàòîðà ðàâíà 1
#property indicator_width2  1
//---- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label2  "Middle Donchian"
//---- îòðèñîâêà èíäèêàòîðà â âèäå ëèíèè
#property indicator_type3   DRAW_LINE
//---- â êà÷åñòâå öâåòà ëèíèè èíäèêàòîðà èñïîëüçîâàí êàêàî öâåò
#property indicator_color3 PaleVioletRed
//---- ëèíèÿ èíäèêàòîðà - íåïðåðûâíàÿ êðèâàÿ
#property indicator_style3  STYLE_SOLID
//---- òîëùèíà ëèíèè èíäèêàòîðà ðàâíà 1
#property indicator_width3  1
//---- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label3  "Lower Donchian"
//+-----------------------------------+
//| Îáúÿâëåíèå ïåðå÷èñëåíèÿ           |
//+-----------------------------------+
enum Applied_Extrem //òèï ýêñòðåìóìîâ
  {
   HIGH_LOW,
   HIGH_LOW_OPEN,
   HIGH_LOW_CLOSE,
   OPEN_HIGH_LOW,
   CLOSE_HIGH_LOW
  };
//+-----------------------------------+
//| Âõîäíûå ïàðàìåòðû èíäèêàòîðà      |
//+-----------------------------------+
input int DonchianPeriod=20; // Ïåðèîä óñðåäíåíèÿ
input Applied_Extrem Extremes=HIGH_LOW; // Òèï ýêñòðåìóìîâ
input int Margins=-2;
input int Shift=0; // Ñäâèã èíäèêàòîðà ïî ãîðèçîíòàëè â áàðàõ
//+-----------------------------------+
//---- èíäèêàòîðíûå áóôåðû
double UpperBuffer[];
double MiddleBuffer[];
double LowerBuffer[];
//+------------------------------------------------------------------+
//| Searching index of the highest bar                               |
//+------------------------------------------------------------------+
int iHighest(const double &array[],// ìàññèâ äëÿ ïîèñêà èíäåêñà ìàêñèìàëüíîãî ýëåìåíòà
             int count,            // ÷èñëî ýëåìåíòîâ ìàññèâà (â íàïðàâëåíèè îò òåêóùåãî áàðà â ñòîðîíó óáûâàíèÿ èíäåêñà), 
                                   // ñðåäè êîòîðûõ äîëæåí áûòü ïðîèçâåäåí ïîèñê
             int startPos)         // èíäåêñ (ñìåùåíèå îòíîñèòåëüíî òåêóùåãî áàðà) íà÷àëüíîãî áàðà, 
                                   // ñ êîòîðîãî íà÷èíàåòñÿ ïîèñê íàèáîëüøåãî çíà÷åíèÿ

  {
//----
   int index=startPos;
//---- ïðîâåðêà ñòàðòîâîãî èíäåêñà íà êîððåêòíîñòü
   if(startPos<0)
     {
      Print("Íåâåðíîå çíà÷åíèå â ôóíêöèè iHighest, startPos = ",startPos);
      return(0);
     }
//---- ïðîâåðêà çíà÷åíèÿ startPos íà êîððåêòíîñòü
   if(startPos-count<0)
      count=startPos;
//----
   double max=array[startPos];
//---- ïîèñê èíäåêñà
   for(int i=startPos; i>startPos-count; i--)
     {
      if(array[i]>max)
        {
         index=i;
         max=array[i];
        }
     }
//---- âîçâðàò èíäåêñà íàèáîëüøåãî áàðà
   return(index);
  }
//+------------------------------------------------------------------+
//| Searching index of the lowest bar                                |
//+------------------------------------------------------------------+
int iLowest(const double &array[],// ìàññèâ äëÿ ïîèñêà èíäåêñà ìèíèìàëüíîãî ýëåìåíòà
            int count,            // ÷èñëî ýëåìåíòîâ ìàññèâà (â íàïðàâëåíèè îò òåêóùåãî áàðà â ñòîðîíó óáûâàíèÿ èíäåêñà), 
                                  // ñðåäè êîòîðûõ äîëæåí áûòü ïðîèçâåäåí ïîèñê
            int startPos) // èíäåêñ (ñìåùåíèå îòíîñèòåëüíî òåêóùåãî áàðà) íà÷àëüíîãî áàðà, 
                          // ñ êîòîðîãî íà÷èíàåòñÿ ïîèñê íàèìåíüøåãî çíà÷åíèÿ
  {
//----
   int index=startPos;
//---- ïðîâåðêà ñòàðòîâîãî èíäåêñà íà êîððåêòíîñòü
   if(startPos<0)
     {
      Print("Íåâåðíîå çíà÷åíèå â ôóíêöèè iLowest, startPos = ",startPos);
      return(0);
     }
//---- ïðîâåðêà çíà÷åíèÿ startPos íà êîððåêòíîñòü
   if(startPos-count<0)
      count=startPos;
//----
   double min=array[startPos];
//---- ïîèñê èíäåêñà
   for(int i=startPos; i>startPos-count; i--)
     {
      if(array[i]<min)
        {
         index=i;
         min=array[i];
        }
     }
//---- âîçâðàò èíäåêñà íàèìåíüøåãî áàðà
   return(index);
  }
//+------------------------------------------------------------------+    
//| Donchian Channel indicator initialization function               | 
//+------------------------------------------------------------------+  
void OnInit()
  {
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
   SetIndexBuffer(0,UpperBuffer,INDICATOR_DATA);
//---- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà 1 ïî ãîðèçîíòàëè íà AroonShift
   PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷åòà îòðèñîâêè èíäèêàòîðà 1
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,DonchianPeriod-1);
//--- ñîçäàíèå ìåòêè äëÿ îòîáðàæåíèÿ â DataWindow
   PlotIndexSetString(0,PLOT_LABEL,"Upper Donchian");
//---- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
   SetIndexBuffer(1,MiddleBuffer,INDICATOR_DATA);
//---- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà 2 ïî ãîðèçîíòàëè
   PlotIndexSetInteger(1,PLOT_SHIFT,Shift);
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷åòà îòðèñîâêè èíäèêàòîðà 2
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,DonchianPeriod-1);
//--- ñîçäàíèå ìåòêè äëÿ îòîáðàæåíèÿ â DataWindow
   PlotIndexSetString(1,PLOT_LABEL,"Middle Donchian");
//---- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
   SetIndexBuffer(2,LowerBuffer,INDICATOR_DATA);
//---- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà 3 ïî ãîðèçîíòàëè
   PlotIndexSetInteger(2,PLOT_SHIFT,Shift);
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷åòà îòðèñîâêè èíäèêàòîðà 3
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,DonchianPeriod-1);
//--- ñîçäàíèå ìåòêè äëÿ îòîáðàæåíèÿ â DataWindow
   PlotIndexSetString(2,PLOT_LABEL,"Lower Donchian");
//---- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- èíèöèàëèçàöèÿ ïåðåìåííîé äëÿ êîðîòêîãî èìåíè èíäèêàòîðà
   string shortname;
   StringConcatenate(shortname,"Donchian( DonchianPeriod = ",DonchianPeriod,")");
//--- ñîçäàíèå èìåíè äëÿ îòîáðàæåíèÿ â îòäåëüíîì ïîäîêíå è âî âñïëûâàþùåé ïîäñêàçêå
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//--- îïðåäåëåíèå òî÷íîñòè îòîáðàæåíèÿ çíà÷åíèé èíäèêàòîðà
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//---- çàâåðøåíèå èíèöèàëèçàöèè
  }
//+------------------------------------------------------------------+  
//| Donchian Channel 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<DonchianPeriod+1) return(0);
//---- îáúÿâëåíèå ïåðåìåííûõ ñ ïëàâàþùåé òî÷êîé  
   double smin,smax,SsMax=0,SsMin=0;
//---- îáúÿâëåíèå öåëî÷èñëåííûõ ïåðåìåííûõ
   int first,bar;
//---- ðàñ÷åò ñòàðòîâîãî íîìåðà first äëÿ öèêëà ïåðåñ÷åòà áàðîâ
   if(prev_calculated==0) // ïðîâåðêà íà ïåðâûé ñòàðò ðàñ÷åòà èíäèêàòîðà
     {
      first=DonchianPeriod; // ñòàðòîâûé íîìåð äëÿ ðàñ÷åòà âñåõ áàðîâ
     }
   else
     {
      first=prev_calculated-1;// ñòàðòîâûé íîìåð äëÿ ðàñ÷åòà íîâûõ áàðîâ
     }
//---- îñíîâíîé öèêë ðàñ÷åòà êàíàëà
   for(bar=first; bar<rates_total; bar++)
     {
      switch(Extremes)
        {
         case HIGH_LOW:
            SsMax=high[iHighest(high,DonchianPeriod,bar)];
            SsMin=low[iLowest(low,DonchianPeriod,bar)];
            break;
            //----
         case HIGH_LOW_OPEN:
            SsMax=(open[iHighest(open,DonchianPeriod,bar)]+high[iHighest(high,DonchianPeriod,bar)])/2;
            SsMin=(open[iLowest(open,DonchianPeriod,bar)]+low[iLowest(high,DonchianPeriod,bar)])/2;
            break;
            //----
         case HIGH_LOW_CLOSE:
            SsMax=(close[iHighest(close,DonchianPeriod,bar)]+high[iHighest(high,DonchianPeriod,bar)])/2;
            SsMin=(close[iLowest(close,DonchianPeriod,bar)]+low[iLowest(high,DonchianPeriod,bar)])/2;
            break;
            //----
         case OPEN_HIGH_LOW:
            SsMax=open[iHighest(open,DonchianPeriod,bar)];
            SsMin=open[iLowest(open,DonchianPeriod,bar)];
            break;
            //----
         case CLOSE_HIGH_LOW:
            SsMax=close[iHighest(close,DonchianPeriod,bar)];
            SsMin=close[iLowest(close,DonchianPeriod,bar)];
            break;
        }
      //----
      smin=SsMin+(SsMax-SsMin)*Margins/100;
      smax=SsMax-(SsMax-SsMin)*Margins/100;
      UpperBuffer[bar]=smax;
      LowerBuffer[bar]=smin;
      MiddleBuffer[bar]=(smax+smin)/2.0;
     }
//----    
   return(rates_total);
  }
//+------------------------------------------------------------------+

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 ---