/*
âûçîâ èç êîäîâ
iCustom(
NULL,0,"AsimmetricStochNR", // íà òåêóùåì òàéì-ôðåéìå è èíñòðóìåíòå
KperiodShort, // ìëàäøèé (êîðîòêèé) %K
KperiodLong, // ñòàðøèé (äëèííûé) %K
Dperiod, // %D ñèãíàëüíàÿ
Slowing, // çàìåäëåíèå
Dmethod, // òèï MA ñèãíàëüíîé: 0-SMA, 1-EMA
PriceField, // òèï öåíû: 0-High/Low; 1-Close/Close
Sens, // ÷óâñòâèòåëüíîñòü â ïï.
OverSold, // óðîâåíü ÏÏ â %%
N, // áóôåðû: 0- ãëàâíàÿ, 1- ñèãíàëüíàÿ, 2- òðåíä
i // ñìåùåíèå
);
*/
#property indicator_separate_window // â îòä. îêíå
#property indicator_buffers 3
#property indicator_color1 Blue // ãëàâíàÿ
#property indicator_style1 0
#property indicator_color2 Red // ñèãíàëüíàÿ
#property indicator_style2 0
#property indicator_maximum 100
#property indicator_minimum 0
#property indicator_level3 50
// âõîäíûå ïàðàìåòðû
extern int KperiodShort=5; // %K
extern int KperiodLong=12; // %K
extern int Dperiod=1; // %D ñèãíàëüíàÿ
double kd; // êîýôô. EMA äëÿ ñèãíàëüíîé
extern int Slowing=3; // çàìåäëåíèå
extern int Dmethod=0; // òèï MA ñèãíàëüíîé: 0-SMA, 1-EMA
extern int PriceField=0; // òèï öåíû: 0-High/Low; 1-Close/Close
extern int Sens=7; // ÷óâñòâèòåëüíîñòü â ïï.
double sens; // ÷óâñòâèòåëüíîñòü â öåíàõ
extern int OverSold=20; // óðîâåíü ÏÏ â %%
int OverBought;
int History=0; // èñòîðèÿ ïåðåñ÷åòà: 0 - âñå áàðû
// ìàññèâû èíä.áóôåðîâ
double Main[], // ãëàâíàÿ
Signal[], // ñèãíàëüíàÿ
Trend[]; // òðåíä: 0 - âíèç, 1 - ââåðõ
int init() {
sens=Sens*Point; // ÷óâñòâèòåëüíîñòü â öåíàõ
if(Dmethod==1) kd=2.0/(1+Dperiod); // êîýôô. EMA äëÿ ñèãíàëüíîé
SetLevelValue(0,OverSold);
OverBought=100-OverSold;
SetLevelValue(1,OverBought);
// áóôåð ãëàâíîé
SetIndexBuffer(0,Main);
SetIndexStyle(0,DRAW_LINE);
string _str="("+KperiodShort+"/"+KperiodLong+","+Slowing+")";
SetIndexLabel(0,"Main"+_str);
SetIndexEmptyValue(0,0.0);
// áóôåð ñèãíàëüíîé
SetIndexBuffer(1,Signal);
SetIndexStyle(1,DRAW_LINE);
_str="("+Dperiod+")";
SetIndexLabel(1,"Signal"+_str);
SetIndexEmptyValue(0,0.0);
// òðåíä
SetIndexBuffer(2,Trend);
SetIndexStyle(2,DRAW_NONE);
SetIndexLabel(2,"Trend");
SetIndexEmptyValue(0,0.0);
// êîðîòêîå èìÿ
if(Sens!=0) string ShName=Sens+" ";
ShName=ShName+"Stoch ";
if(PriceField==0) ShName=ShName+"H/L";
else ShName=ShName+"C/C";
ShName=ShName+" ("+KperiodShort+"/"+KperiodLong+","+Dperiod+","+Slowing+")";
IndicatorShortName(ShName);
}
int reinit() // ô-ÿ äîïîëíèòåëüíîé èíèöèàëèçàöèè
{
ArrayInitialize(Main,0.0);
ArrayInitialize(Signal,0.0);
ArrayInitialize(Trend,0.0);
return(0);
}
void start() {
int ic=IndicatorCounted();
if(Bars-ic-1>1) ic=reinit();
int limit=Bars-ic-1; // êîë-âî ïåðåñ÷åòîâ
int counted_bars = IndicatorCounted();
if(counted_bars < 0) return(-1);
if(counted_bars > 0) counted_bars--;
limit = Bars - counted_bars;
if(counted_bars==0) limit-=1+1;
if(History!=0 && limit>History) limit=History-1; // êîë-âî ïåðåñ÷åòîâ ïî èñòîðèè
for(int i=limit; i>=0; i--) { // öèêë ïåðåñ÷åòà ïî ÂÑÅÌ áàðàì
// ïåðâîíà÷àëüíûå çíà÷åíèÿ
static bool Kperiod0,Kperiod1,trend;
if(i==limit && limit>1) {
Kperiod0=KperiodShort;
Kperiod1=KperiodShort;
trend=0;
}
// ãëàâíàÿ
Main[i]=Stoch(Kperiod0, Kperiod1, Slowing, PriceField, sens, i);
// ñèãíàëüíàÿ¸
switch(Dmethod) {
case 1: // EMA
Signal[i]=kd*Main[i]+(1-kd)*Signal[i+1]; break;
case 0: // SMA
int sh=i+Dperiod;
double ma=Signal[i+1]*Dperiod-Main[sh];
Signal[i]=(ma+Main[i])/Dperiod;
}
// ïåðåêëþ÷åíèå íàïðàâëåíèÿ
if(Signal[i+1]>OverBought) { // àïòðåíä
Kperiod0=KperiodShort;
Kperiod1=KperiodLong;
trend=1;
}
if(Signal[i+1]<OverSold) { // äàóíòðåíä
Kperiod0=KperiodLong;
Kperiod1=KperiodShort;
trend=0;
}
Trend[i]=trend;
}
}
//>>>>>>>>>>>>>>>>>>>>>
// ñòîõàñòèê ñ øóìîäàâîì
double Stoch(int Kperiod0, int Kperiod1, int Slowing, int PriceField, double sens, int i) {
if(i+MathMax(Kperiod0,Kperiod1)+Slowing>Bars) return(-1); // íåäîñòàòî÷íî áàðîâ - âûõîä
// ýêñòðåìóìû öåíû â öèêëå çàìåäëåíèÿ/ñãëàæèâàíèÿ
double max,min,c;
for(int j=i; j<i+Slowing; j++) {
if(PriceField==1) { // ïî Close
max+=Close[ArrayMaximum(Close,Kperiod0,j)];
min+=Close[ArrayMinimum(Close,Kperiod1,j)];
}
else { // ïî High/Low
max+=High[ArrayMaximum(High,Kperiod0,j)];
min+=Low[ArrayMinimum(Low,Kperiod1,j)];
}
c+=Close[j];
}
// øóìîïîäàâëåíèå
sens*=Slowing; // ïðèâåäåíèå ÷óâñòâèòåëüíîñòè â ñîîòâåòñòâèå ñ ïåðèîäîì çàìåäëåíèÿ
double delta=max-min; // ðàçìàõ
double diff=sens-delta; // ðàçíèöà ìåæäó ïîðîãîì ÷óâñòâ. è ðàçìàõîì
if(diff>0) { // åñëè ðàçíèöà >0 (ðàçìàõ ìåíüøå ïîðîãà), òî
delta=sens; // ðàçìàõ = ïîðîãó,
min-=diff/2; // íîâîå çíà÷åíèå ìèíèìóìà
}
// âû÷èñëåíèå îñöèëëÿòîðà
if(delta==0) return(-2); // äåëåíèå íà íîëü
else return(100*(c-min)/delta); // ñòîõàñòèê
}
Comments