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 Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---