//[i]Custom Moving Averages 汉译各类可选择均线
property copyright "2005-2015, MetaQuotes Software Corp."
property link "http://www.mql4.com"
property description "Moving Average"
property strict
property indicator_chart_window
property indicator_buffers 1
property indicator_color1 Red
//--- 可输入参数
input int 周期= 13;
input int 偏移= 0;
input ENUM_MA_METHOD 使用均线类型= MODE_SMA;
//--- 缓存组
double 均线组[];
//+------------------------------------------------------------------+
//| 初始化 |
//+------------------------------------------------------------------+
int OnInit(void)
{
string 名称;
int 始绘位=周期-1;
//--- 设置名称
switch(使用均线类型)
{
case MODE_SMA : 名称= "SMA("; break;
case MODE_EMA : 名称= "EMA("; 始绘位=0; break;
case MODE_SMMA : 名称= "SMMA("; break;
case MODE_LWMA : 名称= "LWMA("; break;
default : return(INIT_FAILED);
}
IndicatorShortName(名称+string(周期)+")");
IndicatorDigits(Digits);
//--- 检查参数
if(周期<2)
return(INIT_FAILED);
//--- 绘线设置
SetIndexStyle(0,DRAW_LINE);
SetIndexShift(0,偏移);
SetIndexDrawBegin(0,始绘位);
//--- indicator buffers mapping
SetIndexBuffer(0,均线组);
//--- 初始化成功
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 主函数 |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- 检查棒数是否足够
if(rates_total<周期-1 || 周期<2)
return(0);
//--- 从0到rates_total计数
ArraySetAsSeries(均线组,false);
ArraySetAsSeries(close,false);
//--- 棒数改变后第一次计算
if(prev_calculated==0)
ArrayInitialize(均线组,0);
//--- 选择后的子函数计算
switch(使用均线类型)
{
case MODE_EMA: EMA子(rates_total,prev_calculated,close); break;
case MODE_LWMA: LWMA子(rates_total,prev_calculated,close); break;
case MODE_SMMA: SMA子(rates_total,prev_calculated,close); break;
case MODE_SMA: MA子(rates_total,prev_calculated,close); break;
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| 简单均线MA子 |
//+------------------------------------------------------------------+
void MA子(int rates_total,int prev_calculated,const double &price[])
{
int i,limit;
//--- first calculation or number of bars was changed
if(prev_calculated==0)
{
limit=周期;
//--- calculate first visible value
double 首值=0;
for(i=0; i<limit; i++)
首值+=price[i];
首值/=周期;
均线组[limit-1]=首值;
}
else
limit=prev_calculated-1;
//--- main loop
for(i=limit; i<rates_total && !IsStopped(); i++)
均线组[i]= 均线组[i-1]+(price[i]-price[i-周期])/周期;
//---
}
//+------------------------------------------------------------------+
//| EMA子 |
//+------------------------------------------------------------------+
void EMA子(int rates_total,int prev_calculated,const double &price[])
{
int i,limit;
double 平滑因子=2.0/(1.0+周期);
//--- 首次计算
if(prev_calculated==0)
{
limit=周期;
均线组[0]=price[0];
for(i=1; i<limit; i++)
均线组[i]= price[i]平滑因子+均线组[i-1](1.0-平滑因子);
}
else
limit= prev_calculated-1;
//--- 主循环部分
for(i=limit; i<rates_total && !IsStopped(); i++)
均线组[i]= price[i]平滑因子+均线组[i-1](1.0-平滑因子);
//---
}
//+------------------------------------------------------------------+
//| 线型权重MA子 |
//+------------------------------------------------------------------+
void LWMA子(int rates_total,int prev_calculated,const double &price[])
{
int i,limit;
static int 权重和;
double 值和;
//--- 首次计算
if(prev_calculated==0)
{
权重和=0;
limit=周期;
//--- 首个图表值
double 首值=0;
for(i=0;i<limit;i++)
{
int k=i+1;
权重和+=k;
首值+=kprice[i];
}
首值/=(double)权重和;
均线组[limit-1]= 首值;
}
else
limit=prev_calculated-1;
//--- 主循环部分
for(i=limit; i<rates_total && !IsStopped(); i++)
{
值和=0;
for(int j=0;j<周期;j++)
值和 += (周期-j)price[i-j];
均线组[i]= 值和/权重和;
}
//---
}
//+------------------------------------------------------------------+
//| 平滑均线SMA子 |
//+------------------------------------------------------------------+
void SMA子(int rates_total,int prev_calculated,const double &price[])
{
int i,limit;
//--- 首次计算
if(prev_calculated==0)
{
limit=周期;
double 首值=0;
for(i=0; i<limit; i++)
首值+=price[i];
首值/=周期;
均线组[limit-1]=首值;
}
else
limit=prev_calculated-1;
//--- 主循环部分
for(i=limit; i<rates_total && !IsStopped(); i++)
均线组[i]=(均线组[i-1]*(周期-1)+price[i])/周期;
//---
}
//+------------------------------------------------------------------+
网友评论