Author: Copyright � 2011, raxxla
0 Views
0 Downloads
0 Favorites
atrrange
//+------------------------------------------------------------------+
//|                                                     AtrRange.mq5 | 
//|                                         Copyright © 2011, raxxla | 
//|                                         http://www.cmetrading.ru | 
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, raxxla"
#property link "http://www.cmetrading.ru"
//---- íîìåð âåðñèè èíäèêàòîðà
#property version   "1.00"
//---- îòðèñîâêà èíäèêàòîðà â ãëàâíîì îêíå
#property indicator_chart_window 
//---- êîëè÷åñòâî èíäèêàòîðíûõ áóôåðîâ 3
#property indicator_buffers 3 
//---- èñïîëüçîâàíî âñåãî òðè ãðàôè÷åñêèõ ïîñòðîåíèÿ
#property indicator_plots   3
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè èíäèêàòîðà 1             |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà â âèäå çíà÷êà
#property indicator_type1   DRAW_ARROW
//---- â êà÷åñòâå öâåòà çíà÷êà èíäèêàòîðà èñïîëüçîâàí Blue öâåò
#property indicator_color1 clrBlue
//---- ëèíèÿ èíäèêàòîðà - íåïðåðûâíàÿ êðèâàÿ
#property indicator_style1  STYLE_SOLID
//---- òîëùèíà çíà÷êà èíäèêàòîðà ðàâíà 3
#property indicator_width1  3
//---- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label1  "HiRange"
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè èíäèêàòîðà 2             |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà 2 â âèäå çíà÷êà
#property indicator_type2   DRAW_ARROW
//---- â êà÷åñòâå öâåòà âåðõíåãî çíà÷êà èíäèêàòîðà èñïîëüçîâàí Red öâåò
#property indicator_color2  clrRed
//---- òîëùèíà çíà÷êà èíäèêàòîðà 2 ðàâíà 3
#property indicator_width2  3
//---- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label2  "LoRange"
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè èíäèêàòîðà 3             |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà 3 â âèäå çíà÷êà
#property indicator_type3   DRAW_ARROW
//---- â êà÷åñòâå öâåòà íèæíåãî çíà÷êà èíäèêàòîðà èñïîëüçîâàí Goldw öâåò
#property indicator_color3  clrGold
//---- òîëùèíà çíà÷êà èíäèêàòîðà 3 ðàâíà 2
#property indicator_width3 3 
//---- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label3  "MultiRange"
//+----------------------------------------------+
//| Îáúÿâëåíèå êîíñòàíò                          |
//+----------------------------------------------+
#define RESET 0 // êîíñòàíòà äëÿ âîçâðàòà òåðìèíàëó êîìàíäû íà ïåðåñ÷åò èíäèêàòîðà
//+----------------------------------------------+
//| Âõîäíûå ïàðàìåòðû èíäèêàòîðà                 |
//+----------------------------------------------+
input uint  MaxRange=25;
input int   Shift=0; // Ñäâèã èíäèêàòîðà ïî ãîðèçîíòàëè â áàðàõ
//+----------------------------------------------+
//---- îáúÿâëåíèå äèíàìè÷åñêèõ ìàññèâîâ, êîòîðûå áóäóò â 
//---- äàëüíåéøåì èñïîëüçîâàíû â êà÷åñòâå èíäèêàòîðíûõ áóôåðîâ
double HiRangeBuffer[];
double LoRangeBuffer[];
double MRangeBuffer[];
//---- îáúÿâëåíèå ïåðåìåííîé äëÿ õðàíåíèÿ õåíäëà èíäèêàòîðà
int ATR_Handle[5];
//---- îáúÿâëåíèå öåëî÷èñëåííûõ ïåðåìåííûõ íà÷àëà îòñ÷åòà äàííûõ
int min_rates_total,Atr_Start,Atr_Step,MA,pt;
double ATR1[],ATR2[],ATR3[],ATR4[],ATR5[];
//+------------------------------------------------------------------+   
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit()
  {
//---- èíèöèàëèçàöèÿ ïåðåìåííûõ íà÷àëà îòñ÷åòà äàííûõ
   Atr_Start=3;
   Atr_Step=2;
   MA=14;
   pt=1;
   if(_Digits==5 || _Digits==3) pt=10;
   min_rates_total=Atr_Start+Atr_Step*5+3+MA;
//---- ïîëó÷åíèå õåíäëà èíäèêàòîðà ATR1
   ATR_Handle[0]=iATR(NULL,PERIOD_CURRENT,Atr_Start+Atr_Step*1);
   if(ATR_Handle[0]==INVALID_HANDLE)
     {
      Print(" Íå óäàëîñü ïîëó÷èòü õåíäë èíäèêàòîðà ATR1");
      return(INIT_FAILED);
     }
//---- ïîëó÷åíèå õåíäëà èíäèêàòîðà ATR2
   ATR_Handle[1]=iATR(NULL,PERIOD_CURRENT,Atr_Start+Atr_Step*2);
   if(ATR_Handle[1]==INVALID_HANDLE)
     {
      Print(" Íå óäàëîñü ïîëó÷èòü õåíäë èíäèêàòîðà ATR2");
      return(INIT_FAILED);
     }
//---- ïîëó÷åíèå õåíäëà èíäèêàòîðà ATR3
   ATR_Handle[2]=iATR(NULL,PERIOD_CURRENT,Atr_Start+Atr_Step*3);
   if(ATR_Handle[2]==INVALID_HANDLE)
     {
      Print(" Íå óäàëîñü ïîëó÷èòü õåíäë èíäèêàòîðà ATR3");
      return(INIT_FAILED);
     }
//---- ïîëó÷åíèå õåíäëà èíäèêàòîðà ATR4
   ATR_Handle[3]=iATR(NULL,PERIOD_CURRENT,Atr_Start+Atr_Step*4);
   if(ATR_Handle[3]==INVALID_HANDLE)
     {
      Print(" Íå óäàëîñü ïîëó÷èòü õåíäë èíäèêàòîðà ATR4");
      return(INIT_FAILED);
     }
//---- ïîëó÷åíèå õåíäëà èíäèêàòîðà ATR5
   ATR_Handle[4]=iATR(NULL,PERIOD_CURRENT,Atr_Start+Atr_Step*5);
   if(ATR_Handle[4]==INVALID_HANDLE)
     {
      Print(" Íå óäàëîñü ïîëó÷èòü õåíäë èíäèêàòîðà ATR5");
      return(INIT_FAILED);
     }

//----èíäåêñàöèÿ ýëåìåíòîâ â ìàññèâàõ êàê â òàéìñåðèÿõ  
   ArraySetAsSeries(ATR1,true);
   ArraySetAsSeries(ATR2,true);
   ArraySetAsSeries(ATR3,true);
   ArraySetAsSeries(ATR4,true);
   ArraySetAsSeries(ATR5,true);

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

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

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

//---- èíèöèàëèçàöèÿ ïåðåìåííîé äëÿ êîðîòêîãî èìåíè èíäèêàòîðà
   string shortname;
   StringConcatenate(shortname,"AtrRange(",MaxRange,", ",Shift,")");
//----ñîçäàíèå èìåíè äëÿ îòîáðàæåíèÿ â îòäåëüíîì ïîäîêíå è âî âñïëûâàþùåé ïîäñêàçêå
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//----îïðåäåëåíèå òî÷íîñòè îòîáðàæåíèÿ çíà÷åíèé èíäèêàòîðà
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//----çàâåðøåíèå èíèöèàëèçàöèè
   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(BarsCalculated(ATR_Handle[0])<rates_total
      || BarsCalculated(ATR_Handle[1])<rates_total
      || BarsCalculated(ATR_Handle[2])<rates_total
      || BarsCalculated(ATR_Handle[3])<rates_total
      || BarsCalculated(ATR_Handle[4])<rates_total
      || rates_total<min_rates_total)
      return(RESET);
//---- îáúÿâëåíèå ëîêàëüíûõ ïåðåìåííûõ 
   int to_copy,limit,bar;
//---- èíäåêñàöèÿ ýëåìåíòîâ â ìàññèâàõ êàê â òàéìñåðèÿõ  
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
//---- ðàñ÷åòû íåîáõîäèìîãî êîëè÷åñòâà êîïèðóåìûõ äàííûõ è ñòàðòîâîãî íîìåðà limit äëÿ öèêëà ïåðåñ÷åòà áàðîâ
   if(prev_calculated>rates_total || prev_calculated<=0)// ïðîâåðêà íà ïåðâûé ñòàðò ðàñ÷åòà èíäèêàòîðà
     {
      limit=rates_total-min_rates_total-1; // ñòàðòîâûé íîìåð äëÿ ðàñ÷åòà âñåõ áàðîâ
     }
   else
     {
      limit=rates_total-prev_calculated; // ñòàðòîâûé íîìåð äëÿ ðàñ÷åòà íîâûõ áàðîâ
     }
//---
   to_copy=limit+1;
//---- êîïèðóåì âíîâü ïîÿâèâøèåñÿ äàííûå â ìàññèâû
   if(CopyBuffer(ATR_Handle[0],0,0,to_copy+1,ATR1)<=0) return(RESET);
   if(CopyBuffer(ATR_Handle[1],0,0,to_copy,ATR2)<=0) return(RESET);
   if(CopyBuffer(ATR_Handle[2],0,0,to_copy+MA,ATR3)<=0) return(RESET);
   if(CopyBuffer(ATR_Handle[3],0,0,to_copy,ATR4)<=0) return(RESET);
   if(CopyBuffer(ATR_Handle[4],0,0,to_copy,ATR5)<=0) return(RESET);
//---- îñíîâíîé öèêë èíäèêàòîðà
   for(bar=limit; bar>=0 && !IsStopped(); bar--)
     {
      if(AtrRange(bar,MaxRange*pt,high,low))
        {
         HiRangeBuffer[bar]=high[bar]+_Point*3;
         LoRangeBuffer[bar]=low[bar]-_Point*3;
        }
      else
        {
         HiRangeBuffer[bar]=0.0;
         LoRangeBuffer[bar]=0.0;
        }
      //---
      if(AtrBreakIn(bar,high,low)) MRangeBuffer[bar]=(high[bar]+low[bar])/2;
      else MRangeBuffer[bar]=0.0;
     }
//----     
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|  AtrBreakIn()                                                    |
//+------------------------------------------------------------------+
bool AtrBreakIn(int index,const double &High[],const double &Low[])
  {
   double vlt1 = (High[index]-Low[index])/_Point+_Point;
   double vlt2 = (High[index+1]-Low[index+1])/_Point+_Point;
//----
   if((vlt1/vlt2)>1.5) return false;
//----
   double max = MathMax(ATR2[index], MathMax(ATR3[index], MathMax(ATR4[index], ATR5[index])));
   double min = MathMin(ATR2[index], MathMin(ATR3[index], MathMin(ATR4[index], ATR5[index])));
   double summ=0.0;
   for(int iii=0; iii<MA; iii++) summ+=ATR3[index+iii];
   double atrMa3=summ/MA;
//----
   if(max>atrMa3) return false;
//----
   if((max-min)/_Point>25*pt) return false;
//----
   double atr1=ATR1[index];
//----
   if(atr1<min || atr1>atrMa3) return false;
//----
   if(atr1<ATR1[index+1]) return false;
//----
   if(atr1>=ATR5[index]) return false;
//----
   return true;
  }
//+------------------------------------------------------------------+
//| AtrRange()                                                       |
//+------------------------------------------------------------------+
bool AtrRange(int index,int maxRange,const double &High[],const double &Low[])
  {
//----
   double vlt1 = (High[index]-Low[index])/_Point+_Point;
   double vlt2 = (High[index+1]-Low[index+1])/_Point+_Point;
   double vlt3 = (High[index+2]-Low[index+2])/_Point+_Point;
//---
   if(vlt1>maxRange) return false;
//---
   if((vlt3/vlt2)>1.8) return false;
//---
   if(vlt1>vlt2 || vlt2>vlt3 || vlt1>vlt3) return false;
//---
   if(High[index]-High[index+1]>_Point) return false;
//---
   if(High[index+1]-High[index+2]>_Point) return false;
//---
   if(Low[index+1]-Low[index]>_Point) return false;
//---
   if(Low[index+2]-Low[index+1]>_Point) return false;
//----
   return true;
  }
//+------------------------------------------------------------------+

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