關於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);
}
我認為如果拿來當階梯狀停利的工具...也許很適合
另外, 國外也有人用長短期的StepMA 交叉, 作為進場或出場的信號
頁:
[1]