1
Views
0
Downloads
0
Favorites
AML_StDev
//+------------------------------------------------------------------+
//| AML_StDev.mq5 |
//| Copyright © 2011, andreybs |
//| andreybs@yandex.ru |
//+------------------------------------------------------------------+
//---- àâòîðñòâî èíäèêàòîðà
#property copyright "Adaptive Market Level"
//---- àâòîðñòâî èíäèêàòîðà
#property link "andreybs@yandex.ru"
//---- íîìåð âåðñèè èíäèêàòîðà
#property version "1.11"
//---- îòðèñîâêà èíäèêàòîðà â ãëàâíîì îêíå
#property indicator_chart_window
//---- äëÿ ðàñ÷¸òà è îòðèñîâêè èíäèêàòîðà èñïîëüçîâàíî ÷åòûðå áóôåðà
#property indicator_buffers 4
//---- èñïîëüçîâàíî òðè ãðàôè÷åñêèõ ïîñòðîåíèÿ
#property indicator_plots 3
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè èíäèêàòîðà |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà â âèäå ìíîãîöâåòíîé ëèíèè
#property indicator_type1 DRAW_COLOR_LINE
//---- â êà÷åñòâå öâåòîâ òðåõöâåòíîé ëèíèè èñïîëüçîâàíû
#property indicator_color1 clrGray,clrDeepSkyBlue,clrViolet
//---- ëèíèÿ èíäèêàòîðà - íåïðåðûâíàÿ êðèâàÿ
#property indicator_style1 STYLE_SOLID
//---- òîëùèíà ëèíèè èíäèêàòîðà ðàâíà 3
#property indicator_width1 3
//---- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label1 "AML"
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè ìåäâåæüåãî èíäèêàòîðà |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà 2 â âèäå ñèìâîëà
#property indicator_type2 DRAW_ARROW
//---- â êà÷åñòâå öâåòà ìåäâåæüåãî èíäèêàòîðà èñïîëüçîâàí êðàñíûé öâåò
#property indicator_color2 clrRed
//---- òîëùèíà ëèíèè èíäèêàòîðà 2 ðàâíà 3
#property indicator_width2 3
//---- îòîáðàæåíèå ìåäâåæüåé ìåòêè èíäèêàòîðà
#property indicator_label2 "Dn_Signal"
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè áû÷üãî èíäèêàòîðà |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà 3 â âèäå ñèìâîëà
#property indicator_type3 DRAW_ARROW
//---- â êà÷åñòâå öâåòà áû÷üåãî èíäèêàòîðà èñïîëüçîâàí çåë¸íûé öâåò
#property indicator_color3 clrLime
//---- òîëùèíà ëèíèè èíäèêàòîðà 3 ðàâíà 3
#property indicator_width3 3
//---- îòîáðàæåíèå áû÷åé ìåòêè èíäèêàòîðà
#property indicator_label3 "Up_Signal"
//+----------------------------------------------+
//| ÂÕÎÄÍÛÅ ÏÀÐÀÌÅÒÐÛ ÈÍÄÈÊÀÒÎÐÀ |
//+----------------------------------------------+
input uint Fractal=6;
input int Lag=7;
input double dK=3.0; //êîýôôèöèåíò äëÿ êâàäðàòè÷íîãî ôèëüòðà
input uint std_period=9; //ïåðèîä êâàäðàòè÷íîãî ôèëüòðà
input int Shift=0; // Ñäâèã èíäèêàòîðà ïî ãîðèçîíòàëè â áàðàõ
input int PriceShift=0; // Ñäâèã èíäèêàòîðà ïî âåðòèêàëè â ïóíêòàõ
//+----------------------------------------------+
//---- îáúÿâëåíèå äèíàìè÷åñêèõ ìàññèâîâ, êîòîðûå áóäóò â
// äàëüíåéøåì èñïîëüçîâàíû â êà÷åñòâå èíäèêàòîðíûõ áóôåðîâ
double AMLBuffer[];
double ColorAMLBuffer[];
double BearsBuffer[];
double BullsBuffer[];
//----
double dAML[];
//---- Îáúÿâëåíèå ïåðåìåííîé çíà÷åíèÿ âåðòèêàëüíîãî ñäâèãà ìóâèíãà
double dPriceShift;
double LagLagPoint;
//---- Îáúÿâëåíèå öåëûõ ïåðåìåííûõ íà÷àëà îòñ÷¸òà äàííûõ
int min_rates_1,min_rates_total,size,Fractal2;
//---- îáúÿâëåíèå äèíàìè÷åñêèõ ìàññèâîâ, êîòîðûå áóäóò â
// äàëüíåéøåì èñïîëüçîâàíû â êà÷åñòâå êîëüöåâûõ áóôåðîâ
int Count[];
double Smooth[];
//+------------------------------------------------------------------+
//| Ïåðåñ÷åò ïîçèöèè ñàìîãî íîâîãî ýëåìåíòà â ìàññèâå |
//+------------------------------------------------------------------+
void Recount_ArrayZeroPos(int &CoArr[],// Âîçâðàò ïî ññûëêå íîìåðà òåêóùåãî çíà÷åíèÿ öåíîâîãî ðÿäà
int Size)
{
//----
int numb,Max1,Max2;
static int count=1;
Max2=Size;
Max1=Max2-1;
count--;
if(count<0) count=Max1;
for(int iii=0; iii<Max2; iii++)
{
numb=iii+count;
if(numb>Max1) numb-=Max2;
CoArr[iii]=numb;
}
//----
}
//+------------------------------------------------------------------+
//| ðàñ÷¸ò ìàêñèìàëüíîãî äèàïîçîíà äâèæåíèÿ öåíû |
//+------------------------------------------------------------------+
double Range(int period,int start,const double &High[],const double &Low[])
{
//----
double max = High[ArrayMaximum(High,start,period)];
double min = Low[ArrayMinimum(Low,start,period)];
//----
return(max-min);
}
//+------------------------------------------------------------------+
//| AML indicator initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//---- Èíèöèàëèçàöèÿ ïåðåìåííûõ íà÷àëà îòñ÷åòà äàííûõ
Fractal2=int(2*Fractal);
min_rates_1=int(MathMax(Fractal+Lag,Fractal2));
min_rates_total=min_rates_1+1+int(std_period);
//---- Èíèöèàëèçàöèÿ ñäâèãà ïî âåðòèêàëè
dPriceShift=_Point*PriceShift;
//---- Ðàñïðåäåëåíèå ïàìÿòè ïîä ìàññèâû ïåðåìåííûõ
ArrayResize(dAML,std_period);
//---- Èíèöèàëèçàöèÿ ïåðåìåííûõ
LagLagPoint=Lag*Lag*_Point;
size=int(Lag+1);
//---- Ðàñïðåäåëåíèå ïàìÿòè ïîä ìàññèâû ïåðåìåííûõ
ArrayResize(Count,size);
ArrayResize(Smooth,size);
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â èíäèêàòîðíûé áóôåð
SetIndexBuffer(0,AMLBuffer,INDICATOR_DATA);
//---- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðå êàê â òàéìñåðèè
ArraySetAsSeries(AMLBuffer,true);
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â öâåòîâîé, èíäåêñíûé áóôåð
SetIndexBuffer(1,ColorAMLBuffer,INDICATOR_COLOR_INDEX);
//---- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðå êàê â òàéìñåðèè
ArraySetAsSeries(ColorAMLBuffer,true);
//---- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà 1 ïî ãîðèçîíòàëè
PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷åòà îòðèñîâêè èíäèêàòîðà
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
//---- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà BearsBuffer â èíäèêàòîðíûé áóôåð
SetIndexBuffer(2,BearsBuffer,INDICATOR_DATA);
//---- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðå êàê â òàéìñåðèè
ArraySetAsSeries(BearsBuffer,true);
//---- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà 2 ïî ãîðèçîíòàëè
PlotIndexSetInteger(1,PLOT_SHIFT,Shift);
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷¸òà îòðèñîâêè èíäèêàòîðà 2
PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
//---- âûáîð ñèìâîëà äëÿ îòðèñîâêè
PlotIndexSetInteger(1,PLOT_ARROW,159);
//---- çàïðåò íà îòðèñîâêó èíäèêàòîðîì ïóñòûõ çíà÷åíèé
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà BullsBuffer â èíäèêàòîðíûé áóôåð
SetIndexBuffer(3,BullsBuffer,INDICATOR_DATA);
//---- èíäåêñàöèÿ ýëåìåíòîâ â áóôåðå êàê â òàéìñåðèè
ArraySetAsSeries(BullsBuffer,true);
//---- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà 3 ïî ãîðèçîíòàëè
PlotIndexSetInteger(2,PLOT_SHIFT,Shift);
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷¸òà îòðèñîâêè èíäèêàòîðà 3
PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total);
//---- âûáîð ñèìâîëà äëÿ îòðèñîâêè
PlotIndexSetInteger(2,PLOT_ARROW,159);
//---- çàïðåò íà îòðèñîâêó èíäèêàòîðîì ïóñòûõ çíà÷åíèé
PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0.0);
//---- èíèöèàëèçàöèè ïåðåìåííîé äëÿ êîðîòêîãî èìåíè èíäèêàòîðà
string shortname;
StringConcatenate(shortname,"AML(",Fractal,", ",Lag,", ",Shift,")");
//--- ñîçäàíèå èìåíè äëÿ îòîáðàæåíèÿ â îòäåëüíîì ïîäîêíå è âî âñïëûâàþùåé ïîäñêàçêå
IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//--- îïðåäåëåíèå òî÷íîñòè îòîáðàæåíèÿ çíà÷åíèé èíäèêàòîðà
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- çàâåðøåíèå èíèöèàëèçàöèè
}
//+------------------------------------------------------------------+
//| AML 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);
//---- Îáúÿâëåíèå ïåðåìåííûõ ñ ïëàâàþùåé òî÷êîé
double SMAdif,Sum,StDev,dstd,BEARS,BULLS,Filter;
//---- Îáúÿâëåíèå öåëûõ ïåðåìåííûõ è ïîëó÷åíèå óæå ïîñ÷èòàííûõ áàðîâ
int limit,bar;
//---- èíäåêñàöèÿ ýëåìåíòîâ â ìàññèâàõ êàê â òàéìñåðèÿõ
ArraySetAsSeries(high,true);
ArraySetAsSeries(low,true);
ArraySetAsSeries(open,true);
ArraySetAsSeries(close,true);
//---- ðàñ÷¸ò ñòàðòîâîãî íîìåðà limit äëÿ öèêëà ïåðåñ÷¸òà áàðîâ
if(prev_calculated>rates_total || prev_calculated<=0)// ïðîâåðêà íà ïåðâûé ñòàðò ðàñ÷¸òà èíäèêàòîðà
{
limit=rates_total-min_rates_1-1; // ñòàðòîâûé íîìåð äëÿ ðàñ÷¸òà âñåõ áàðîâ
bar=limit;
double price=(high[bar]+low[bar]+2*open[bar]+2*close[bar])/6;
//---- Èíèöèàëèçàöèÿ ìàññèâîâ ïåðåìåííûõ
ArrayInitialize(Smooth,price);
ArrayInitialize(Count,0.0);
AMLBuffer[bar+1]=price;
ColorAMLBuffer[bar+1]=0;
}
else limit=rates_total-prev_calculated; // ñòàðòîâûé íîìåð äëÿ ðàñ÷¸òà íîâûõ áàðîâ
//---- îñíîâíîé öèêë ðàñ÷¸òà èíäèêàòîðà
for(bar=limit; bar>=0 && !IsStopped(); bar--)
{
double R1=Range(Fractal,bar,high,low)/Fractal;
double R2=Range(Fractal,bar+Fractal,high,low)/Fractal;
double R3=Range(Fractal2,bar,high,low)/Fractal2;
double dim=0;
if(R1+R2>0 && R3>0) dim=(MathLog(R1+R2)-MathLog(R3))*1.44269504088896;
double alpha=MathExp(-Lag*(dim-1.0));
alpha=MathMin(alpha,1.0);
alpha=MathMax(alpha,0.01);
double price=(high[bar]+low[bar]+2*open[bar]+2*close[bar])/6;
Smooth[Count[0]]=alpha*price+(1.0-alpha)*Smooth[Count[1]];
if(MathAbs(Smooth[Count[0]]-Smooth[Count[Lag]])>=LagLagPoint) AMLBuffer[bar]=Smooth[Count[0]];
else AMLBuffer[bar]=AMLBuffer[bar+1];
AMLBuffer[bar]+=PriceShift;
if(bar) Recount_ArrayZeroPos(Count,size);
}
//---- êîððåêòèðîâêà çíà÷åíèÿ ïåðåìåííîé limit
if(prev_calculated>rates_total || prev_calculated<=0) // ïðîâåðêà íà ïåðâûé ñòàðò ðàñ÷åòà èíäèêàòîðà
limit=rates_total-min_rates_total-1; // ñòàðòîâûé íîìåð äëÿ ðàñ÷åòà âñåõ áàðîâ
//---- Îñíîâíîé öèêë ðàñêðàñêè ñèãíàëüíîé ëèíèè
for(bar=limit; bar>=0 && !IsStopped(); bar--)
{
ColorAMLBuffer[bar]=0;
if(AMLBuffer[bar+1]<AMLBuffer[bar]) ColorAMLBuffer[bar]=1;
if(AMLBuffer[bar+1]>AMLBuffer[bar]) ColorAMLBuffer[bar]=2;
if(AMLBuffer[bar+1]==AMLBuffer[bar]) ColorAMLBuffer[bar]=ColorAMLBuffer[bar+1];
}
//---- îñíîâíîé öèêë ðàñ÷¸òà èíäèêàòîðà ñòàíäàðòíîãî îòêëîíåíèÿ
for(bar=limit; bar>=0 && !IsStopped(); bar--)
{
//---- çàãðóæàåì ïðèðàùåíèÿ èíäèêàòîðà â ìàññèâ äëÿ ïðîìåæóòî÷íûõ âû÷èñëåíèé
for(int iii=0; iii<int(std_period); iii++) dAML[iii]=AMLBuffer[bar+iii]-AMLBuffer[bar+iii+1];
//---- íàõîäèì ïðîñòîå ñðåäíåå ïðèðàùåíèé èíäèêàòîðà
Sum=0.0;
for(int iii=0; iii<int(std_period); iii++) Sum+=dAML[iii];
SMAdif=Sum/std_period;
//---- íàõîäèì ñóììó êâàäðàòîâ ðàçíîñòåé ïðèðàùåíèé è ñðåäíåãî
Sum=0.0;
for(int iii=0; iii<int(std_period); iii++) Sum+=MathPow(dAML[iii]-SMAdif,2);
//---- îïðåäåëÿåì èòîãîâîå çíà÷åíèå ñðåäíåêâàäðàòè÷íîãî îòêëîíåíèÿ StDev îò ïðèðàùåíèÿ èíäèêàòîðà
StDev=MathSqrt(Sum/std_period);
//---- èíèöèàëèçàöèÿ ïåðåìåííûõ
dstd=NormalizeDouble(dAML[0],_Digits+2);
Filter=NormalizeDouble(dK*StDev,_Digits+2);
BEARS=0;
BULLS=0;
//---- âû÷èñëåíèå èíäèêàòîðíûõ çíà÷åíèé
if(dstd<-Filter) BEARS=AMLBuffer[bar]; //åñòü íèñõîäÿùèé òðåíä
if(dstd>+Filter) BULLS=AMLBuffer[bar]; //åñòü âîñõîäÿùèé òðåíä
//---- èíèöèàëèçàöèÿ ÿ÷ååê èíäèêàòîðíûõ áóôåðîâ ïîëó÷åííûìè çíà÷åíèÿìè
BullsBuffer[bar]=BULLS;
BearsBuffer[bar]=BEARS;
}
//----
return(rates_total);
}
//+------------------------------------------------------------------+
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
---