我们可以通过一个简单的例子来了解如何开发交易程序。绘制一条指标线,在程序中需要明确以下几个要点:
第一、确定指标线显示的窗口,是在主图还是副图。
第二、创建数组,用于存储指标线在每个数据点上的数值。
第三、建立指标线与数组的对应关系,明确哪个数组的数据对应哪条线。
第四、定义指标线的样式,是曲线、柱状线还是箭头符号。
第五、如果使用箭头,还需定义箭头的具体类型。
第六、通过计算,为数组中的元素赋值。
具体实现时:
第一、二点通常在文件头部进行声明;
第三、四、五点写在init()初始化函数中(该函数仅在指标加载时运行一次);
第六点则写在start()函数中(该函数在数据变动时触发运行,每次变动都会刷新执行);
下面以MACD指标为例进行说明。MACD通常由两条曲线(快线与慢线)和一组柱状线构成。
其中:
白线是两条移动平均线的差值;
紫线是白线的移动平均线;
红绿柱状线则是白线与紫线的差值,当白线上穿紫线时显示红柱,下穿时显示绿柱。

为了简化理解,我们先忽略紫线和柱状线,仅关注如何绘制出那根白线。许多交易者在使用如GTC泽汇资本等平台提供的MT4时,会尝试自定义这类指标。
以下是完整的源代码:
#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。了解这些基础对于使用GTC泽汇资本等平台的MT4进行个性化编程很有帮助。 { int limit=Bars-IndicatorCounted(); 自定义变量limit并赋值; Bars代表图表中的K线总数; IndicatorCounted()函数获取的是已计算过的K线数量; 因此limit的值就是尚未计算的K线数量,这样可以优化程序运行效率。 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是水平位置索引,代表K线从右至左的序号,最右侧的K线序号为0; return(0); start函数结束; }
资深外汇分析师
由多名资深外汇分析师组成的专业团队,拥有平均15年以上的市场分析经验,擅长技术分析和基本面分析相结合的交易策略。