一、脚本篇
void OnStart()
{
printf("Start.");
}
包含脚本的主函数部分,将脚本拖入图表时自动执行其内部的代码。
二、EA篇
int OnInit()
{
return(INIT_SUCCEEDED);
}
初始化函数。将EA拖入图表时,在点击参数窗口的确认键后,自动运行一次该初始化函数内部的代码。
void OnDeinit(const int reason)
{
}
切换EA图表周期或产品、更改正在运行的EA的参数、移除正在运行EA或图表等操作均触发执行此函数。其中,reason参数返回的是OnDeinit()函数执行的原因代码。
EventSetTimer(60);
void OnTimer()
{
}
定时器功能。首先输入定时器时间代码(60代表每60秒),也即间隔多久时间执行一次。执行内容写入VOnTimer()函数中。
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
}
感应用户在客户端图表上的动作,一旦感应到相应动作,就自动执行OnChartEvent()内部的代码。相应动作通过四个参数定义,id代表相应动作的类型,lparam、dparam、sparam三个参数用于存放所捕获对象的参数,例如,需要在趋势线被选中时执行代码,那么sparam可以用于存储趋势线的名字。
示例:
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//---
if(id==CHARTEVENT_KEYDOWN)
{
if(lparam=='j'|| lparam=='J')
{
changetimeframes();
}
}
}
//+------------------------------------------------------------------+
void changetimeframes()
{
ENUM_TIMEFRAMES timeframes=PERIOD_CURRENT;
switch(Period())
{
case PERIOD_D1:
timeframes=PERIOD_H4; break;
case PERIOD_H4:
timeframes=PERIOD_H1; break;
case PERIOD_H1:
timeframes=PERIOD_M30; break;
case PERIOD_M30:
timeframes=PERIOD_M15; break;
}
if(timeframes!=PERIOD_CURRENT)
{
ChartSetSymbolPeriod(0,NULL,timeframes);
}
}
上面例子中,在加载EA后,当键盘按下J键时,立刻执行图表大周期切换到较小周期的操作。
三、指标篇
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[])
{
return(rates_total);
}
rates_total:图表上目前共加载了多少根K线
prev_calculated:计算过的K线有多少根