[MT4指标]编程参考 MT4 自定义指标 MACD 源代码中文注释
#include
///////////////////////////////////////////////////////////////////////////////////////////
// 指标属性的设置
#property indicator_separate_window // 独立窗口,副图显示
#property indicator_buffers 2 // 2个缓冲区分配内存,有方向指向意义(最多为8个[0,7])
#property indicator_color1 Silver // 银色
#property indicator_color2 Red // 红色
#property indicator_width1 2 // 线宽
// 指标参数
input int InpFastEMA=12; // Fast EMA Period 快线
input int InpSlowEMA=26; // Slow EMA Period 慢线
input int InpSignalSMA=9; // Signal SMA Period 平均信号周期
// 2个缓冲数组变量定义
double ExtMacdBuffer; //线数组,第1个缓冲区,索引为0
double ExtSignalBuffer; //柱数组,第2个缓冲区,索引为1
//--- right input parameters flag //输入参数标志
bool ExtParameters=false; //初始化拓展参数=假
// 自定义指标初始化功能 代码区
int OnInit(void)
{
// 指标精度格式(小数点后的位数计数),当前标的的小数位数+1,货币为5或3,黄金原油为2,后+1
IndicatorDigits(Digits+1);
// 指标在副图上画线设置相关参数,包括类型、样式、宽度和颜色
SetIndexStyle(0,DRAW_HISTOGRAM); // 第1个,0号索引位,绘制柱状
SetIndexStyle(1,DRAW_LINE); // 第2个,1号索引位,绘制曲线
SetIndexDrawBegin(1,InpSignalSMA); // 设置指标线起始位置,从左向右根据K线画,第2个,从左边第9根K线向当前K线画,这里InpSignalSMA=9
// 指标画线与缓冲区连接映射
SetIndexBuffer(0,ExtMacdBuffer); // 第1个缓冲区,索引为0,绑定第1个,0号索引位,绘制柱状
SetIndexBuffer(1,ExtSignalBuffer); // 第2个缓冲区,索引为1,绑定第2个,1号索引位,绘制曲线
// 副图窗口设置命名和指标实时参数的标签
IndicatorShortName("MACD("+IntegerToString(InpFastEMA)+","+IntegerToString(InpSlowEMA)+","+IntegerToString(InpSignalSMA)+")"); //指标窗口命名显示,并转换成字符串拼接起来,如MACD(12,26,9)
SetIndexLabel(0,"MACD"); // 第1个缓冲区,索引为0,绑定第1个,0号索引位,绘制柱状将标签为MCAD
SetIndexLabel(1,"Signal"); // 第2个缓冲区,索引为1,绑定第2个,1号索引位,绘制曲线将标签为Signal
// 检查输入的初始参数
if(InpFastEMA<=1 || InpSlowEMA<=1 || InpSignalSMA<=1 || InpFastEMA>=InpSlowEMA) //快、慢、信号线不能小于等于1,快线不能大于等于慢线(时间短,反应快;时间长,反应慢)
{
Print("Wrong input parameters"); // 打印输出Wrong input parameters
ExtParameters=false; // 初始化拓展参数还是=假
return(INIT_FAILED); // 返回初始化失败
}
else
{
ExtParameters=true; //初始化拓展参数还是=真
}
// 返回初始化成功
return(INIT_SUCCEEDED);
}
// 移动平均聚散
int OnCalculate (const int rates_total, // 当前图形上K线的总个数
const int prev_calculated, // 上次计算到第几根K线了
const datetime& time, // 内置时间数组
const double& open, // 内置开盘价数组
const double& high, // 内置最高价数组
const double& low, // 内置最低价数组
const double& close, // 内置收盘价数组
const long& tick_volume, // 内置单位时间内的Tciku时序数组
const long& volume, // 内置成交量数组
const int& spread) // 内置点差数组
{
int i,limit;
// 图表上显示的K线总数<=InpSignalSMA9时或ExtParameters为假时,返回最后的K线数量
if(rates_total<=InpSignalSMA || !ExtParameters)
{
return(0);
}
// 返回最后被计算的K线数量 --->> K线是一根根的产生的,如果不动图表窗口,limit始终为1
limit=rates_total-prev_calculated; //图表上显示的K线总数-前面已经计算过的数量=得出剩下将要计算的K线数量
// 前面已经计算过的数量存在且大于0时,要计算的K线始终循环进行
if(prev_calculated>0)
{
limit++;
}
// 第1个缓冲区MACD计算
// 循环还在计算的K线数量limit值,并存入缓冲区冲 —->>借助MA均线计算函数来计算
for(i=0; i,将来自 price 数组的简单移动平均线的值输出到数组 ExtSignalBuffer中
SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
// 返回K线总量
return(rates_total);
}
//+------------------------------------------------------------------+