请教各位大师!

楼主  收藏   举报   帖子创建时间:  2019-05-05 13:39 回复:0 关注量:654
试着套用网上的源码编写了一个自定义指标,但是指标线并没有显示出来,望诸位大师赐教! 源码如下:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#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);
}
打赏