Price Data Components
Miscellaneous
0
Views
0
Downloads
0
Favorites
_MasterSlave
#property indicator_separate_window // â ïîäîêíå
#property indicator_buffers 7
#property indicator_color1 Red // ñèãíàëüíàÿ
#property indicator_color6 Blue // ãèñòîãðàììà äèíàìèêè äëèíû âûáîðêè
#property indicator_maximum 1
#property indicator_minimum 0
// âõîäíûå ïàðàìåòðû
//-- ðåäêîþçàåìûå ïàðàìåòðû ñäåëàíû íå extern - ìîæíî ðàñøèðèòü ââîä ïðè æåëàíèè
extern int Source=1; // 0 - îáúåì; 1 - ñò.äåâèàöèÿ öåíû; 2 - ATR; 3 - öåíà;
int ApplPrice=0; // 0 - Close; 4 - (high+low)/2; 5 - (high+low+close)/3; 6 - (high+low+close+close)/4;
extern int SourcePeriod=88; // ïåðèîä âõîäíîãî èíäèêàòîðà
int Shift=0; // ñäâèã
bool MAtypeI=1; // 0 - SMA, 1 - EMA
int PrePeriod=1; // äëÿ äåâèàöèè äîïîëíèòåëüíîå ñãëàæèâàíèå, îñòàëüíûå - ìåäëåííàÿ MA äëÿ MACD
bool MAtypeP=1; // 0 - SMA, 1 - EMA
extern int Window=111; // äëèíà âûáîðêè íîðìèðîâàíèÿ
int WindowLimit=0; // ìíîæèòåëü îãðàíè÷åíèå äëèíû âûáîðêè íîðìèðîâàíèÿ
int WindowShift=0; // ñäâèã âûáîðêè íîðìèðîâàíèÿ
bool WindowMethod=0; // 0 - ôèêñèðîâàííàÿ âûáîðêà äëÿ íîðìèðîâàíèÿ, 1 - ïëàâàþùàÿ
extern double Sensitivity=0; // ÷óâñòâèòåëüíîñòü
bool abs=1; // âûâîä ÷åðåç áóôåð NP[] ñî çíàêîì äâèæåíèÿ ñò.äåâèàöèè
bool ToRange=1; // ïðèíóäèòåëüíîå îãðàíè÷åíèå äèàï. 0...1; èìååò ñìûñë òîëüêî ïðè WindowShift>0
double Power=1; // ñòåïåíü ïî íîðìèðîâàíèþ
extern int Signal=55; // ñãëàæèâàíèå íîðìèðîâàííîãî èíäèêàòîðà (ñèãíàëüíàÿ)
bool MAtypeS=1; // 0 - SMA, 1 - EMA
int SignalShift=0; // ñäâèã ñèãíàëüíîé
int History=0;
// èíäèêàòîðíûå áóôåðû
double Ind[], // íîðìèðóåìûé èíäèêàòîð
PR[], // ïðåôèëüòðàöèÿ
NORM[], // ðåçóëüòàòû íîðìèðîâàíèÿ
SM[], // ñèãíàëüíàÿ
Input[], // áóôåð àðãóìåíòîâ íîðìèðóåìîãî èíäèêàòîðà (öåíà èëè îáúåì)
MA[], // ÌÀ íîðìèðóåìîãî èíäèêàòîðà
NP[], // ïëàâàþùèé ïåðèîä íîðìèðîâàíèÿ - â âû÷èñëèíèÿõ íå ó÷àñòâóåò - äëÿ íàãëÿäíîñòè
SIGN[]; // åìóëèðîâàííûé áóôåð - âñïîìîãàòåëüíàÿ MA
double sens, // ÷óâñòâèòåëüíîñòü â ìàñøòàáå öåíû/îáúåìà
sensLimit, // ìèíèìàëüíàÿ ÷óâñâèòåëüíîñòü
sn,
IndPeriodK, // êîýôô. EMA äëÿ äåâèàöèè
PrePeriodK, // êîýôô. EMA äëÿ ïðåôèëüòðà
SignalK; // êîýôô. EMA äëÿ ñãëàæèâàíèÿ
bool Em=0; // ôëàã äëÿ ýìóëÿöèè âñïîìîãàòåëüíîé MA
//int WindowLimit; // îãðàíè÷åíèå äëèíû âûáîðêè íîðìèðîâàíèÿ
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
switch(Source) {
case 0: // Îáúåì
SetIndexStyle(2,DRAW_LINE,0,1,LimeGreen);
string ShortName="Volume(";
double punkt=1;
WindowShift++;
break;
case 3: // Ñòîõàñòèê
SetIndexStyle(2,DRAW_LINE,0,1,LightSeaGreen);
ShortName="MA(";
WindowMethod=1; // èñïîëüçîâàòü ïëàâàþùóþ äëèíó âûáîðêè íîðìèðîâàíèÿ
punkt=Point;
break;
case 2: // ñò.äåâèàöèÿ
SetIndexStyle(2,DRAW_LINE,0,1,MediumSeaGreen);
ShortName="StDev(";
punkt=Point;
break;
case 1: //ATR
SetIndexStyle(2,DRAW_LINE,0,1,DodgerBlue);
ShortName="ATR(";
punkt=Point;
}
if(WindowMethod) {
if(WindowLimit==0) WindowLimit=Window*10; // îãðàíè÷åíèå äëèíû âûáîðêè íîðìèðîâàíèÿ
else WindowLimit=MathMax(WindowLimit,Window);
}
ShortName=ShortName+_Price()+SourcePeriod;
if(Shift>0) ShortName=ShortName+"+"+Shift;
ShortName=ShortName+") ";
if(PrePeriod>1) ShortName=ShortName+PrePeriod+" ";
ShortName=ShortName+"["+Window;
if(WindowMethod && Sensitivity>0) ShortName=ShortName+"_"+WindowLimit;
if(WindowShift>0) ShortName=ShortName+"+"+WindowShift;
if(Sensitivity>0) ShortName=ShortName+"@"+DoubleToStr(Sensitivity,1);
ShortName=ShortName+"]";
if(Power!=1) ShortName=ShortName+"^"+DoubleToStr(Power,1);
if(Signal>1 || SignalShift>0) {
ShortName=ShortName+" ("+Signal;
if(SignalShift>0) ShortName=ShortName+"+"+SignalShift;
ShortName=ShortName+")";
}
IndicatorShortName(ShortName); // çàäàòü èìÿ èíäèêàòîðà â ïîäîêíå
//---- indicators
SetIndexBuffer(0,SM); // ñèãíàëüíàÿ
SetIndexStyle(0,DRAW_LINE);
SetIndexLabel(0,"Signal");
SetIndexBuffer(1,Ind); // èíäèêàòîð
SetIndexStyle(1,DRAW_NONE);
SetIndexLabel(1,NULL);
SetIndexBuffer(2,NORM); // ðåçóëüòàòû íîðìèðîâàíèÿ
SetIndexLabel(2,"Normed");
SetIndexBuffer(3,MA); // MA èíäèêàòîðà
SetIndexStyle(3,DRAW_NONE);
SetIndexLabel(3,NULL);
SetIndexBuffer(4,Input); // áóôåð âõîäíûõ äàííûõ (îáúåì èëè öåíà)
SetIndexStyle(4,DRAW_NONE);
SetIndexLabel(4,NULL);
SetIndexBuffer(5,NP); // ãèñòîãðàììà è âûâîä ñî çíàêîì ñò.äåâ.
if(Source==-3 && Sensitivity>0) // ïîêàçàòü äëèíó âûáîðêè íîðìèðîâàíèÿ
{
SetIndexStyle(5,DRAW_HISTOGRAM);
Source=-Source;
}
else SetIndexStyle(5,DRAW_NONE);
if(Source==3 && Sensitivity>0) SetIndexLabel(5,"Window");
else SetIndexLabel(5,NULL);
if(abs) SetIndexLabel(5,"NormSign");
else SetIndexLabel(5,NULL);
SetIndexBuffer(6,PR); // ðåçóëüòàòû ïðåôèëüòðàöèè èíäèêàòîðà (ïîäàþòñÿ â íîðìèðîâàíèå)
SetIndexStyle(6,DRAW_NONE);
SetIndexLabel(6,"Source");
//----
sensLimit=punkt/1000; // ìèíèìàëüíàÿ ÷óâñâèòåëüíîñòü
sens=MathMax(Sensitivity*punkt,sensLimit); // ÷óâñòâèòåëüíîñòü â ìàñøòàáå èíäèêàòîðà
if(WindowMethod) sn=sensLimit; // åñëè äèíàìè÷åñêîå íîðìèðîâàíèå
else sn=sens;
if(SourcePeriod<0) {MAtypeI=0; SourcePeriod=-SourcePeriod;} // SMA
else IndPeriodK=2.0/(SourcePeriod+1); // EMA
if(PrePeriod<0) {MAtypeP=0; PrePeriod=-PrePeriod;} // SMA
else PrePeriodK=2.0/(PrePeriod+1); // EMA
if(Signal<0) {MAtypeS=0; Signal=-Signal;} // SMA
else SignalK=2.0/(Signal+1); // EMA
if(Source==0 || Source==1) Em=1; // ôëàã äëÿ ýìóëÿöèè âñïîìîãàòåëüíîé MA
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
if(Em) EmBuff();
int ic=IndicatorCounted();
if(Bars-ic-1>1) {ic=reinit();}
int limit=Bars-ic-1; //BarsPrev=Bars; // êîë-âî ïåðåñ÷åòîâ
if(History!=0 && limit>History) limit=History-1; // êîë-âî ïåðåñ÷åòîâ ïî èñòîðèè
for(int i=limit; i>=0; i--) // öèêë ïî íåïîñ÷èòàííûì è ïðåäïîñëåäíåìó áàðàì
{
double ma;
int n;
int iShift=i+Shift;
if(Em) { // Ýìóëèðóåìàÿ ÌÀ
if(MAtypeI) // EMA
SIGN[i]=IndPeriodK*Price(4,iShift)+(1-IndPeriodK)*SIGN[i+1];
else { // SMA
int sh=iShift+SourcePeriod;
ma=SIGN[i+1]*SourcePeriod-Price(4,sh);
SIGN[i]=(ma+Close[iShift])/SourcePeriod;
}
}
// âûáîð èñòî÷íèêà
switch(Source) {
case 0: // îáúåì
Input[i]=Volume[iShift]; break;
case 3: // öåíà
Input[i]=Price(ApplPrice,iShift); break;
case 2:
Input[i]=Price(ApplPrice,iShift); break;
case 1: // ATR
Input[i]=MathMax(High[iShift],Close[iShift+1])-MathMin(Low[iShift],Close[iShift+1]);
}
// MA
if(MAtypeI) { // EMA
MA[i]=IndPeriodK*Input[i]+(1-IndPeriodK)*MA[i+1];
ma=MA[i];
}
else { // SMA
sh=i+SourcePeriod;
ma=MA[i+1]*SourcePeriod-Input[sh];
MA[i]=(ma+Input[i])/SourcePeriod;
ma=MA[i];
}
// ñò.äåâèàöèÿ
if(Source==2) // íîðìèðóåòñÿ äåâèàöèÿ
{
double std=0;
for(n=0; n<SourcePeriod; n++) {
double delta=Input[i+n]-ma;
std+=delta*delta; // ÷èñëèòåëü SourcePeriod(Price)
}
Ind[i]=MathSqrt(std/SourcePeriod);
//
if(PrePeriod==1) PR[i]=Ind[i];
else
if(MAtypeP)
PR[i]=PrePeriodK*Ind[i]+(1-PrePeriodK)*PR[i+1];
else {
sh=i+PrePeriod;
ma=PR[i+1]*PrePeriod-Ind[sh];
PR[i]=(ma+Ind[i])/PrePeriod;
}
}
else // MA (öåíà èëè îáúåì)
if(PrePeriod==1) PR[i]=MA[i];
else {
if(MAtypeP)
Ind[i]=PrePeriodK*Input[i]+(1-PrePeriodK)*Ind[i+1];
else {
sh=i+PrePeriod;
ma=PR[i+1]*PrePeriod-Input[sh];
Ind[i]=(ma+Input[i])/PrePeriod;
}
PR[i]=MA[i]-Ind[i];
if(abs) PR[i]=MathAbs(PR[i]);
}
// Íîðìèðîâàíèå
double max=PR[ArrayMaximum(PR,Window,i+WindowShift)];
double min=PR[ArrayMinimum(PR,Window,i+WindowShift)];
if(WindowMethod)
for(n=Window; max-min<sens && n<=WindowLimit; n++) {
int in=i+n+WindowShift;
max=MathMax(max,PR[in]);
min=MathMin(min,PR[in]);
}
double x=(PR[i]-min)/MathMax((max-min),sn);
if(Power!=1 && Power>0) x=MathPow(x,Power);
NORM[i]=x;
if(ToRange) // ïðè ñäâèãå âûáîðêè óáðàòü çíà÷åíèÿ âíå äèàï.0...1
{NORM[i]=MathMax(NORM[i],0); NORM[i]=MathMin(NORM[i],1);}
if(abs) // âûâîä íîðìèðîâàíèÿ ñî çíàêîì
if(Em) // åñëè îáúåì èëè ATR
{if(Close[i]>SIGN[i+3]) NP[i]=NORM[i]; else NP[i]=-NORM[i];}
else // åñëè ñò.äåâ.
{if(Close[i]>MA[i+3]) NP[i]=NORM[i]; else NP[i]=-NORM[i];}
// Ñãëàæèâàíèå .
if(Signal==1) SM[i]=NORM[i+SignalShift];
else
if(MAtypeS) // EMA
SM[i]=SignalK*NORM[i+SignalShift]+(1-SignalK)*SM[i+1];
else { // SMA
sh=i+SignalShift+Signal;
ma=SM[i+1]*Signal-NORM[sh];
SM[i]=(ma+NORM[i+SignalShift])/Signal;
}
}
//----
return(0);
}
//----------------------------------------------------
// ô-ÿ äîïîëíèòåëüíîé èíèöèàëèçàöèè
int reinit()
{
ArrayInitialize(Input,0.0);
ArrayInitialize(Ind,0.0);
ArrayInitialize(PR,0.0);
ArrayInitialize(NORM,0.0);
ArrayInitialize(SM,0.0);
ArrayInitialize(MA,0.0);
ArrayInitialize(NP,0.0);
return(0);
}
double Price(int ApplPrice,int i) {
switch(ApplPrice) {
case 0: return(Close[i]);
case 1: return(Open[i]);
case 2: return(High[i]);
case 3: return(Low[i]);
case 4: return((High[i]+Low[i])/2);
case 5: return((High[i]+Low[i]+Close[i])/3);
case 6: return((High[i]+Low[i]+2*Close[i])/4);
default: return(Close[i]);
}
}
string _Price() {
switch(ApplPrice) {
case 0: return("");
case 1: return("O");
case 2: return("H");
case 3: return("L");
case 4: return("M");
case 5: return("T");
case 6: return("W");
default: return("");
}
}
void EmBuff()
{
static int NewSize;
if(NewSize==Bars) return;
NewSize=Bars;
ArraySetAsSeries(SIGN,0); ArrayResize(SIGN,NewSize); ArraySetAsSeries(SIGN,1);
}
//+------------------------------------------------------------------+
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
---