《MQL4实用编程》读书笔记(6) - 简单编程:使用技术指标

调用技术指标函数

指标线 是根据指标数组中的数值,以图形方式表示数据某种关系的线。

指标数组 是一维数组,其中的数据用于画出指标票线。数组成员是构成指标线的“点”的坐标。每个点的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 运行结果

在“操盘手”和脚本中使用技术指标,非常方便。在“操盘手”中使用的指标数目,没有限制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值