调用技术指标函数
指标线 是根据指标数组中的数值,以图形方式表示数据某种关系的线。
指标数组 是一维数组,其中的数据用于画出指标票线。数组成员是构成指标线的“点”的坐标。每个点的Y轴坐标,是数组成员的值;X坐标是成员在数组中的位置。每个内建技术指标都有自己的名称。应用程序调用它们,得到数组某个索引位置的成员数据。
运行指标函数时,并不要求、也不会导致该指标在主图或副图中显示。指标的显示,也不会影响应用程序。 |
MT4在线交易系统的客户终端,有许多技术指标 。我们来分析几个:
平移指标 MA
平移指标 MA 表示交易对象在某一时期的平均价格。
获取平移指标,要用函数:
double iMA(string symbol, int timeframe, int period, int ma_shift,
int ma_method, int applied_price, int shift)
参数:
symbol - 交易对象的名称。用 NULL 表示是当前交易对象;
timeframe - K线图周期。用 0 表示当前周期;
period - 指标计算的时间范围;
ma_shift - 相对于主图的指标变化;
ma_method - 计算平均值的方法;
applied_price - 计算用到的价格类型(如收盘价/开盘价、最高价/最低价);
shift - 数据在数组中的索引位置。
下面是“操盘手” callindicator.mq4 中调用技术指标函数的示例:
//--------------------------------------------------------------------
// callindicator.mq4
// 程序仅用于教学
//--------------------------------------------------------------------
extern int Period_MA = 21; // 指标计算周期
bool Fact_Up = true; // 以均线为准,价格是上升还是下降
bool Fact_Dn = true;
//--------------------------------------------------------------------
int start() // 特别函数 start()
{
double MA; // 指标当前值(0 柱)
//--------------------------------------------------------------------
// 调用指标函数
MA=iMA(NULL,0,Period_MA,0,MODE_SMA,PRICE_CLOSE,0);
//--------------------------------------------------------------------
if (Bid > MA && Fact_Up == true) // 价格高于平均线
{
Fact_Dn = true; // 认定价格高于平均线
Fact_Up = false; // 认定价格不低于平均线
Alert("Price is above MA(",Period_MA,").");// 提醒
}
//--------------------------------------------------------------------
if (Bid < MA && Fact_Dn == true) // 价格低于平均线
{
Fact_Up = true; // 认定价格高于平均线
Fact_Dn = false; // 认定价格不高于平均线
Alert("Price is below MA(",Period_MA,").");// 提醒
}
//--------------------------------------------------------------------
return; // 退出 start()
}
//--------------------------------------------------------------------
仔细分析下这个“操盘手”中的核心部分,调用的指标函数:
MA=iMA(NULL,0,Period_MA,0,MODE_SMMA,PRICE_CLOSE,0);
NULL 表示,指标的计算发生在“操盘手”所在的主图;
0 - 表示“操盘手”所在主图的当前K线周期;
Period_MA - 如果“操盘手”未赋新值,这个外部变量的预设默认值为 5;
0 - 指标数组的数据,是当前主图画线用的,没有变化;
MODE_SMA - 指标计算时用的方法:简单平移;
PRICE_CLOSE - 指标计算时用的价格是收盘价;
0 - 指标成员位置索引。
图. 105. 操盘手 callindicator.mq4 运行结果
以上计算过程和结果,是以指标数组的第一个成员(0柱)为基础的。
指标计算有时需要用到“历史数据”,涉及指标数组的其他成员。例如,“操盘手”historybars.mq4,用到第4个柱子:
//--------------------------------------------------------------------
// historybars.mq4
// 程序仅用于教学
//--------------------------------------------------------------------
extern int Period_MA = 5; // Calculated MA period
//--------------------------------------------------------------------
int start() // 特别函数start()
{
double MA_c, // MA指标第 0 柱的值
MA_p, // MA指标第 4 柱的值
Delta; // 第0柱与第4柱的值差
//--------------------------------------------------------------------
// 调用技术指标
MA_c = iMA(NULL,0,Period_MA,0,MODE_SMA,PRICE_CLOSE,0);
MA_p = iMA(NULL,0,Period_MA,0,MODE_SMA,PRICE_CLOSE,4);
Delta = (MA_c - MA_p)/Point; // 第0柱与第4柱的值差
//--------------------------------------------------------------------
if (Delta > 0 ) // 当前价格大于先前
Alert("On 4 bars MA increased by ",Delta,"pt"); // 提醒
if (Delta < 0 ) // 当前价格小于先前
Alert("On 4 bars MA decreased by ",-Delta,"pt");// 提醒
//--------------------------------------------------------------------
return; // 退出 start()
}
//--------------------------------------------------------------------
图. 106.操盘手 historybars.mq4 运行结果
技术指标不仅可以用一条线表示,还能用多条线表示。
随机震荡指标(JDK)
通常它以2条线表示。主线叫 %K,信号线叫 %D 。%D 是 %K 的移动平均线。%K 常画成实线,%D 常画成虚线。%K 大于 %D 时,买进;%K 小于 %D 时卖出。
double iStochastic(string symbol, int timeframe, int %Kperiod, int %Dperiod,
int slowing, int method, int price_field,int mode, int shift)
参数:
symbol 交易对象名称。值为 NULL 时,是当前主图交易对象;
timeframe - K线图周期。用 0 表示当前周期;
%Kperiod - %线的计算范围(柱子数目);
%Dperiod - 平均线 %D 的计算范围;
slowing - value of slowing.
method - 计算平均值用到的 MA 指标的方法;
price_field - 价格范围。有2个值:0 - 最低价/最高价,1 - 开盘价/收盘价;.
mode - 指标线索引。有2个值:MODE_MAIN 或 MODE_SIGNAL;
shift - 数据在数组中的索引位置。
在A点绿线上穿红线时,应当卖单平仓、买单建仓。A点至B点,是持仓时段。在B点绿线下穿红线时,应当买单平仓、卖单建仓。
图. 107. 随机震荡指标主线与信号线的关系
下面是该指标的用例callstohastic.mq4:
//--------------------------------------------------------------------
// callstohastic.mq4
// 程序仅用于教学
//--------------------------------------------------------------------
int start() // 特别函数 start()
{
double M_0, M_1, // 指标主线第0柱和1柱的值
S_0, S_1; // 指标信号线第0柱和1柱的值
//--------------------------------------------------------------------
// 调用指标函数
M_0 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN, 0);// 0 柱
M_1 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN, 1);// 1 柱
S_0 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,0);// 0 柱
S_1 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,1);// 1 柱
//--------------------------------------------------------------------
// 分析数据
if( M_1 < S_1 && M_0 >= S_0 ) // 绿线上穿红线
Alert("Crossing upwards. BUY."); // 提醒
if( M_1 > S_1 && M_0 <= S_0 ) // 绿线下穿红线
Alert("Crossing downwards. SELL."); // 提醒
if( M_1 > S_1 && M_0 > S_0 ) // 绿线在红线上方
Alert("Continue holding Buy position."); // 提醒
if( M_1 < S_1 && M_0 < S_0 ) // 绿线在红线下方
Alert("Continue holding Buy position."); // 提醒
//--------------------------------------------------------------------
return; // 退出 start()
}
//--------------------------------------------------------------------
图. 108. callstohastic.mq4 运行结果
在“操盘手”和脚本中使用技术指标,非常方便。在“操盘手”中使用的指标数目,没有限制。