现在,我们通过一个简单的实例,来演示如何在GMI外汇平台的MT4环境下进行指标线开发。要绘制一条指标线,只需在程序中明确以下几个步骤即可:
第一、确定指标线所在的窗口,是主图还是副图。
第二、创建数组,用于存储指标线在各个位置上的数值。
第三、建立指标线与数组的对应关系(函数关系、运算关系),明确哪个数组中的数据显示哪条指标线。
第四、定义指标线的线型,是曲线、柱线还是箭头。
第五、如果指标线是箭头,还需要指定具体的箭头类型。
第六、通过运算,为数组赋值。
其中:
第一、二条写在文件头部;
第三、四、五条写在init()初始化函数中(init函数仅在指标加载时运行一次);
第六条写在start()函数中(start函数在数据发生变动时运行,每变动一次便刷新执行一次);
下面我们以MACD为例进行说明。MACD指标由两条曲线(快线和慢线)以及一组红绿柱线组成(下图一)。
其中:
白线是两根均线的差值;
紫线是白线的移动平均线;
红绿柱线则是白线与紫线的差值,白线上穿紫线出现红柱,下穿则出现绿柱。

我们从简单入手,先去掉紫线和红绿柱线,仅保留其中的白线,来看白线是如何绘制的。
下面是源代码的全部语句:
#property indicator_separate_window
#property indicator_color1 White
#property indicator_level1 0
extern int FMA=12;
extern int SMA=26;
double buf[];
int init()
{
SetIndexBuffer(0,buf);
SetIndexStyle(0,DRAW_LINE);
return(0);
}
int start()
{
int limit=Bars-IndicatorCounted();
for(int i=0; i { buf= iMA(NULL,0,FMA,0,1,0,i) -iMA(NULL,0,SMA,0,1,0,i); } return(0); } 说明如下: ============================================== ============================================== 以下为上述语句的简要说明: #property indicator_separate_window 指标放置在副图; #property indicator_color1 White 第一条指标线为白色; #property indicator_level1 0 在副图中零值位置绘制一条水平横线; extern int FMA=12; extern int SMA=26; 定义两个整数型变量,默认值分别为12和26,允许外部修改 double buf[]; 创建一个数组 int init() 初始化函数。该函数仅在指标加载时运行一次。init是系统默认的函数名,但使用时仍需进行声明,因此要加上定义符int; { SetIndexBuffer(0,buf); 设置数组buf为第一条指标线 SetIndexStyle(0,DRAW_LINE); 设置第一条指标线的线型为连续曲线 return(0); 函数结束语句 } int start() 指标触发函数。与init函数不同,该函数在行情数据发生变化时被触发,若数据不断更新,则函数会不断执行。start也是系统默认的函数名,使用时仍需声明,所以同样要加定义符int。 { int limit=Bars-IndicatorCounted(); 自定义变量limit,并为其赋值 Bars表示图表中的柱数(K线数量) IndicatorCounted()函数调用的是缓存中已经计算过的柱数。 这样limit的值就是尚未计算的柱数,从而起到优化程序的作用。 for(int i=0; i 该句为循环语句。 循环从i=0开始,每循环一次i增加1,直到i 由于循环变量i是一个新变量,因此在此处声明,并加上整型变量声明符int 下面大括号中为循环体,本例中只包含一条语句 { buf= iMA(NULL,0,FMA,0,1,0,i) -iMA(NULL,0,SMA,0,1,0,i); } 给数组buf赋值,其值为对应位置上两条均线计算出的差值 i是水平位置索引值,即烛柱从右到左的序号,最右侧第一根烛柱序号为0 return(0); start函数结束 }
资深外汇分析师
由多名资深外汇分析师组成的专业团队,拥有平均15年以上的市场分析经验,擅长技术分析和基本面分析相结合的交易策略。