_MACD_Xtr.mq4
_MACD_Xtr.mq4 Programming source code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
/* iCustom(NULL,0,"_MACD_Xtr",FastMA,SlowMA,Source,SourcePeriod,FrontPeriod,xVolatility,Sens, N,i); */ #property indicator_separate_window // ‚ ÓÍÌ Ë̉Ë͇ÚÓ‡ #property indicator_buffers 5 #property indicator_color1 Blue // #property indicator_color2 Gray // ÛÓ‚Â̸ œ #property indicator_color3 Gray // ÛÓ‚Â̸ œœ #property indicator_color4 Green // ·‡ ‚ ÁÓÌ œ #property indicator_color5 Red // ·‡ ‚ ÁÓÌ œœ // ‚ıÓ‰Ì˚ ԇ‡ÏÂÚ˚ // MACD extern int FastMA=12; // ÔÂËÓ‰ ·˚ÒÚÓÈ EMA extern int SlowMA=26; // ÔÂËÓ‰ ωÎÂÌÌÓÈ EMA // ‚Ó·ÚËθÌÓÒÚ¸ extern int Source=1; // ËÒÚÓ˜ÌËÍ: 0 - Ó·˙ÂÏ, 1 - ATR, 2 - ÒÚ.‰Â‚ˇˆËˇ extern int SourcePeriod=5; // ÔÂËÓ‰ ËÒÚÓ˜ÌË͇ // Ò˄̇θ̇ˇ double FrontPeriod=1; // ÔÂËÓ‰ ҄·ÊË‚‡Ìˡ ÙÓÌÚ‡; Ï.·. <1 extern double BackPeriod=444; // ÔÂËÓ‰ ҄·ÊË‚‡Ìˡ Á‡ÚÛı‡Ìˡ; Ï.·. <1 // ÛÓ‚ÌË œ /œœ extern double xVolatility=0.5; extern double Sens=0; // ÔÓÓ„ ˜Û‚ÒÚ‚ËÚÂθÌÓÒÚË ‚ ÔÔ. ËÎË ‚ ÚË͇ı (‰Îˇ Ó·˙Âχ) int History=0; // ÍÓÎ-‚Ó ·‡Ó‚ Ô‰˚ÒÚÓËË; 0 - ‚Ò // Ë̉.·ÛÙÂ˚ double MACD[], // MACD OB[], // ÛÓ‚Â̸ œ OS[], // ÛÓ‚Â̸ œœ OBH[], // ·‡ ‚ ÁÓÌ œ OSH[]; // ·‡ ‚ ÁÓÌ œœ // Ó·˘Ë („ÎÓ·‡Î¸Ì˚Â) ÔÂÂÏÂÌÌ˚ bool first=1; // Ù·„ ÔÂ‚Ó„Ó Á‡ÔÛÒ͇ double sens; // ÔÓÓ„ ˜Û‚ÒÚ‚ËÚÂθÌÓÒÚË ‚ ˆÂ̇ı // ËÌˈˇÎËÁ‡ˆËˇ int init() { first=1; sens=Sens*Point; // ÔÓÓ„ ˜Û‚ÒÚ‚ËÚÂθÌÓÒÚË ‚ ˆÂ̇ı string _md="MACD("+FastMA+","+SlowMA+")"; SetIndexBuffer(0,MACD); SetIndexStyle(0,DRAW_HISTOGRAM,0); SetIndexLabel(0,_md); SetIndexBuffer(1,OB); SetIndexStyle(1,DRAW_LINE,2); SetIndexLabel(1,"OB"); SetIndexBuffer(2,OS); SetIndexStyle(2,DRAW_LINE,2); SetIndexLabel(2,"OS"); SetIndexBuffer(3,OBH); SetIndexStyle(3,DRAW_HISTOGRAM,0,2); SetIndexLabel(3,"Peak"); SetIndexBuffer(4,OSH); SetIndexStyle(4,DRAW_HISTOGRAM,0,2); SetIndexLabel(4,"Trough"); if(BackPeriod<1) string _bk=DoubleToStr(BackPeriod,3); else _bk=DoubleToStr(BackPeriod,0); // ˜Û‚ÒÚ‚ËÚÂθÌÓÒÚ¸ if(Sens>0) string _src=DoubleToStr(Sens,1)+" "; // ËÒÚÓ˜ÌËÍ switch(Source) { case 0: _src=_src+"Volume"; break; // Ó·˙ÂÏ case 1: _src=_src+"ATR"; break; // ATR case 2: _src=_src+"StDev"; // ÒÚ.‰Â‚ˇˆËˇ } _src=_src+"("+SourcePeriod+","+_bk+")"; IndicatorShortName(_md+" "+_src); return(0); } // Ù-ˇ ‰ÓÔÓÎÌËÚÂθÌÓÈ ËÌˈˇÎËÁ‡ˆËË int reinit() { ArrayInitialize(MACD,0.0); // Ó·ÌÛÎÂÌË χÒÒË‚‡ ArrayInitialize(OB,0.0); // Ó·ÌÛÎÂÌË χÒÒË‚‡ ArrayInitialize(OS,0.0); // Ó·ÌÛÎÂÌË χÒÒË‚‡ ArrayInitialize(OBH,0.0); // Ó·ÌÛÎÂÌË χÒÒË‚‡ ArrayInitialize(OSH,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-1; // ÍÓÎ-‚Ó ÔÂÂÒ˜ÂÚÓ‚ if(History!=0 && limit>History) limit=History-1; // ÍÓÎ-‚Ó ÔÂÂÒ˜ÂÚÓ‚ ÔÓ ËÒÚÓËË for(int i=limit; i>=0; i--) { // ˆËÍÎ ÔÂÂÒ˜ÂÚ‡ ÔÓ ¬—≈à ·‡‡Ï double macd=iMACD(NULL,0,FastMA,SlowMA,1,0, 0,i); MACD[i]=macd; double vlt=xVolatility*iCustom(NULL,0,"_Volatility_FBA_NR",Source,SourcePeriod,FrontPeriod,BackPeriod,0, 1,i); double lev=MathMax(sens,vlt); OB[i]=lev; OS[i]=-lev; if(macd> lev) OBH[i]=macd; else OBH[i]=0; if(macd<-lev) OSH[i]=macd; else OSH[i]=0; } first=0; // Ò·ÓÒ Ù·„‡ ÔÂ‚Ó„Ó ˆËÍ· return(0); } |