papiliolin 發表於 12-9-24 22:01

關於STEP moving average, 有人可以將MQ4的程式碼改為multicharts嗎?

這幾天在查資料時, 意外看到step moving average (STEP MA)
看起來似乎還挺有趣的
可是都只能查到MQ4的code..., 查不到easy language的...殘念
請教四方高手, 有沒有人可以改寫為multicharts的程式碼?


Code:
//+------------------------------------------------------------------+
//|                                                StepMA_v7.1.mq4 |
//|                              Copyright ?2006, TrendLaboratory |
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |
//|                                 E-mail: igorad2003@yahoo.co.uk |
//+------------------------------------------------------------------+
#property copyright "Copyright ?2006, TrendLaboratory"
#property link      "http://finance.groups.yahoo.com/group/TrendLaboratory"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Aqua
#property indicator_color2 Blue
#property indicator_color3 Red

//---- input parameters
extern int   Length      = 10;      // Volty Length
extern doubleKv          = 1.0;   // Sensivity Factor
extern int   StepSize    = 0;       // Constant Step Size (if need)
extern int   MA_Mode   = 0;       // Volty MA Mode : 0-SMA, 1-LWMA
extern int   Advance   = 0;       // Offset
extern doublePercentage= 0;       // Percentage of Up/Down Moving   
extern bool    HighLow   = false;   // High/Low Mode Switch (more sensitive)
extern int   ColorMode   = 0;       // Color Mode Switch
extern int   BarsNumber= 0;      

//---- indicator buffers
double LineBuffer[];
double UpBuffer[];
double DnBuffer[];
double smin[];
double smax[];
double trend[];

double StepMA=0, ATR0=0,ATRmax=-100000,ATRmin=1000000;
int limit;

//---- StepSize Calculation

   double StepSizeCalc ( int Len, double Km, int Size, int k)
   {

   double result;
   if( Size==0 )
   {
      double AvgRange=0;
             double Weight = 0;
             for (int i=Len-1;i>=0;i--)
             {
            if(MA_Mode==0) double alfa= 1.0; else alfa= 1.0*(Len-i)/Len;
            AvgRange+= alfa*(High-Low);
            Weight += alfa;
      }
             ATR0 = AvgRange/Weight;
       
        if (ATR0>ATRmax) ATRmax=ATR0;
        if (ATR0<ATRmin) ATRmin=ATR0;
       
        result=MathRound(0.5*Km*(ATRmax+ATRmin)/Point);
        }
        else
        result=Km*StepSize;
   
   return(result);
   }

//---- StepMA Calculation   
   
   double StepMACalc (bool HL, double Size, int k)
   {
   int counted_bars=IndicatorCounted();
   double result;
   
   if (HL)
          {
          smax=Low+2.0*Size*Point;
          smin=High-2.0*Size*Point;
   }        
        else       
          {
          smax=Close+2.0*Size*Point;
          smin=Close-2.0*Size*Point;
          }
          if (counted_bars==0){smax=smax;smin=smin;trend=0;}
          
          trend=trend;   
          
          if (Close>smax) trend=1;   
       
          if (Close<smin) trend=-1;
       
          if(trend>0)
          {
          if(smin<smin) smin=smin;
          result=smin+Size*Point;
          }
          else
          {
          if(smax>smax) smax=smax;
          result=smax-Size*Point;
          }
   //Print (" k=",k," trend=",trend, " res=",result," Smax=", smax, " Smin=", smin);
          
   
   return(result);
   }
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   string short_name;
//---- indicator line
   IndicatorBuffers(6);
   
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_LINE);
   
   SetIndexArrow(1,159);
   SetIndexArrow(2,159);
   
   SetIndexBuffer(0,LineBuffer);
   SetIndexBuffer(1,UpBuffer);
   SetIndexBuffer(2,DnBuffer);
   
   SetIndexShift(0,Advance);
   SetIndexShift(1,Advance);
   SetIndexShift(2,Advance);
   
   SetIndexBuffer(3,smin);
   SetIndexBuffer(4,smax);
   SetIndexBuffer(5,trend);
   
//---- name for DataWindow and indicator subwindow label
   short_name="StepMA("+Length+","+Kv+","+StepSize+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
   SetIndexLabel(1,"UpTrend");
   SetIndexLabel(2,"DownTrend");
//----
   SetIndexDrawBegin(0,Length);
   SetIndexDrawBegin(1,Length);
   SetIndexDrawBegin(2,Length);
//----
   return(0);
   }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                     |
//+------------------------------------------------------------------+
int deinit()
{
//----
   
//----
   return(0);
}   
//+------------------------------------------------------------------+
//| StepMA_v7.1                                                      |
//+------------------------------------------------------------------+
int start()
{
   int shift, counted_bars=IndicatorCounted();
   
   if ( BarsNumber > 0 ) int Nbars=BarsNumber; else Nbars=Bars;
   if ( counted_bars > 0 )limit=Bars-counted_bars;
   if ( counted_bars < 0 )return(0);
   if ( counted_bars ==0 )limit=Nbars-Length-1;
   
        for(shift=limit;shift>=0;shift--)
   {       
   
        int Step = StepSizeCalc( Length, Kv, StepSize, shift);
                               
        Comment (" StepSize= ", Step);
       
        StepMA = StepMACalc ( HighLow, Step, shift)+Percentage/100.0*Step*Point;
       
        if ( ColorMode == 0) LineBuffer=StepMA;
       
        if ( ColorMode == 1)
        {
        if ( trend>0 ) {UpBuffer=StepMA-Step*Point;DnBuffer=EMPTY_VALUE;}
        else
        if ( trend<0 ) {DnBuffer=StepMA+Step*Point;UpBuffer=EMPTY_VALUE;}
        }
        else
        if ( ColorMode == 2)
        {
        if (trend>0)
          {
          UpBuffer=StepMA;
          if ( trend < 0 ) UpBuffer = DnBuffer;
          DnBuffer=EMPTY_VALUE;
          }
          if (trend<0)
          {
          DnBuffer=StepMA;
          if ( trend > 0 ) DnBuffer = UpBuffer;
          UpBuffer=EMPTY_VALUE;
          }
        }
        else
        {       
        UpBuffer=EMPTY_VALUE; DnBuffer=EMPTY_VALUE;
        }
       
        }
        return(0);       
}

papiliolin 發表於 12-9-25 07:10

我認為如果拿來當階梯狀停利的工具...也許很適合

另外, 國外也有人用長短期的StepMA 交叉, 作為進場或出場的信號
頁: [1]
查看完整版本: 關於STEP moving average, 有人可以將MQ4的程式碼改為multicharts嗎?