尘家落 发表于 2014-2-17 16:01:27

请教各位大师!

试着套用网上的源码编写了一个自定义指标,但是指标线并没有显示出来,望诸位大师赐教! 源码如下:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#propertyindicator_separate_window
#propertyindicator_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;
       double priceThePeakBefore = High;
       double priceLastTrough = Low;
       double priceTheTroughBefore = Low;
      
       if(peak_0==2 && priceLastPeak > priceThePeakBefore && indicatorLastPeak < indicatorThePeakBefore ){
         
       g_ibuf_144=iOsMA(NULL, 0, fastEMA, slowEMA, signal, PRICE_CLOSE, peak_0);         
       return(-1);
       }      
       if(trough_0==2 && priceLastTrough < priceTheTroughBefore && indicatorLastTrough > indicatorTheTroughBefore )
       {      
       g_ibuf_148=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);
}

346420344 发表于 2014-9-15 09:56:51

求离场策略

小叶 发表于 2015-1-23 08:35:16

回复看看

浮华 发表于 2015-1-25 13:16:19

小家 发表于 2015-1-30 20:05:04

今天黄金怎么操作

gmRFGTgf 发表于 2015-2-12 21:09:54

围观中~~~

ming 发表于 2015-2-14 16:11:21

找版主

FXSIN外汇 发表于 2020-6-8 16:21:37

不错不错,楼主您辛苦了。。。

钟夏夜 发表于 2020-6-15 18:45:02

有竞争才有进步嘛

yujopozb 发表于 2020-7-4 11:23:25

帮你顶下哈!!
页: [1] 2
查看完整版本: 请教各位大师!