Indicators Used
Miscellaneous
0
Views
0
Downloads
0
Favorites
gnorm
/*
iCustom(NULL,0,"~norm",Source,SourcePeriod,Window,Sens,Power,Smooth,Signal,Fade, N,i);
ãäå N:
0 - ðåç-ò íîðìèðîâàíèÿ
1 - ñãëàæèâàíèå çàòóõàíèÿ
2 - ñãëàæèâàíèå ôðîíòà
3 - áóôåð èñòî÷íèêà âîëàòèëüíîñòè // íå âûâîäèòñÿ
4 - ñûðîå íîðìèðîâàíèå // íå âûâîäèòñÿ
*/
#property indicator_separate_window // â îêíå èíäèêàòîðà
#property indicator_buffers 5
#property indicator_color1 Green // ðåçóëüòàò íîðìèðîâàíèÿ
#property indicator_color2 Red // ñãëàæåííîå çàòóõàíèå
#property indicator_color3 Red // ñãëàæåííûé ôðîíò
#property indicator_maximum 1
#property indicator_minimum 0
// âõîäíûå ïàðàìåòðû
extern int Source=2; // 0- îáúåì, 1- ATR, 2- ñò.äåâ., 3- Close
extern int SourcePeriod=5; // ïåðèîä èñòî÷íèêà; <0 EMA, >0 SMA
double kSp; // êîýôô.EMA äëÿ SourcePeriod
bool bSp;
extern int Window=5; // îêíî íîðìèðîâàíèÿ â áàðàõ
extern double Sens=0; // ïîðîã ÷óâñòâòèòåëüíîñòè â ïï.èëè òèêàõ (îáúåì)
double sens; // ïîðîã ÷óâñòâòèòåëüíîñòè â öåíàõ èëè òèêàõ (îáúåì)
extern double Power=1; // ñòåïåíü äëÿ ïåðåäàòî÷íîé ôóíêöèè
extern int Smooth=1; // ñãëàæèâàíèå íîðìèðîâàíèÿ; <0 EMA, >0 SMA
double kSm; // êîýôô.EMA äëÿ Smooth
bool bSl;
extern int Signal=1; // ñèãíàëüíàÿ; <0 EMA, >0 SMA
double kSg; // êîýôô.EMA äëÿ Signal
bool bSg;
extern int Fade=1; // çàòóõàíèå ñèãíàëüíîé
double kFd; // êîýôô.EMA äëÿ Fade
int History=0; // 0- âñå áàðû
// ìàññèâû èíä.áóôåðîâ
double
NRM[], // ðåç-ò íîðìèðîâàíèÿ
NEG[], // ñãëàæèâàíèå çàòóõàíèÿ
POS[], // ñãëàæèâàíèå ôðîíòà
SRC[], // áóôåð èñòî÷íèêà âîëàòèëüíîñòè // íå âûâîäèòñÿ
NR0[]; // ñûðîå íîðìèðîâàíèå // íå âûâîäèòñÿ
// îáùèå (ãëîáàëüíûå) ïåðåìåííûå
bool first=1; // ôëàã ïåðâîãî çàïóñêà
// èíèöèàëèçàöèÿ
int init()
{
first=1; // ôëàã ïåðâîãî çàïóñêà
if(Source>0) sens=Sens*Point; // ïðèâåäåíèå ïîðîãà ê öåíàì äëÿ öåíîâûõ èñòî÷íèêîâ
else sens=Sens;
if(Sens>0) string _sn=DoubleToStr(Sens,1)+" ";
// âû÷èñëåíèå êîýôôèöèåíòîâ EMA
if(SourcePeriod<0) {SourcePeriod=-SourcePeriod; kSp=2.0/(1+SourcePeriod); bSp=1;} else bSp=0;
if(Smooth<0) {Smooth=-Smooth; kSm=2.0/(1+Smooth); bSl=1;} else bSl=0;
if(Signal<0) {Signal=-Signal; kSg=2.0/(1+Signal); bSg=1;} else bSg=0;
// if(Fade>1)
kFd=2.0/(1+Fade);
string _sgfd=" ("+(string)Signal+","+(string)Fade+")";
string _src="";
switch(Source) {
case 0: _src=_src+"Volume"; break; // îáúåì
case 1: _src=_src+"ATR"; break; // ATR
case 2: _src=_src+"StDev"; break; // ñò.äåâèàöèÿ
case 3: _src=_src+"Close"; break; // ñò.äåâèàöèÿ
case 4: _src=_src+"H/L"; // ñò.äåâèàöèÿ
}
_src=_src+"("+(string)SourcePeriod+")";
string _nrm=" ["+(string)Window+","+(string)Smooth+"]";
IndicatorShortName(_sn+_src+_nrm+_sgfd);
// èíä.áóôåðû
SetIndexBuffer(0,NRM);
SetIndexStyle(0,DRAW_LINE);
SetIndexLabel(0,_nrm);
SetIndexBuffer(1,NEG);
SetIndexStyle(1,DRAW_LINE,2);
SetIndexLabel(1,"Neg"+_sgfd);
SetIndexBuffer(2,POS);
SetIndexStyle(2,DRAW_LINE,2);
SetIndexLabel(2,"Pos"+_sgfd);
SetIndexBuffer(3,SRC);
SetIndexStyle(3,DRAW_NONE);
SetIndexLabel(3,NULL);
SetIndexBuffer(4,NR0);
SetIndexStyle(4,DRAW_NONE);
SetIndexLabel(4,NULL);
return(0);
}
// ô-ÿ äîïîëíèòåëüíîé èíèöèàëèçàöèè
int reinit()
{
ArrayInitialize(NRM,0.0); // îáíóëåíèå ìàññèâà
ArrayInitialize(NEG,0.0); // îáíóëåíèå ìàññèâà
ArrayInitialize(POS,0.0); // îáíóëåíèå ìàññèâà
ArrayInitialize(SRC,0.0); // îáíóëåíèå ìàññèâà
ArrayInitialize(NR0,0.0); // îáíóëåíèå ìàññèâà
return(0);
}
int start()
{
int ic=IndicatorCounted();
if(!first && Bars-ic-1>1) ic=reinit(); // åñëè åñòü ïðîïóùåííûå áàðû íå íà ïîäêëþ÷åíèè - ïåðåñ÷åò
bool ic0=ic==0; // ôëàã ïåðåñ÷åòà
int limit=Bars-ic; // êîë-âî ïåðåñ÷åòîâ
if(ic==0) limit-=2;
for(int i=limit; i>=0; i--) { // öèêë ïåðåñ÷åòà ïî ÂÑÅÌ áàðàì
bool reset=i==limit && ic0; // ñáðîñ íà ïåðâîé èòåðàöèè öèêëà ïåðåñ÷åòà
if(reset) {
static int BarsPrev=0; // ïðåä. çíà÷åíèå Bars
}
bool NewBar=(ic0 && i>0) || BarsPrev!=Bars; // ïåðâûé òèê íîâîãî áàðà
//=========================================
// èñòî÷íèê
int sh=i+SourcePeriod;
switch(Source) {
case 0: // îáúåì
if(bSp) SRC[i]=kSp*Volume[i]+(1-kSp)*SRC[i+1]; // ÅÌÀ
else { // SMA
double ma=SRC[i+1]*SourcePeriod-Volume[sh];
SRC[i]=(ma+Volume[i])/SourcePeriod;
}
break;
case 1:
double atr0 =iATR(NULL,0,1, i); // ATR
double atrsh=iATR(NULL,0,1,sh); // ATR
if(bSp) SRC[i]=kSp*atr0+(1-kSp)*SRC[i+1]; // ÅÌÀ
else { // SMA
ma=SRC[i+1]*SourcePeriod-atrsh;
SRC[i]=(ma+atr0)/SourcePeriod;
}
break;
case 2: SRC[i]=iStdDev(NULL,0,SourcePeriod,0,bSp,0, i) ; break; // ñò.äåâèàöèÿ
case 3: // Close
if(bSp) SRC[i]=kSp*Close[i]+(1-kSp)*SRC[i+1]; // ÅÌÀ
else { // SMA
ma=SRC[i+1]*SourcePeriod-Close[sh];
SRC[i]=(ma+Close[i])/SourcePeriod;
}
}
//==
// íîðìèðîâàíèå
// ýêñòðåìóìû
double max=SRC[ArrayMaximum(SRC,Window,i)];
double min=SRC[ArrayMinimum(SRC,Window,i)];
double c=SRC[i];
// øóìîïîäàâëåíèå
double delta=max-min; // ðàçìàõ
double diff=sens-delta; // ðàçíèöà ìåæäó ïîðîãîì ÷óâñòâ. è ðàçìàõîì
if(diff>0) { // åñëè ðàçíèöà >0 (ðàçìàõ ìåíüøå ïîðîãà), òî
delta=sens; // ðàçìàõ = ïîðîãó,
min-=diff/2; // íîâîå çíà÷åíèå ìèíèìóìà
}
// íîðìèðîâàíèå
if(delta!=0) NR0[i]=MathPow((c-min)/delta,Power);
//==
// çàìåäëåíèå
if(bSl) NRM[i]=kSm*NR0[i]+(1-kSm)*NRM[i+1]; // EMA
else { // SMA
sh=i+Smooth;
ma=NRM[i+1]*Smooth-NR0[sh];
NRM[i]=(ma+NR0[i])/Smooth;
}
//==
// ñèãíàëüíàÿ
if(reset) {static double sgnPrev=0;}
if(bSg) double sgn=kSg*NRM[i]+(1-kSg)*sgnPrev; // EMA
else { // SMA
sh=i+Signal;
ma=sgnPrev*Signal-NRM[sh];
sgn=(ma+NRM[i])/Signal;
}
//==
// ñãëàæèâàíèå ñèãíàëüíîé
// ïî çàòóõàíèþ
NEG[i]=kFd*sgn+(1-kFd)*NEG[i+1];
if(sgn>NEG[i+1]) NEG[i]=sgn;
// ïî ôðîíòó
POS[i]=kFd*sgn+(1-kFd)*POS[i+1];
if(sgn<POS[i+1]) POS[i]=sgn;
//=========================================
// ñèíõðîíèçàöèÿ
if(NewBar) {sgnPrev=sgn; BarsPrev=Bars;}
}
first=0; // ñáðîñ ôëàãà ïåðâîãî öèêëà
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
---