2
Views
0
Downloads
0
Favorites
JMA_StDev
//+------------------------------------------------------------------+
//| JMA_StDev.mq5 |
//| MQL5 code: Copyright © 2015, Nikolay Kositsin |
//| Khabarovsk, farria@mail.redcom.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, Nikolay Kositsin"
#property link "farria@mail.redcom.ru"
//---- íîìåð âåðñèè èíäèêàòîðà
#property version "1.02"
//---- îòðèñîâêà èíäèêàòîðà â ãëàâíîì îêíå
#property indicator_chart_window
//---- äëÿ ðàñ÷¸òà è îòðèñîâêè èíäèêàòîðà èñïîëüçîâàíî øåñòü áóôåðîâ
#property indicator_buffers 6
//---- èñïîëüçîâàíî âñåãî ïÿòü ãðàôè÷åñêèõ ïîñòðîåíèé
#property indicator_plots 5
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè ëèíèè èíäèêàòîðà |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà â âèäå ëèíèè
#property indicator_type1 DRAW_COLOR_LINE
//---- â êà÷åñòâå öâåòîâ òð¸õöâåòíîé ëèíèè èñïîëüçîâàíû
#property indicator_color1 clrMagenta,clrGray,clrBlue
//---- ëèíèÿ èíäèêàòîðà - íåïðåðûâíàÿ êðèâàÿ
#property indicator_style1 STYLE_SOLID
//---- òîëùèíà ëèíèè èíäèêàòîðà ðàâíà 2
#property indicator_width1 2
//---- îòîáðàæåíèå ìåòêè èíäèêàòîðà
#property indicator_label1 "JMA"
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè ìåäâåæüåãî èíäèêàòîðà |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà 2 â âèäå ñèìâîëà
#property indicator_type2 DRAW_ARROW
//---- â êà÷åñòâå öâåòà ìåäâåæüåãî èíäèêàòîðà èñïîëüçîâàí êðàñíûé öâåò
#property indicator_color2 clrRed
//---- òîëùèíà ëèíèè èíäèêàòîðà 2 ðàâíà 2
#property indicator_width2 2
//---- îòîáðàæåíèå ìåäâåæüåé ìåòêè èíäèêàòîðà
#property indicator_label2 "Dn_Signal 1"
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè áû÷üãî èíäèêàòîðà |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà 3 â âèäå ñèìâîëà
#property indicator_type3 DRAW_ARROW
//---- â êà÷åñòâå öâåòà áû÷üåãî èíäèêàòîðà èñïîëüçîâàí àêâàìàðèíîâûé öâåò
#property indicator_color3 clrAqua
//---- òîëùèíà ëèíèè èíäèêàòîðà 3 ðàâíà 2
#property indicator_width3 2
//---- îòîáðàæåíèå áû÷åé ìåòêè èíäèêàòîðà
#property indicator_label3 "Up_Signal 1"
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè ìåäâåæüåãî èíäèêàòîðà |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà 4 â âèäå ñèìâîëà
#property indicator_type4 DRAW_ARROW
//---- â êà÷åñòâå öâåòà ìåäâåæüåãî èíäèêàòîðà èñïîëüçîâàí êðàñíûé öâåò
#property indicator_color4 clrRed
//---- òîëùèíà ëèíèè èíäèêàòîðà 4 ðàâíà 4
#property indicator_width4 4
//---- îòîáðàæåíèå ìåäâåæüåé ìåòêè èíäèêàòîðà
#property indicator_label4 "Dn_Signal 2"
//+----------------------------------------------+
//| Ïàðàìåòðû îòðèñîâêè áû÷üãî èíäèêàòîðà |
//+----------------------------------------------+
//---- îòðèñîâêà èíäèêàòîðà 5 â âèäå ñèìâîëà
#property indicator_type5 DRAW_ARROW
//---- â êà÷åñòâå öâåòà áû÷üåãî èíäèêàòîðà èñïîëüçîâàí àêâàìàðèíîâûé öâåò
#property indicator_color5 clrAqua
//---- òîëùèíà ëèíèè èíäèêàòîðà 5 ðàâíà 4
#property indicator_width5 4
//---- îòîáðàæåíèå áû÷åé ìåòêè èíäèêàòîðà
#property indicator_label5 "Up_Signal 2"
//+----------------------------------------------+
//| îáúÿâëåíèå ïåðå÷èñëåíèé |
//+----------------------------------------------+
enum ENUM_APPLIED_PRICE_ //Òèï êîíñòàíòû
{
PRICE_CLOSE_ = 1, //PRICE_CLOSE
PRICE_OPEN_, //PRICE_OPEN
PRICE_HIGH_, //PRICE_HIGH
PRICE_LOW_, //PRICE_LOW
PRICE_MEDIAN_, //PRICE_MEDIAN
PRICE_TYPICAL_, //PRICE_TYPICAL
PRICE_WEIGHTED_, //PRICE_WEIGHTED
PRICE_SIMPL_, //PRICE_SIMPL_
PRICE_QUARTER_, //PRICE_QUARTER_
PRICE_TRENDFOLLOW0_, //PRICE_TRENDFOLLOW0_
PRICE_TRENDFOLLOW1_, // TrendFollow_2 Price
PRICE_DEMARK_ // Demark Price
};
//+----------------------------------------------+
//| ÂÕÎÄÍÛÅ ÏÀÐÀÌÅÒÐÛ ÈÍÄÈÊÀÒÎÐÀ |
//+----------------------------------------------+
input int Length_=7; // ãëóáèíà ñãëàæèâàíèÿ
input int Phase_=100; // ïàðàìåòð ñãëàæèâàíèÿ,
//---- èçìåíÿþùèéñÿ â ïðåäåëàõ -100 ... +100,
//---- âëèÿåò íà êà÷åñòâî ïåðåõîäíîãî ïðîöåññà;
input ENUM_APPLIED_PRICE_ IPC=PRICE_CLOSE_; // öåíîâàÿ êîíñòàíòà
input double dK1=1.5; // êîýôôèöèåíò 1 äëÿ êâàäðàòè÷íîãî ôèëüòðà
input double dK2=2.5; // êîýôôèöèåíò 2 äëÿ êâàäðàòè÷íîãî ôèëüòðà
input uint std_period=9; // ïåðèîä êâàäðàòè÷íîãî ôèëüòðà
input int Shift=0; // ñäâèã èíäèêàòîðà ïî ãîðèçîíòàëè â áàðàõ
input int PriceShift=0; // cäâèã èíäèêàòîðà ïî âåðòèêàëè â ïóíêòàõ
//+----------------------------------------------+
//---- îáúÿâëåíèå äèíàìè÷åñêèõ ìàññèâîâ, êîòîðûå áóäóò â
// äàëüíåéøåì èñïîëüçîâàíû â êà÷åñòâå èíäèêàòîðíûõ áóôåðîâ
double ExtLineBuffer[],ColorExtLineBuffer[];
double BearsBuffer1[],BullsBuffer1[];
double BearsBuffer2[],BullsBuffer2[];
//---- Îáúÿâëåíèå ãëîáàëüíûõ ïåðåìåííûõ
double dPriceShift,dJMA[];
int min_rates_total;
//----
bool m_start;
//----
double m_array[62];
//----
double m_degree,m_Phase,m_sense;
double m_Krx,m_Kfd,m_Krj,m_Kct;
double m_var1,m_var2;
//----
int m_pos2,m_pos1;
int m_Loop1,m_Loop2;
int m_midd1,m_midd2;
int m_count1,m_count2,m_count3;
//----
double m_ser1,m_ser2;
double m_Sum1,m_Sum2,m_JMA;
double m_storage1,m_storage2,m_djma;
double m_hoop1[128],m_hoop2[11],m_data[128];
//---- Ïåðåìåííûå äëÿ âîññòàíîâëåíèÿ ðàñ÷¸òîâ íà íåçàêðûòîì áàðå
int m_pos2_,m_pos1_;
int m_Loop1_,m_Loop2_;
int m_midd1_,m_midd2_;
int m_count1_,m_count2_,m_count3_;
//----
double m_ser1_,m_ser2_;
double m_Sum1_,m_Sum2_,m_JMA_;
double m_storage1_,m_storage2_,m_djma_;
double m_hoop1_[128],m_hoop2_[11],m_data_[128];
//----
bool m_bhoop1[128],m_bhoop2[11],m_bdata[128];
//+------------------------------------------------------------------+
//| JMA indicator initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//---- èíèöèàëèçàöèÿ ãëîáàëüíûõ ïåðåìåííûõ
min_rates_total=30+1+int(std_period);
//---- Ðàñïðåäåëåíèå ïàìÿòè ïîä ìàññèâû ïåðåìåííûõ
ArrayResize(dJMA,std_period);
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà ExtLineBuffer â èíäèêàòîðíûé áóôåð
SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA);
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷¸òà îòðèñîâêè èíäèêàòîðà
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
//--- çàïðåò íà îòðèñîâêó èíäèêàòîðîì ïóñòûõ çíà÷åíèé
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà 2 ïî ãîðèçîíòàëè
PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â öâåòîâîé, èíäåêñíûé áóôåð
SetIndexBuffer(1,ColorExtLineBuffer,INDICATOR_COLOR_INDEX);
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà BearsBuffer â èíäèêàòîðíûé áóôåð
SetIndexBuffer(2,BearsBuffer1,INDICATOR_DATA);
//---- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà 2 ïî ãîðèçîíòàëè
PlotIndexSetInteger(1,PLOT_SHIFT,Shift);
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷¸òà îòðèñîâêè èíäèêàòîðà
PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
//---- âûáîð ñèìâîëà äëÿ îòðèñîâêè
PlotIndexSetInteger(1,PLOT_ARROW,159);
//---- çàïðåò íà îòðèñîâêó èíäèêàòîðîì ïóñòûõ çíà÷åíèé
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà BullsBuffer â èíäèêàòîðíûé áóôåð
SetIndexBuffer(3,BullsBuffer1,INDICATOR_DATA);
//---- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà 3 ïî ãîðèçîíòàëè
PlotIndexSetInteger(2,PLOT_SHIFT,Shift);
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷¸òà îòðèñîâêè èíäèêàòîðà
PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total);
//---- âûáîð ñèìâîëà äëÿ îòðèñîâêè
PlotIndexSetInteger(2,PLOT_ARROW,159);
//---- çàïðåò íà îòðèñîâêó èíäèêàòîðîì ïóñòûõ çíà÷åíèé
PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà BearsBuffer â èíäèêàòîðíûé áóôåð
SetIndexBuffer(4,BearsBuffer2,INDICATOR_DATA);
//---- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà 2 ïî ãîðèçîíòàëè
PlotIndexSetInteger(3,PLOT_SHIFT,Shift);
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷¸òà îòðèñîâêè èíäèêàòîðà
PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,min_rates_total);
//---- âûáîð ñèìâîëà äëÿ îòðèñîâêè
PlotIndexSetInteger(3,PLOT_ARROW,159);
//---- çàïðåò íà îòðèñîâêó èíäèêàòîðîì ïóñòûõ çíà÷åíèé
PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà BullsBuffer â èíäèêàòîðíûé áóôåð
SetIndexBuffer(5,BullsBuffer2,INDICATOR_DATA);
//---- îñóùåñòâëåíèå ñäâèãà èíäèêàòîðà 3 ïî ãîðèçîíòàëè
PlotIndexSetInteger(4,PLOT_SHIFT,Shift);
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷¸òà îòðèñîâêè èíäèêàòîðà
PlotIndexSetInteger(4,PLOT_DRAW_BEGIN,min_rates_total);
//---- âûáîð ñèìâîëà äëÿ îòðèñîâêè
PlotIndexSetInteger(4,PLOT_ARROW,159);
//---- çàïðåò íà îòðèñîâêó èíäèêàòîðîì ïóñòûõ çíà÷åíèé
PlotIndexSetDouble(4,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- èíèöèàëèçàöèè ïåðåìåííîé äëÿ êîðîòêîãî èìåíè èíäèêàòîðà
string shortname;
StringConcatenate(shortname,"JMA( Length = ",Length_,", Phase = ",Phase_,")");
//--- ñîçäàíèå èìåíè äëÿ îòîáðàæåíèÿ â îòäåëüíîì ïîäîêíå è âî âñïëûâàþùåé ïîäñêàçêå
IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//--- îïðåäåëåíèå òî÷íîñòè îòîáðàæåíèÿ çíà÷åíèé èíäèêàòîðà
IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//---- Èíèöèàëèçàöèÿ ñäâèãà ïî âåðòèêàëè
dPriceShift=_Point*PriceShift;
//---- çàâåðøåíèå èíèöèàëèçàöèè
}
//+------------------------------------------------------------------+
//| JMA 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 posA,posB,back,first,bar;
int shift2,shift1,numb;
//----
double Res,ResPow;
double dser3,dser4,jjma,series;
double ratio,Extr,ser0,resalt;
double newvel,dSupr,Pow1,hoop1,SmVel;
double Pow2,Pow2x2,Suprem1,Suprem2;
double dser1,dser2,extent=0,factor;
if(prev_calculated>rates_total || prev_calculated<=0) // ïðîâåðêà íà ïåðâûé ñòàðò ðàñ÷¸òà èíäèêàòîðà
{
first=0; // ñòàðòîâûé íîìåð äëÿ ðàñ÷¸òà âñåõ áàðîâ
//---- Èíèöèàëèçàöèÿ êîýôôèöèåíòîâ
JJMAInit(Phase_,Length_,PriceSeries(IPC,0,open,low,high,close));
}
else first=prev_calculated-1; // ñòàðòîâûé íîìåð äëÿ ðàñ÷¸òà íîâûõ áàðîâ
//---- îñíîâíîé öèêë ðàñ÷¸òà èíäèêàòîðà
for(bar=first; bar<rates_total; bar++)
{
//---- Îáðàùåíèå ê ôóíêöèè PriceSeries äëÿ ïîëó÷åíèÿ âõîäíîé öåíû Series
series=PriceSeries(IPC,bar,open,low,high,close);
//----
if(m_Loop1<61)
{
m_Loop1++;
m_array[m_Loop1]=series;
}
//-x-x-x-x-x-x-x-+ <<< Ðàñ÷¸ò ôóíêöèè JMASeries() >>>
if(m_Loop1>30)
{
if(!m_start)
{
m_start= true;
shift1 = 1;
back=29;
//----
m_ser2 = m_array[1];
m_ser1 = m_ser2;
}
else back=0;
//-S-S-S-S-+
for(int rrr=back; rrr>=0; rrr--)
{
if(rrr==0)
ser0=series;
else ser0=m_array[31-rrr];
//----
dser1 = ser0 - m_ser1;
dser2 = ser0 - m_ser2;
//----
if(MathAbs(dser1)>MathAbs(dser2))
m_var2=MathAbs(dser1);
else m_var2=MathAbs(dser2);
//----
Res=m_var2;
newvel=Res+0.0000000001;
if(m_count1<=1)
m_count1=127;
else m_count1--;
//----
if(m_count2<=1)
m_count2=10;
else m_count2--;
//----
if(m_count3<128) m_count3++;
//----
m_Sum1+=newvel-m_hoop2[m_count2];
//----
m_hoop2[m_count2]=newvel;
m_bhoop2[m_count2]=true;
//----
if(m_count3>10)
SmVel=m_Sum1/10.0;
else SmVel=m_Sum1/m_count3;
//----
if(m_count3>127)
{
hoop1=m_hoop1[m_count1];
m_hoop1[m_count1]=SmVel;
m_bhoop1[m_count1]=true;
numb = 64;
posB = numb;
//----
while(numb>1)
{
if(m_data[posB]<hoop1)
{
numb /= 2.0;
posB += numb;
}
else
if(m_data[posB]<=hoop1) numb=1;
else
{
numb /= 2.0;
posB -= numb;
}
}
}
else
{
m_hoop1[m_count1]=SmVel;
m_bhoop1[m_count1]=true;
//----
if(m_midd1+m_midd2>127)
{
m_midd2--;
posB=m_midd2;
}
else
{
m_midd1++;
posB=m_midd1;
}
//----
if(m_midd1>96)
m_pos2=96;
else m_pos2=m_midd1;
//----
if(m_midd2<32)
m_pos1=32;
else m_pos1=m_midd2;
}
//----
numb = 64;
posA = numb;
//----
while(numb>1)
{
if(m_data[posA]>=SmVel)
{
if(m_data[posA-1]<=SmVel) numb=1;
else
{
numb /= 2.0;
posA -= numb;
}
}
else
{
numb /= 2.0;
posA += numb;
}
//----
if(posA==127)
if(SmVel>m_data[127]) posA=128;
}
//----
if(m_count3>127)
{
if(posB>=posA)
{
if(m_pos2+1>posA)
if(m_pos1-1<posA) m_Sum2+=SmVel;
//----
else if(m_pos1+0>posA)
if(m_pos1-1<posB)
m_Sum2+=m_data[m_pos1-1];
}
else
if(m_pos1>=posA)
{
if(m_pos2+1<posA)
if(m_pos2+1>posB)
m_Sum2+=m_data[m_pos2+1];
}
else if(m_pos2+2>posA) m_Sum2+=SmVel;
//----
else if(m_pos2+1<posA)
if(m_pos2+1>posB)
m_Sum2+=m_data[m_pos2+1];
//----
if(posB>posA)
{
if(m_pos1-1<posB)
if(m_pos2+1>posB)
m_Sum2-=m_data[posB];
//----
else if(m_pos2<posB)
if(m_pos2+1>posA)
m_Sum2-=m_data[m_pos2];
}
else
{
if(m_pos2+1>posB && m_pos1-1<posB)
m_Sum2-=m_data[posB];
//----
else if(m_pos1+0>posB)
if(m_pos1-0<posA)
m_Sum2-=m_data[m_pos1];
}
}
//----
if(posB<=posA)
{
if(posB==posA)
{
m_data[posA]=SmVel;
m_bdata[posA]=true;
}
else
{
for(numb=posB+1; numb<=posA-1; numb++)
{
m_data[numb-1]=m_data[numb];
m_bdata[numb-1]=true;
}
//----
m_data[posA-1]=SmVel;
m_bdata[posA-1]=true;
}
}
else
{
for(numb=posB-1; numb>=posA; numb--)
{
m_data[numb+1]=m_data[numb];
m_bdata[numb+1]=true;
}
//----
m_data[posA]=SmVel;
m_bdata[posA]=true;
}
//----
if(m_count3<=127)
{
m_Sum2=0;
for(numb=m_pos1; numb<=m_pos2; numb++)
m_Sum2+=m_data[numb];
}
//----
resalt=m_Sum2/(m_pos2-m_pos1+1.0);
//----
if(m_Loop2>30)
m_Loop2=31;
else m_Loop2++;
//----
if(m_Loop2<=30)
{
if(dser1>0.0)
m_ser1=ser0;
else m_ser1=ser0-dser1*m_Kct;
//----
if(dser2<0.0)
m_ser2=ser0;
else m_ser2=ser0-dser2*m_Kct;
//----
m_JMA=series;
//----
if(m_Loop2!=30) continue;
else
{
m_storage1=series;
if(MathCeil(m_Krx)>=1)
dSupr=MathCeil(m_Krx);
else dSupr=1.0;
//----
if(dSupr>0) Suprem2=MathFloor(dSupr);
else
{
if(dSupr<0)
Suprem2=MathCeil(dSupr);
else Suprem2=0.0;
}
//----
if(MathFloor(m_Krx)>=1)
m_var2=MathFloor(m_Krx);
else m_var2=1.0;
//----
if(m_var2>0) Suprem1=MathFloor(m_var2);
else
{
if(m_var2<0)
Suprem1=MathCeil(m_var2);
else Suprem1=0.0;
}
//----
if(Suprem2==Suprem1) factor=1.0;
else
{
dSupr=Suprem2-Suprem1;
factor=(m_Krx-Suprem1)/dSupr;
}
//----
if(Suprem1<=29)
shift1=(int)Suprem1;
else shift1=29;
//----
if(Suprem2<=29)
shift2=(int)Suprem2;
else shift2=29;
dser3 = series - m_array[m_Loop1 - shift1];
dser4 = series - m_array[m_Loop1 - shift2];
//----
m_djma=dser3 *(1.0-factor)/Suprem1+dser4*factor/Suprem2;
}
}
else
{
ResPow=MathPow(Res/resalt,m_degree);
//----
if(m_Kfd>=ResPow)
m_var1= ResPow;
else m_var1=m_Kfd;
//----
if(m_var1<1.0)m_var2=1.0;
else
{
if(m_Kfd>=ResPow)
m_sense=ResPow;
else m_sense=m_Kfd;
m_var2=m_sense;
}
//----
extent=m_var2;
Pow1=MathPow(m_Kct,MathSqrt(extent));
//----
if(dser1>0.0)
m_ser1=ser0;
else m_ser1=ser0-dser1*Pow1;
//----
if(dser2<0.0)
m_ser2=ser0;
else m_ser2=ser0-dser2*Pow1;
}
}
//----
if(m_Loop2>30)
{
Pow2=MathPow(m_Krj,extent);
//----
m_storage1 *= Pow2;
m_storage1 += (1.0 - Pow2) * series;
m_storage2 *= m_Krj;
m_storage2 += (series - m_storage1) * (1.0 - m_Krj);
//----
Extr=m_Phase*m_storage2+m_storage1;
//----
Pow2x2= Pow2 * Pow2;
ratio = Pow2x2-2.0 * Pow2+1.0;
m_djma *= Pow2x2;
m_djma += (Extr - m_JMA) * ratio;
//----
m_JMA+=m_djma;
}
}
//-x-x-x-x-x-x-x-+
if(m_Loop1<=30) continue;
jjma=m_JMA;
//---- Âîññòàíîâëåíèå çíà÷åíèé ïåðåìåííûõ
if(bar==rates_total-1)
{
//---- Âîññòàíîâëåíèå èçìåí¸ííûõ ÿ÷ååê ìàññèâîâ èç ïÿìÿòè
for(numb = 0; numb < 128; numb++) if(m_bhoop1[numb]) m_hoop1[numb] = m_hoop1_[numb];
for(numb = 0; numb < 11; numb++) if(m_bhoop2[numb]) m_hoop2[numb] = m_hoop2_[numb];
for(numb = 0; numb < 128; numb++) if(m_bdata [numb]) m_data [numb] = m_data_ [numb];
//---- Îáíóëåíèå íîìåðîâ èçìåí¸ííûõ ÿ÷ååê ìàññèâîâ
ArrayInitialize(m_bhoop1,false);
ArrayInitialize(m_bhoop2,false);
ArrayInitialize(m_bdata,false);
//---- çàïèñü çíà÷åíèé ïåðåìåííûõ èç ïÿìÿòè
m_JMA=m_JMA_;
m_djma = m_djma_;
m_ser1 = m_ser1_;
m_ser2 = m_ser2_;
m_Sum2 = m_Sum2_;
m_pos1 = m_pos1_;
m_pos2 = m_pos2_;
m_Sum1 = m_Sum1_;
m_Loop1 = m_Loop1_;
m_Loop2 = m_Loop2_;
m_count1 = m_count1_;
m_count2 = m_count2_;
m_count3 = m_count3_;
m_storage1 = m_storage1_;
m_storage2 = m_storage2_;
m_midd1 = m_midd1_;
m_midd2 = m_midd2_;
}
//---- Ñîõðàíåíèå çíà÷åíèé ïåðåìåííûõ
if(bar==rates_total-2)
{
//---- çàïèñü èçìåí¸ííûõ ÿ÷ååê ìàññèâîâ â ïÿìÿòü
for(numb = 0; numb < 128; numb++) if(m_bhoop1[numb]) m_hoop1_[numb] = m_hoop1[numb];
for(numb = 0; numb < 11; numb++) if(m_bhoop2[numb]) m_hoop2_[numb] = m_hoop2[numb];
for(numb = 0; numb < 128; numb++) if(m_bdata [numb]) m_data_ [numb] = m_data [numb];
//---- Îáíóëåíèå íîìåðîâ èçìåí¸ííûõ ÿ÷ååê ìàññèâîâ
ArrayInitialize(m_bhoop1,false);
ArrayInitialize(m_bhoop2,false);
ArrayInitialize(m_bdata,false);
//---- çàïèñü çíà÷åíèé ïåðåìåííûõ â ïÿìÿòü
m_JMA_=m_JMA;
m_djma_ = m_djma;
m_Sum2_ = m_Sum2;
m_ser1_ = m_ser1;
m_ser2_ = m_ser2;
m_pos1_ = m_pos1;
m_pos2_ = m_pos2;
m_Sum1_ = m_Sum1;
m_Loop1_ = m_Loop1;
m_Loop2_ = m_Loop2;
m_count1_ = m_count1;
m_count2_ = m_count2;
m_count3_ = m_count3;
m_storage1_ = m_storage1;
m_storage2_ = m_storage2;
m_midd1_ = m_midd1;
m_midd2_ = m_midd2;
}
//----
ExtLineBuffer[bar]=jjma+dPriceShift;
}
//---- ïåðåñ÷¸ò ñòàðòîâîãî íîìåðà first äëÿ öèêëà ïåðåñ÷¸òà áàðîâ
if(prev_calculated>rates_total || prev_calculated<=0) // ïðîâåðêà íà ïåðâûé ñòàðò ðàñ÷¸òà èíäèêàòîðà
first++;
//---- Îñíîâíîé öèêë ðàñêðàñêè ñèãíàëüíîé ëèíèè
for(bar=first; bar<rates_total && !IsStopped(); bar++)
{
int clr=1;
if(ExtLineBuffer[bar-1]<ExtLineBuffer[bar]) clr=2;
if(ExtLineBuffer[bar-1]>ExtLineBuffer[bar]) clr=0;
ColorExtLineBuffer[bar]=clr;
}
double SMAdif,Sum,StDev,dstd,BEARS1,BULLS1,BEARS2,BULLS2,Filter1,Filter2,jma;
//---- ïåðåñ÷¸ò ñòàðòîâîãî íîìåðà first äëÿ öèêëà ïåðåñ÷¸òà áàðîâ
if(prev_calculated>rates_total || prev_calculated<=0) // ïðîâåðêà íà ïåðâûé ñòàðò ðàñ÷¸òà èíäèêàòîðà
first=min_rates_total;
//---- îñíîâíîé öèêë ðàñ÷¸òà èíäèêàòîðà ñòàíäàðòíûõ îòêëîíåíèé
for(bar=first; bar<rates_total && !IsStopped(); bar++)
{
//---- çàãðóæàåì ïðèðàùåíèÿ èíäèêàòîðà â ìàññèâ äëÿ ïðîìåæóòî÷íûõ âû÷èñëåíèé
for(int iii=0; iii<int(std_period); iii++) dJMA[iii]=ExtLineBuffer[bar-iii]-ExtLineBuffer[bar-iii-1];
//---- íàõîäèì ïðîñòîå ñðåäíåå ïðèðàùåíèé èíäèêàòîðà
Sum=0.0;
for(int iii=0; iii<int(std_period); iii++) Sum+=dJMA[iii];
SMAdif=Sum/std_period;
//---- íàõîäèì ñóììó êâàäðàòîâ ðàçíîñòåé ïðèðàùåíèé è ñðåäíåãî
Sum=0.0;
for(int iii=0; iii<int(std_period); iii++) Sum+=MathPow(dJMA[iii]-SMAdif,2);
//---- îïðåäåëÿåì èòîãîâîå çíà÷åíèå ñðåäíåêâàäðàòè÷íîãî îòêëîíåíèÿ StDev îò ïðèðàùåíèÿ èíäèêàòîðà
StDev=MathSqrt(Sum/std_period);
//---- èíèöèàëèçàöèÿ ïåðåìåííûõ
dstd=NormalizeDouble(dJMA[0],_Digits+2);
Filter1=NormalizeDouble(dK1*StDev,_Digits+2);
Filter2=NormalizeDouble(dK2*StDev,_Digits+2);
BEARS1=EMPTY_VALUE;
BULLS1=EMPTY_VALUE;
BEARS2=EMPTY_VALUE;
BULLS2=EMPTY_VALUE;
jma=ExtLineBuffer[bar];
//---- âû÷èñëåíèå èíäèêàòîðíûõ çíà÷åíèé
if(dstd<-Filter1 && dstd>=-Filter2) BEARS1=jma; //åñòü íèñõîäÿùèé òðåíä
if(dstd<-Filter2) BEARS2=jma; //åñòü íèñõîäÿùèé òðåíä
if(dstd>+Filter1 && dstd<=+Filter2) BULLS1=jma; //åñòü âîñõîäÿùèé òðåíä
if(dstd>+Filter2) BULLS2=jma; //åñòü âîñõîäÿùèé òðåíä
//---- èíèöèàëèçàöèÿ ÿ÷ååê èíäèêàòîðíûõ áóôåðîâ ïîëó÷åííûìè çíà÷åíèÿìè
BullsBuffer1[bar]=BULLS1;
BearsBuffer1[bar]=BEARS1;
BullsBuffer2[bar]=BULLS2;
BearsBuffer2[bar]=BEARS2;
}
//----
return(rates_total);
}
//+------------------------------------------------------------------+
//| Èíèöèàëèçàöèÿ ïåðåìåííûõ àëãîðèòìà JMA |
//+------------------------------------------------------------------+
void JJMAInit(double Phase,double Length,double series)
// JMAInit(Phase, Length, series)
//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
{
//----
//---- <<< Ðàñ÷¸ò êîýôôèöèåíòîâ >>>
m_midd1 = 63;
m_midd2 = 64;
m_start = false;
//----
for(int numb = 0; numb <= m_midd1; numb++) m_data[numb] = -1000000.0;
for(int numb = m_midd2; numb <= 127; numb++) m_data[numb] = +1000000.0;
//---- Âñå ÿ÷åéêè ìàññèâîâ äîëæíû áûòü ïåðåïèñàíû
ArrayInitialize(m_bhoop1,true);
ArrayInitialize(m_bhoop2,true);
ArrayInitialize(m_bdata,true);
//---- Óäàëåíèå ìóñîðà èç ìàññèâîâ ïðè ïîâòîðíûõ èíèöèàëèçàöèÿõ
ArrayInitialize(m_hoop1_, 0.0);
ArrayInitialize(m_hoop2_, 0.0);
ArrayInitialize(m_hoop1, 0.0);
ArrayInitialize(m_hoop2, 0.0);
ArrayInitialize(m_array, 0.0);
//----
m_djma = 0.0;
m_Sum1 = 0.0;
m_Sum2 = 0.0;
m_ser1 = 0.0;
m_ser2 = 0.0;
m_pos1 = 0.0;
m_pos2 = 0.0;
m_Loop1 = 0.0;
m_Loop2 = 0.0;
m_count1 = 0.0;
m_count2 = 0.0;
m_count3 = 0.0;
m_storage1 = 0.0;
m_storage2 = 0.0;
m_JMA=series;
if(Phase>=-100 && Phase<=100)
m_Phase=Phase/100.0+1.5;
//----
if(Phase > +100) m_Phase = 2.5;
if(Phase < -100) m_Phase = 0.5;
//----
double velA,velB,velC,velD;
//----
if(Length>=1.0000000002)
velA=(Length-1.0)/2.0;
else velA=0.0000000001;
//----
velA *= 0.9;
m_Krj = velA / (velA + 2.0);
velC = MathSqrt(velA);
velD = MathLog(velC);
m_var1= velD;
m_var2= m_var1;
//----
velB=MathLog(2.0);
m_sense=(m_var2/velB)+2.0;
if(m_sense<0.0) m_sense=0.0;
m_Kfd=m_sense;
//----
if(m_Kfd>=2.5)
m_degree=m_Kfd-2.0;
else m_degree=0.5;
//----
m_Krx = velC * m_Kfd;
m_Kct = m_Krx / (m_Krx + 1.0);
//----
}
//+------------------------------------------------------------------+
//| Ïîëó÷åíèå çíà÷åíèÿ öåíîâîé òàéìñåðèè |
//+------------------------------------------------------------------+
double PriceSeries
(
uint applied_price,// Öåíîâàÿ êîíñòàíòà
uint bar,// Èíäåêñ ñäâèãà îòíîñèòåëüíî òåêóùåãî áàðà íà óêàçàííîå êîëè÷åñòâî ïåðèîäîâ íàçàä èëè âïåð¸ä).
const double &Open[],
const double &Low[],
const double &High[],
const double &Close[]
)
//PriceSeries(applied_price, bar, open, low, high, close)
//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
{
//----
switch(applied_price)
{
//---- Öåíîâûå êîíñòàíòû èç ïåðå÷èñëåíèÿ ENUM_APPLIED_PRICE
case PRICE_CLOSE: return(Close[bar]);
case PRICE_OPEN: return(Open [bar]);
case PRICE_HIGH: return(High [bar]);
case PRICE_LOW: return(Low[bar]);
case PRICE_MEDIAN: return((High[bar]+Low[bar])/2.0);
case PRICE_TYPICAL: return((Close[bar]+High[bar]+Low[bar])/3.0);
case PRICE_WEIGHTED: return((2*Close[bar]+High[bar]+Low[bar])/4.0);
//----
case 8: return((Open[bar] + Close[bar])/2.0);
case 9: return((Open[bar] + Close[bar] + High[bar] + Low[bar])/4.0);
//----
case 10:
{
if(Close[bar]>Open[bar])return(High[bar]);
else
{
if(Close[bar]<Open[bar])
return(Low[bar]);
else return(Close[bar]);
}
}
//----
case 11:
{
if(Close[bar]>Open[bar])return((High[bar]+Close[bar])/2.0);
else
{
if(Close[bar]<Open[bar])
return((Low[bar]+Close[bar])/2.0);
else return(Close[bar]);
}
break;
}
//----
case 12:
{
double res=High[bar]+Low[bar]+Close[bar];
if(Close[bar]<Open[bar]) res=(res+Low[bar])/2;
if(Close[bar]>Open[bar]) res=(res+High[bar])/2;
if(Close[bar]==Open[bar]) res=(res+Close[bar])/2;
return(((res-Low[bar])+(res-High[bar]))/2);
}
//----
default: return(Close[bar]);
}
//----
//return(0);
}
//+------------------------------------------------------------------+
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
---