COCO研究院

 找回密碼
 註冊
搜索
查看: 2678|回復: 1

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

[複製鏈接]
發表於 12-9-24 22:01 | 顯示全部樓層 |閱讀模式
這幾天在查資料時, 意外看到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 double  Kv          = 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 double  Percentage  = 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[k+i]-Low[k+i]);
            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[k]=Low[k]+2.0*Size*Point;
          smin[k]=High[k]-2.0*Size*Point;
     }        
        else           
          {
          smax[k]=Close[k]+2.0*Size*Point;
          smin[k]=Close[k]-2.0*Size*Point;
          }
          if (counted_bars==0){smax[limit+1]=smax[limit];smin[limit+1]=smin[limit];trend[limit+1]=0;}
          
          trend[k]=trend[k+1];   
          
          if (Close[k]>smax[k+1]) trend[k]=1;   
         
          if (Close[k]<smin[k+1]) trend[k]=-1;  
         
          if(trend[k]>0)
          {
          if(smin[k]<smin[k+1]) smin[k]=smin[k+1];
          result=smin[k]+Size*Point;
          }
          else
          {
          if(smax[k]>smax[k+1]) smax[k]=smax[k+1];
          result=smax[k]-Size*Point;
          }
     //Print (" k=",k," trend=",trend[k], " res=",result," Smax=", smax[k], " Smin=", smin[k]);
          
     
     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[shift]=StepMA;
       
        if ( ColorMode == 1)
        {
        if ( trend[shift]>0 ) {UpBuffer[shift]=StepMA-Step*Point;DnBuffer[shift]=EMPTY_VALUE;}
        else
        if ( trend[shift]<0 ) {DnBuffer[shift]=StepMA+Step*Point;UpBuffer[shift]=EMPTY_VALUE;}
        }
        else
        if ( ColorMode == 2)
        {
        if (trend[shift]>0)
          {
          UpBuffer[shift]=StepMA;
          if ( trend[shift+1] < 0 ) UpBuffer[shift+1] = DnBuffer[shift+1];
          DnBuffer[shift]=EMPTY_VALUE;
          }
          if (trend[shift]<0)
          {
          DnBuffer[shift]=StepMA;
          if ( trend[shift+1] > 0 ) DnBuffer[shift+1] = UpBuffer[shift+1];
          UpBuffer[shift]=EMPTY_VALUE;
          }
        }
        else
        {       
        UpBuffer[shift]=EMPTY_VALUE; DnBuffer[shift]=EMPTY_VALUE;
        }
       
        }
        return(0);       
} [/code]
STEPMA.png
 樓主| 發表於 12-9-25 07:10 | 顯示全部樓層
我認為如果拿來當階梯狀停利的工具...也許很適合

另外, 國外也有人用長短期的StepMA 交叉, 作為進場或出場的信號
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

手機版|Archiver|站長信箱|廣告洽詢|COCO研究院

GMT+8, 24-12-22 01:08

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回復 返回頂部 返回列表
理財討論網站 |