试着套用网上的源码编写了一个自定义指标,但是指标线并没有显示出来,望诸位大师赐教! 源码如下: //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #property indicator_separate_window #property indicator_buffers 2 #property indicator_color1 LimeGreen #property indicator_color2 FireBrick double g_ibuf_144[]; double g_ibuf_148[]; extern int fastEMA = 12; extern int slowEMA = 26; extern int signal = 9; extern double positiveSensitivity = 0.0001; extern double negativeSensitivity = -0.0001; double OsMA(int ai_0){ double MacdMain,MacdSignal,OsMA; MacdMain= iMACD(NULL,0,fastEMA,slowEMA,signal,PRICE_CLOSE,MODE_MAIN,ai_0); MacdSignal= iMACD(NULL,0,fastEMA,slowEMA,signal,PRICE_CLOSE,MODE_SIGNAL,ai_0); OsMA=MacdMain-MacdSignal; return(OsMA); } int init() { SetIndexStyle(0, DRAW_ARROW); SetIndexStyle(1, DRAW_ARROW); SetIndexBuffer(0, g_ibuf_144); SetIndexBuffer(1, g_ibuf_148); SetIndexArrow(0, 233); SetIndexArrow(1, 234); IndicatorDigits(Digits + 2); return (0); } int start(){ int firstPeakOrTroughShift = GetFirstPeakOrTrough(0); double firstPeakOrTroughOsMA = OsMA(firstPeakOrTroughShift); if(firstPeakOrTroughOsMA > 0) { int peak_0 = GetIndicatorLastPeak(0); int trough_0 = GetIndicatorLastTrough(peak_0); int peak_1 = GetIndicatorLastPeak(trough_0); int trough_1 = GetIndicatorLastTrough(peak_1); } else { trough_0 = GetIndicatorLastTrough(0); peak_0 = GetIndicatorLastPeak(trough_0); trough_1 = GetIndicatorLastTrough(peak_0); peak_1 = GetIndicatorLastPeak(trough_1); } //---- if(peak_0 == -1 || peak_1 == -1 || trough_0 == -1 || trough_1 == -1) return(0); //---- double indicatorLastPeak = OsMA(peak_0); double indicatorThePeakBefore = OsMA(peak_1); double indicatorLastTrough = OsMA(trough_0); double indicatorTheTroughBefore = OsMA(trough_1); int pricePeak_0 = peak_0; int pricePeak_1 = peak_1; int priceTrough_0 = trough_0; int priceTrough_1 = trough_1; //---- double priceLastPeak = High[pricePeak_0]; double priceThePeakBefore = High[pricePeak_1]; double priceLastTrough = Low[priceTrough_0]; double priceTheTroughBefore = Low[priceTrough_1]; if(peak_0==2 && priceLastPeak > priceThePeakBefore && indicatorLastPeak < indicatorThePeakBefore ){ g_ibuf_144[peak_0]=iOsMA(NULL, 0, fastEMA, slowEMA, signal, PRICE_CLOSE, peak_0); return(-1); } if(trough_0==2 && priceLastTrough < priceTheTroughBefore && indicatorLastTrough > indicatorTheTroughBefore ) { g_ibuf_148[trough_0]=iOsMA(NULL, 0, fastEMA, slowEMA, signal, PRICE_CLOSE, trough_0); return(1); } return(0); } int GetFirstPeakOrTrough(int index) { for(int i = index + 1; i < Bars; i++) { if((OsMA(i) >= OsMA(i-1) && OsMA(i) >= OsMA(i+1) && OsMA(i)>= OsMA(i+2) && OsMA(i) > positiveSensitivity) || (OsMA(i) <= OsMA(i-1) && OsMA(i) <= OsMA(i+1) && OsMA(i) <= OsMA(i+2) && OsMA(i) < negativeSensitivity)) return(i); } return(-1); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int GetIndicatorLastPeak(int index){//查找最高点的位置 int regionStart = GetPositiveRegionStart(index); if(regionStart == -1) return(-1); //---- int peakShift = 0; double peakValue = 0; //---- for(int i = regionStart; i < Bars; i++) { if(OsMA(i) > peakValue && OsMA(i) >= OsMA(i-1) && OsMA(i) >= OsMA(i+1) && OsMA(i) >= OsMA(i+2) && OsMA(i) > positiveSensitivity) { peakValue = OsMA(i); peakShift = i; } if(OsMA(i) < 0) break; } return(peakShift); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int GetIndicatorLastTrough(int index){//查找之前最低点的位置 int regionStart = GetNegativeRegionStart(index); if(regionStart == -1) return(-1); //---- int troughShift = 0; double troughValue = 0; //---- for(int i = regionStart; i < Bars; i++) { if(OsMA(i) < troughValue && OsMA(i) <= OsMA(i-1) && OsMA(i) <= OsMA(i+1) && OsMA(i) <= OsMA(i+2) && OsMA(i) < negativeSensitivity) { troughValue = OsMA(i); troughShift = i; } if(OsMA(i) > 0) break; } return(troughShift); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int GetPositiveRegionStart(int index)//计算上一次高点的位置。 { int regionStart; for(int i = index + 1; i < Bars; i++) { if(OsMA(i) >= OsMA(i-1) && OsMA(i) >= OsMA(i+1) && OsMA(i) >= OsMA(i+2) && OsMA(i) > positiveSensitivity) return(i); } return(-1); } int GetNegativeRegionStart(int index){//计算上一次地点的位置 for(int i = index + 1; i < Bars; i++) { if(OsMA(i) <= OsMA(i-1) && OsMA(i) <= OsMA(i+1) && OsMA(i) <= OsMA(i+2) && OsMA(i) < negativeSensitivity) return(i); } return(-1); } |
请教各位大师!
回复:0 浏览:654
- 楼主admin 圈主
- 2019-05-05 13:39