//+------------------------------------------------------------------+
//| MultiMA.mq4 |
//| Custom Multi Moving Average Indicator |
//+------------------------------------------------------------------+
#property strict
#property indicator_chart_window // 将指标显示在主图窗口中
// 定义均线周期
input int MA1_Period = 5; // 第一条均线周期(5)
input int MA2_Period = 13; // 第二条均线周期(13)
input int MA3_Period = 144; // 第三条均线周期(144)
input int MA4_Period = 169; // 第四条均线周期(169)
input int MA5_Period = 288; // 第五条均线周期(288)
input int MA6_Period = 338; // 第六条均线周期(338)
// 定义均线类型
input int MA_Method = MODE_SMA; // 均线类型:MODE_SMA(简单移动平均), MODE_EMA(指数移动平均), MODE_SMMA(平滑移动平均), MODE_LWMA(线性加权移动平均)
// 定义均线价格类型
input int MA_Price = PRICE_CLOSE; // 价格类型:PRICE_CLOSE(收盘价), PRICE_OPEN(开盘价), PRICE_HIGH(最高价), PRICE_LOW(最低价)等
// 定义均线颜色
color MA1_Color = clrRed; // 第一条均线颜色(红色)
color MA2_Color = clrRed; // 第二条均线颜色(红色)
color MA3_Color = clrYellow; // 第三条均线颜色(黄色)
color MA4_Color = clrYellow; // 第四条均线颜色(黄色)
color MA5_Color = clrGreen; // 第五条均线颜色(绿色)
color MA6_Color = clrGreen; // 第六条均线颜色(绿色)
// 定义缓冲区
double MA1_Buffer[]; // 第一条均线的数据缓冲区
double MA2_Buffer[]; // 第二条均线的数据缓冲区
double MA3_Buffer[]; // 第三条均线的数据缓冲区
double MA4_Buffer[]; // 第四条均线的数据缓冲区
double MA5_Buffer[]; // 第五条均线的数据缓冲区
double MA6_Buffer[]; // 第六条均线的数据缓冲区
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//| 自定义指标初始化函数 |
//+------------------------------------------------------------------+
int OnInit()
{
// 设置指标窗口
IndicatorBuffers(6); // 设置6个缓冲区
IndicatorShortName("MultiMA"); // 设置指标名称
// 设置均线1
SetIndexBuffer(0, MA1_Buffer); // 将缓冲区0与MA1_Buffer关联
SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2, MA1_Color); // 设置均线1的样式:实线,线宽为2,颜色为红色
SetIndexLabel(0, "MA " + IntegerToString(MA1_Period)); // 设置均线1的标签
// 设置均线2
SetIndexBuffer(1, MA2_Buffer); // 将缓冲区1与MA2_Buffer关联
SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 2, MA2_Color); // 设置均线2的样式:实线,线宽为2,颜色为红色
SetIndexLabel(1, "MA " + IntegerToString(MA2_Period)); // 设置均线2的标签
// 设置均线3
SetIndexBuffer(2, MA3_Buffer); // 将缓冲区2与MA3_Buffer关联
SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 2, MA3_Color); // 设置均线3的样式:实线,线宽为2,颜色为黄色
SetIndexLabel(2, "MA " + IntegerToString(MA3_Period)); // 设置均线3的标签
// 设置均线4
SetIndexBuffer(3, MA4_Buffer); // 将缓冲区3与MA4_Buffer关联
SetIndexStyle(3, DRAW_LINE, STYLE_SOLID, 2, MA4_Color); // 设置均线4的样式:实线,线宽为2,颜色为黄色
SetIndexLabel(3, "MA " + IntegerToString(MA4_Period)); // 设置均线4的标签
// 设置均线5
SetIndexBuffer(4, MA5_Buffer); // 将缓冲区4与MA5_Buffer关联
SetIndexStyle(4, DRAW_LINE, STYLE_SOLID, 2, MA5_Color); // 设置均线5的样式:实线,线宽为2,颜色为绿色
SetIndexLabel(4, "MA " + IntegerToString(MA5_Period)); // 设置均线5的标签
// 设置均线6
SetIndexBuffer(5, MA6_Buffer); // 将缓冲区5与MA6_Buffer关联
SetIndexStyle(5, DRAW_LINE, STYLE_SOLID, 2, MA6_Color); // 设置均线6的样式:实线,线宽为2,颜色为绿色
SetIndexLabel(5, "MA " + IntegerToString(MA6_Period)); // 设置均线6的标签
return(INIT_SUCCEEDED); // 初始化成功
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//| 自定义指标计算函数 |
//+------------------------------------------------------------------+
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[])
{
// 计算均线
for(int i = 0; i < rates_total; i++)
{
MA1_Buffer[i] = iMA(NULL, 0, MA1_Period, 0, MA_Method, MA_Price, i); // 计算第一条均线
MA2_Buffer[i] = iMA(NULL, 0, MA2_Period, 0, MA_Method, MA_Price, i); // 计算第二条均线
MA3_Buffer[i] = iMA(NULL, 0, MA3_Period, 0, MA_Method, MA_Price, i); // 计算第三条均线
MA4_Buffer[i] = iMA(NULL, 0, MA4_Period, 0, MA_Method, MA_Price, i); // 计算第四条均线
MA5_Buffer[i] = iMA(NULL, 0, MA5_Period, 0, MA_Method, MA_Price, i); // 计算第五条均线
MA6_Buffer[i] = iMA(NULL, 0, MA6_Period, 0, MA_Method, MA_Price, i); // 计算第六条均线
}
// 调试输出
Print("MA1 Value: ", MA1_Buffer[0]); // 输出第一条均线的值
Print("MA2 Value: ", MA2_Buffer[0]); // 输出第二条均线的值
Print("MA3 Value: ", MA3_Buffer[0]); // 输出第三条均线的值
Print("MA4 Value: ", MA4_Buffer[0]); // 输出第四条均线的值
Print("MA5 Value: ", MA5_Buffer[0]); // 输出第五条均线的值
Print("MA6 Value: ", MA6_Buffer[0]); // 输出第六条均线的值
return(rates_total); // 返回计算的总K线数
}
|