下载MetaTrader 5

MQL5 初学者:EA 交易技术指标使用指南

4 九月 2013, 13:26
Sergey Pavlov
0
2 772

简介

很少有“EA 交易”或指标未在代码中使用标准技术指标。无论是对交易策略的初学者还是高级开发人员,这些标准技术指标的使用都十分普遍。指标创建 的各种细节并不难理解;本文的目的即是帮助理解。我们将考虑使用内置标准技术指标的函数。

使用标准技术指标函数的基础

在调用时,每个技术指标函数创建一个使用指定的输入参数创 建的对象(指标的实例)的处理函数。处理函数的目的是使用该对象对其进行分配。这足以从指标缓冲区获取数据并将其用于自己的计算。考虑以下示例:

double      MA[];                // iMA指标的数组
int         MA_handle;           // iMA指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                      |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- 创建iMA指标
   MA_handle=iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE);
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
   //--- 用当前iMA的值填充MA[]数组
   //--- 复制100个元素
   CopyBuffer(MA_handle,0,0,100,MA);
   //--- 和MQL4一样,设置索引
   ArraySetAsSeries(MA,true);  
   //--- 这样您就能在MA[]数组中使用数据了,比如: 
   if(MA[0]>MA[1])
      {
      //--- 一些操作
      }
   }

正如我们看到的,一切都很简单。该示例说明了如何使用指标 iMA - 交易人员最常用的指标。

指标的处理函数应在函数 OnInit()
内部创建。

  1. “将元素的索引设置为序列,这和 MQL4 中是一样的”- 这意味着什么?在我们的示例中,我们使用元素索引作为时间序列。换言之,当前柱(尚未形成)始终具有索引 [0],上一个(已经形成)具有索引 [1],等等。
  2. 为什么要设置索引?我们使用索引是出于方便的考虑,同时为了优化算法的实施。MQL5 语言允许编程人员使用便利的索引。
  3. 为什么最好在函数 OnInit() 中创建指标?当然,您可以在程序的任何位置创建指标,因为没有任何规定明确禁止这样做。然而,有一个有利的论据支持所推荐的方式:函数 OnInit() 在“EA 交易”启动时调用一次,这足以执行指标的初始化,并且在执行过程中不会更改指标的参数。在改变指标输入参数的情况下,系统有可能在其 他函数的内部再次初始化指标,例如,在函数 OnTick() 中。

编程教程

几乎所有“EA 交易”都旨在执行交易操作,不仅是在模拟帐户上,同时也在真实帐户上。如果您想在其交易时实现无人值守,您应能预测到交易的所有可能 结果。即便是自动交易系统的资深开发人员也常常犯下恼人的错误。而犯错的代价可能极其高昂!

例如,这里有一个关于 2008 自动交易锦标赛的故事。参赛者之一的“EA 交易”应将他的存款增加到某个水平然后休眠。操作如期进行。接下来发生的事情让见证这一幕的作者和其他所有人员大吃一惊,& ldquo;EA 交易”被系统唤醒后开始再次交易,失去了赚得的资金。

当然,您肯定不希望在系统失控时经历同样的错误。因为,在 使用标准技术指标时我们需要考虑可能出现的问题:

  1. 对象指针在初始化代码块中创建。但如果创建不成功呢?在此情况下,我们将获得一个空的引用。因此,我们使用已由 MQL5 开发人员提供的可能性来检查其有效性。如果指针未创建,函数返回的处理函数值将为标准常量 INVALID_HANDLE = -1。
  2. 当我们从指标获取数据时,我们将其值复制到指标的缓冲区并用于计算。那如果失败了呢?如果复制失败,交易系统可能会生成错误的交 易信号。在这种情况下,MQL5 开发人员提供可能性以及时检查复制元素的数量。复制元素的数量在发生错误的情况下将会等于 -1。

现在我们考虑一下要如何编码:

//---- 指标对应的数组
double      MA[];                // iMA指标的数组
//---- 指标对应的句柄
int         MA_handle;           // iMA指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                      |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- 创建iMA指标
   MA_handle=iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE);
  //--- 报告在对象创建时出现错误
   if(MA_handle<0)
      {
      Print("iMA创建失败: MA_handle=",INVALID_HANDLE);
      Print("运行时错误 = ",GetLastError());
      //--- 强制程序终止
      return(-1);
      }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
    //--- 使用当前iMA的值填充MA[]数组
    //--- 应该向数组中写入100个元素
    //--- 如果出现错误,我们终止程序的执行
   if(CopyBuffer(MA_handle,0,0,100,MA)<=0) return;
   //--- 设置MA[]数组的索引方向为时间序列方向
   ArraySetAsSeries(MA,true);
   //--- 这样你就可以使用MA[]数组中的数据了
   if(MA[0]>MA[1])
      {
      //--- 一些操作
      }
  }

注意,对代码的一点点的改动就可以提高其安全性和可靠性。 然而,这还不够。将指标的值复制到数组这一过程现已得到改进,有必要使用如下编写的函数:

//+------------------------------------------------------------------------------+
//| 此函数复制指标中的数据, 其中的元素                                                |
//| 会根据输入参数asSeries来进行索引                                                 |
//+------------------------------------------------------------------------------+
bool CopyBufferAsSeries(
                        int handle,      // 指标句柄
                        int bufer,       // 缓冲区索引
                        int start,       // 起点索引
                        int number,      // 需要复制的元素数量
                        bool asSeries,   // 如果是true, 元素会按时间序列方式进行索引
                        double &M[]      // 目标数组
                        )
  {
//--- 使用当前指标值填充M数组
   if(CopyBuffer(handle,bufer,start,number,M)<=0) return(false);
//--- 元素会以如下方式进行索引:
//--- 如果asSeries=true, 会按照时间序列方式进行索引
//--- 如果asSeries=false, 会按照默认方式进行索引
   ArraySetAsSeries(M,asSeries);
//---
   return(true);
  }

函数 CopyBufferAsSeries 位于本文随附的文件 GetIndicatorBuffers.mqh 中。要使用该函数,必须在代码中添加指令 include。 需要将其复制到文件夹 ..\ MQL5\Include\ 中。调用指标 iMA 并将数据从指标的缓冲区复制到相应数组的最终代码如下所示:

#include <GetIndicatorBuffers.mqh>
//---- arrays for indicators
double      MA[];                // iMA指标的数组
//---- handles for indicators
int         MA_handle;           // iMA指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                      |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iMA指标
   MA_handle=iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE);
//--- 如果对象创建失败报告错误
   if(MA_handle<0)
     {
      Print("iMA创建失败: 运行时错误 =",GetLastError());
      //--- 强制程序退出
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用当前iMA的值填充MA数组
//--- 把MA[]数组索引方向设为和时间序列相同
//--- 如果出错则返回
   if(!CopyBufferAsSeries(MA_handle,0,0,100,true,MA)) return;
//--- here you can use the data of MA[] as you wish, for example: 
   if(MA[0]>MA[1])
     {
      //--- 一些操作
     }
  }

多缓冲区指标功能

我们将具有 3 个指标缓冲区的指标 iAlligator 作为示例:

  • 0 缓冲区 - GATORJAW_LINE
  • 1 缓冲区 - GATORTEETH_LINE
  • 2 缓冲区 - GATORLIPS_LINE

要通过一次调用从这些指标的缓冲区接收数据,我们将使用以下函数,这些函数可在本文随附的文件中找到:

//+------------------------------------------------------------------------------+
//| 此函数复制Alligator指标(鳄鱼指标)的值到三个数组中:                                 |
//| Jaws[], Teeth[], Lips[] (元素索引为时间序列).                                   |
//+------------------------------------------------------------------------------+
bool GetAlligatorBuffers(int Alligator_handle,
                         int start,
                         int number,
                         double &Jaws[],
                         double &Teeth[],
                         double &Lips[],
                         bool asSeries=true  // (元素索引为时间序列)
                         )
  {
//--- 使用当前GATORJAW_LINE的值填充Jaws数组
   if(!CopyBufferAsSeries(Alligator_handle,0,start,number,asSeries,Jaws)) return(false);
//--- 使用当前GATORTEETH_LINE的值填充Teeth数组
   if(!CopyBufferAsSeries(Alligator_handle,1,start,number,asSeries,Teeth)) return(false);
//--- 使用当前GATORLIPS_LINE的值填充Lips数组
   if(!CopyBufferAsSeries(Alligator_handle,2,start,number,asSeries,Lips)) return(false);
//---
   return(true);
  }

可以如下使用:

#include <GetIndicatorBuffers.mqh>
//---- 指标缓冲区
double      Jaws[];   // iAlligator的GATORJAWS_LINE的数组
double      Teeth[];  // iAlligator的GATORTEETH_LINE的数组
double      Lips[];   // iAlligator的GATORLIPS_LINE 的数组
//---- 指标句柄
int         Alligator_handle;           // iAlligator指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iAlligator指标
   Alligator_handle=iAlligator(NULL,0,13,8,8,5,5,3,MODE_EMA,PRICE_MEDIAN);
//--- 如果对象创建出错则报告
   if(Alligator_handle<0)
     {
      Print("iAlligator指标创建失败: 运行时错误 =",GetLastError());
      //--- 强制程序退出
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 设置数组索引为时间序列
//--- 使用Alligator指标数值填充数组
//--- 如果出错则返回
   if(!GetAlligatorBuffers(Alligator_handle,0,100,Jaws,Teeth,Lips,true)) return;
  }

所以,我们已将要点列出,现在我们可以考虑所有标准指标的示例。

标准指标使用示例


iAC

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      AC[];                // iAC指标对应的数组
//---- 指标句柄
int         AC_handle;           // iAC指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                      |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iAC指标
   AC_handle=iAC(NULL,0);
//--- 如果对象创建出错则报告
   if(AC_handle<0)
     {
      Print("iAC指标创建失败: 运行时错误 =",GetLastError());
      //--- 强制程序退出
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用当前iAC的值填充AC[]数组
//--- 设置AC[] 索引方向为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(AC_handle,0,0,100,true,AC)) return;
  }


iAD

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      AD[];                // iAD指标对应的数组
//---- 指标句柄
int         AD_handle;           // iAD指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iAD指标
   AD_handle=iAD(NULL,0,VOLUME_TICK);
//--- 如果对象创建出错则报告
   if(AD_handle<0)
     {
      Print("iAD指标创建失败: 运行时错误 =",GetLastError());
      //--- 强制程序退出
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iAD指标当前值填充AD[]数组
//--- 设置AD[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(AD_handle,0,0,100,true,AD)) return;
  }


iADX

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      Main[];    // iADX中MAIN_LINE对应的数组
double      PlusDI[];  // iADX中PLUSDI_LINE对应的数组
double      MinusDI[]; // iADX中MINUSDI_LINE对应的数组
//---- 指标句柄
int         ADX_handle;           // iADX指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iADX指标
   ADX_handle=iADX(NULL,0,14);
//--- 如果对象创建出错则报告
   if(ADX_handle<0)
     {
      Print("iADX指标创建失败: 运行时错误 =",GetLastError());
      //--- 强制程序退出
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 设置数组索引为时间序列
//--- 使用指标缓冲区的当前值填充数组
//--- 如果出错则返回 
   if(!GetADXBuffers(ADX_handle,0,100,Main,PlusDI,MinusDI,true)) return;
  }


iADXWilder

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      Main[];    // iADXWilder指标中的MAIN_LINE对应的数组
double      PlusDI[];  // iADXWilder指标中的PLUSDI_LINE对应的数组
double      MinusDI[]; // iADXWilder指标中的MINUSDI_LINE对应的数组
//---- handles for indicators
int         ADXWilder_handle;           // iADXWilder指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iADXWilder指标
   ADXWilder_handle=iADXWilder(NULL,0,14);
//--- 如果对象创建出错则报告
   if(ADXWilder_handle<0)
     {
      Print("创建 iADXWilder 指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序退出
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 设置数组索引方式为时间序列
//--- 使用所有指标对应缓冲区的当前值填充数组
//--- 如果出错则返回
   if(!GetADXWilderBuffers(ADXWilder_handle,0,100,Main,PlusDI,MinusDI,true)) return;
  }


iAlligator

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      Jaws[];   // iAlligator指标中GATORJAW_LINE对应的数组
double      Teeth[];  // iAlligator指标中GATORTEETH_LINE对应的数组
double      Lips[];   // iAlligator指标中GATORLIPS_LINE对应的数组
//---- 指标句柄
int         Alligator_handle;           // iAlligator指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                      |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iAlligator指标
   Alligator_handle=iAlligator(NULL,0,13,8,8,5,5,3,MODE_EMA,PRICE_MEDIAN);
//--- 如果对象创建出错则报告
   if(Alligator_handle<0)
     {
      Print("创建iAlligator指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序退出
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 设置数组索引方式为时间序列
//--- 使用所有指标缓冲区当前值填充到数组中
//--- 如果出错则返回
   if(!GetAlligatorBuffers(Alligator_handle,0,100,Jaws,Teeth,Lips,true)) return;
  }


iAMA

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      AMA[];                // iAMA指标对应的数组
//---- 指标句柄
int         AMA_handle;           // iAMA指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iAMA指标
   AMA_handle=iAMA(NULL,0,21,5,8,0,PRICE_CLOSE);
//--- 如果对象创建出错则报告
   if(AMA_handle<0)
     {
      Print("创建iAMA指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序退出
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iAMA指标缓冲区的当前值填充AMA[]数组
//--- 设置AMA[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(AMA_handle,0,0,100,true,AMA)) return;
  }


iAO

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      AO[];                // iAO指标对应的数组
//---- handles for indicators
int         AO_handle;           // iAO指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iAO指标
   AO_handle=iAO(NULL,0);
//--- 如果对象创建出错则报告
   if(AO_handle<0)
     {
      Print("iAO指标创建失败: 运行时错误 =",GetLastError());
      //--- 强制程序退出
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iAO指标当前值填充AO[]数组
//--- 设置AO[]数组索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(AO_handle,0,0,100,true,AO)) return;
  }


iATR

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      ATR[];                // iATR指标对应的数组
//---- 指标句柄
int         ATR_handle;           // iATR指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iATR指标
   ATR_handle=iATR(NULL,0,14);
//--- 如果创建对象出错则报告
   if(ATR_handle<0)
     {
      Print("iATR指标创建失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iATR指标当前值填充ATR[]数组
//--- 设置ATR[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(ATR_handle,0,0,100,true,ATR)) return;
  }


iBearsPower

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      BearsPower[];                // iBearsPower指标对应的数组
//---- 指标句柄
int         BearsPower_handle;           // iBearsPower指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iBearsPower指标
   BearsPower_handle=iBearsPower(NULL,0,14);
//--- 如果创建对象出错则报告
   if(BearsPower_handle<0)
     {
      Print("创建iBearsPower指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iBearsPower指标的当前值填充BearsPower[]数组
//--- 设置BearsPower[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(BearsPower_handle,0,0,100,true,BearsPower)) return;
  }


iBands

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      Base[];     // iBands中BASE_LINE对应的数组
double      Upper[];    // iBands中UPPER_BAND对应的数组
double      Lower[];    // iBands中LOWER_BAND对应的数组
//---- 指标句柄
int         Bands_handle;           // iBands指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                      |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iBands指标
   Bands_handle=iBands(NULL,0,144,0,2,PRICE_CLOSE);
//--- 如果创建对象出错则报告
   if(Bands_handle<0)
     {
      Print("创建iBands指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 设置数组索引方式为时间序列
//--- 使用所有指标缓冲区的当前值填充数组
//--- 如果出错则返回
   if(!GetBandsBuffers(Bands_handle,0,100,Base,Upper,Lower,true)) return;
  }


iBullsPower

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      BullsPower[];                // iBullsPower指标对应的数组
//---- 指标句柄
int         BullsPower_handle;           // iBullsPower指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iBullsPower指标
   BullsPower_handle=iBullsPower(NULL,0,14);
//--- 如果创建对象出错则报告
   if(BullsPower_handle<0)
     {
      Print("创建iBullsPower 失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iBullsPower指标的当前值填充BullsPower[]数组.
//--- 设置BullsPower[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(BullsPower_handle,0,0,100,true,BullsPower)) return;
  }


iCCI

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      CCI[];                // iCCI指标对应的数组
//---- 指标句柄
int         CCI_handle;           // iCCI指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                      |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iCCI指标
   CCI_handle=iCCI(NULL,0,14,PRICE_CLOSE);
//--- 如果对象创建出错则报告
   if(CCI_handle<0)
     {
      Print("创建iCCI指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iCCI指标的当前值填充CCI[]数组
//--- 设置CCI[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(CCI_handle,0,0,100,true,CCI)) return;
  }


iChaikin

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      Chaikin[];                // iChaikin指标对应的数组
//---- 指标句柄
int         Chaikin_handle;           // iChaikin指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iChaikin指标
   Chaikin_handle=iChaikin(NULL,0,8,14,MODE_EMA,VOLUME_TICK);
//--- 如果创建对象出错则报告
   if(Chaikin_handle<0)
     {
      Print("创建iChaikin指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iChaikin指标的当前值填充 Chaikin[]数组
//--- 设置Chaikin[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(Chaikin_handle,0,0,100,true,Chaikin)) return;
  }


iDEMA

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      DEMA[];                // iDEMA指标对应的数组
//---- 指标句柄
int         DEMA_handle;           // iDEMA指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iDEMA指标
   DEMA_handle=iDEMA(NULL,0,8,0,PRICE_CLOSE);
//--- 如果创建对象出错则报告
   if(DEMA_handle<0)
     {
      Print("创建iDEMA指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iDEMA指标的当前值填充 DEMA[]数组
//--- 设置DEMA[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(DEMA_handle,0,0,100,true,DEMA)) return;
  }


iDeMarker

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      DeMarker[];                // iDeMarker指标对应的数组
//---- 指标句柄
int         DeMarker_handle;           // iDeMarker指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iDeMarker指标
   DeMarker_handle=iDeMarker(NULL,0,21);
//--- 如果创建对象错误则报告
   if(DeMarker_handle<0)
     {
      Print("创建iDeMarker指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iDeMarker指标的当前值填充DeMarker[]数组.
//--- 设置DeMarker数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(DeMarker_handle,0,0,100,true,DeMarker)) return;
  }


iEnvelopes

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      Upper[];    // iEnvelopes指标中UPPER_LINE对应的数组
double      Lower[];    // iEnvelopes指标中LOWER_LINE对应的数组
//---- 指标句柄
int         Envelopes_handle;           // iEnvelopes指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iEnvelopes指标
   Envelopes_handle=iEnvelopes(NULL,0,14,0,MODE_SMA,PRICE_CLOSE,0.1);
//--- 如果对象创建出错则报告
   if(Envelopes_handle<0)
     {
      Print("创建iEnvelopes指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 设置数组索引方式为时间序列
//--- 如果出错则返回
//--- 使用iEnvelopes指标的当前值填充数组
   if(!GetEnvelopesBuffers(Envelopes_handle,0,100,Upper,Lower,true)) return;
  }


iForce

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      Force[];                // iForce指标对应的数组
//---- 指标句柄
int         Force_handle;           // iForce指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iForce指标
   Force_handle=iForce(NULL,0,21,MODE_SMA,VOLUME_TICK);
//--- 如果对象创建出错则报告
   if(Force_handle<0)
     {
      Print("创建iForce指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iForce指标的当前值填充Force[]数组
//--- 设置Force[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(Force_handle,0,0,100,true,Force)) return;
  }


iFractals

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      Upper[];    // iFractals中UPPER_LINE对应的数组
double      Lower[];    // iFractals中LOWER_LINE对应的数组
//---- 指标句柄
int         Fractals_handle;           // iFractals指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iFractals指标
   Fractals_handle=iFractals(NULL,0);
//--- 如果对象创建出错则报告
   if(Fractals_handle<0)
     {
      Print("创建iFractals指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 设置数组索引方式为时间序列
//--- 使用当前指标缓冲区的值填充数组
//--- 如果出错则返回
   if(!GetFractalsBuffers(Fractals_handle,0,100,Upper,Lower,true)) return;
  }


iFrAMA

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      FrAMA[];                // iFrAMA对应的数组
//---- 指标句柄
int         FrAMA_handle;           // iFrAMA指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iFrAMA指标
   FrAMA_handle=iFrAMA(NULL,0,21,0,MODE_SMA);
//--- 如果对象创建出错则报告
   if(FrAMA_handle<0)
     {
      Print("创建iFrAMA指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iFrAMA指标的当前值填充FrAMA[]数组
//--- 设置FrAMA[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(FrAMA_handle,0,0,100,true,FrAMA)) return;
  }


iGator

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      Upper[];    // iGator中UPPER_LINE对应的数组
double      Lower[];    // iGator中LOWER_LINE对应的数组
//---- 指标句柄
int         Gator_handle;           // iGator指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iGator指标
   Gator_handle=iGator(NULL,0,13,8,8,5,5,3,MODE_EMA,PRICE_MEDIAN);
//--- 如果创建对象出错则报告
   if(Gator_handle<0)
     {
      Print("创建iGator指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 设置数组索引方式为时间序列
//--- 使用指标缓冲区的当前值填充数组
//--- 如果出错则返回
   if(!GetGatorBuffers(Gator_handle,0,100,Upper,Lower,true)) return;
  }


iIchimoku

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double   Tenkansen[];   // iIchimoku中TENKANSEN_LINE对应的数组
double   Kijunsen[];    // iIchimoku中KIJUNSEN_LINE对应的数组
double   SenkouspanA[]; // iIchimoku中SENKOUSPANA_LINE对应的数组
double   SenkouspanB[]; // iIchimoku中SENKOUSPANB_LINE对应的数组
double   Chinkouspan[]; // iIchimoku中CHINKOUSPAN_LINE对应的数组
//---- 指标的句柄
int      Ichimoku_handle;            // iIchimoku指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iIchimoku指标
   Ichimoku_handle=iIchimoku(NULL,0,9,26,52);
//--- 如果对象创建出错则报告
   if(Ichimoku_handle<0)
     {
      Print("创建iIchimoku指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 设置数组索引方式为时间序列
//--- 使用指标缓冲区的当前值填充数组
//--- 如果出错则返回
   if(!GetIchimokuBuffers(Ichimoku_handle,0,100,
      Tenkansen,
      Kijunsen,
      SenkouspanA,
      SenkouspanB,
      Chinkouspan,
      true)) return;
  }


iBWMFI

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      BWMFI[];                // iBWMFI指标对应的数组
//---- 指标句柄
int         BWMFI_handle;           // iBWMFI指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iBWMFI指标
   BWMFI_handle=iBWMFI(NULL,0,VOLUME_TICK);
//--- 如果创建对象出错则报告
   if(BWMFI_handle<0)
     {
      Print("创建iBWMFI指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iBWMFI指标的当前值填充BWMFI[]数组
//--- 设置BWMFI[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(BWMFI_handle,0,0,100,true,BWMFI)) return;
  }


iMomentum

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      Momentum[];                // iMomentum指标对应的数组
//---- 指标句柄
int         Momentum_handle;           // iMomentum指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                      |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iMomentum指标
   Momentum_handle=iMomentum(NULL,0,14,PRICE_CLOSE);
//--- 如果创建对象出错则报告
   if(Momentum_handle<0)
     {
      Print("创建iMomentum指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iMomentum指标的当前值填充Momentum数组
//--- 设置Momentum[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(Momentum_handle,0,0,100,true,Momentum)) return;
  }

iMFI

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      MFI[];                // iMFI指标对应的数组
//---- 指标句柄
int         MFI_handle;           // iMFI指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                      |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iMFI指标
   MFI_handle=iMFI(NULL,0,14,VOLUME_TICK);
//--- 如果创建对象出错则报告
   if(MFI_handle<0)
     {
      Print("创建iMFI指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iMFI指标的当前值填充MFI[]数组
//--- 设置MFI[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(MFI_handle,0,0,100,true,MFI)) return;
  }


iMA

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      MA[];                // iMA指标对应的数组
//---- 指标句柄
int         MA_handle;           // iMA指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iMA指标
   MA_handle=iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE);
//--- 如果创建对象出错则报告
   if(MA_handle<0)
     {
      Print("创建iMA指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iMA指标的当前值填充MA[]数组
//--- 设置MA[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(MA_handle,0,0,100,true,MA)) return;
  }


iOsMA

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      OsMA[];                // iOsMA指标对应的数组
//---- 指标句柄
int         OsMA_handle;           // iOsMA指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iOsMA指标
   OsMA_handle=iOsMA(NULL,0,8,21,14,PRICE_MEDIAN);
//--- 如果创建对象出错则报告
   if(OsMA_handle<0)
     {
      Print("创建iOsMA指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iOsMA指标的当前值填充OsMA[]数组
//--- 设置OsMA[] 数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(OsMA_handle,0,0,100,true,OsMA)) return;
  }


iMACD

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      Main[];    // iMACD指标中MAIN_LINE对应的数组
double      Signal[];  //iMACD指标中SIGNAL_LINE对应的数组
//---- 指标句柄
int         MACD_handle;           // iMACD指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iMACD指标
   MACD_handle=iMACD(NULL,0,12,26,9,PRICE_CLOSE);
//--- 如果创建对象出错则报告
   if(MACD_handle<0)
     {
      Print("创建iMACD指标: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 设置数组索引方式为时间序列
//--- 使用指标缓冲区的当前值填充数组
//--- 如果出错则返回
   if(!GetMACDBuffers(MACD_handle,0,100,Main,Signal,true)) return;
  }

iOBV

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      OBV[];                // iOBV指标对应的数组
//---- 指标句柄
int         OBV_handle;           // iOBV指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iOBV指标
   OBV_handle=iOBV(NULL,0,VOLUME_TICK);
//--- 如果创建对象出错则报告
   if(OBV_handle<0)
     {
      Print("创建iOBV指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iOBV指标的当前值填充OBV[]数组
//--- 设置OBV[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(OBV_handle,0,0,100,true,OBV)) return;
  }

iSAR

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      SAR[];                // iSAR指标对应的数组
//---- 指标句柄
int         SAR_handle;           // iSAR指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iSAR指标
   SAR_handle=iSAR(NULL,0,0.02,0.2);
//--- 如果创建对象出错则报告
   if(SAR_handle<0)
     {
      Print("创建iSAR指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iSAR指标的当前值填充SAR[]数组
//--- 设置SAR[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(SAR_handle,0,0,100,true,SAR)) return;
  }

iRSI

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      RSI[];                // iRSI指标对应的数组
//---- 指标句柄
int         RSI_handle;           // iRSI指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iRSI指标
   RSI_handle=iRSI(NULL,0,21,PRICE_CLOSE);
//--- 如果创建对象失败则报告
   if(RSI_handle<0)
     {
      Print("创建iRSI指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iRSI指标的当前值填充RSI[]数组
//--- 设置RSI[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(RSI_handle,0,0,100,true,RSI)) return;
  }

iRVI

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      Main[];    // iRVI指标中MAIN_LINE对应的数组
double      Signal[];  // iRVI指标中SIGNAL_LINE对应的数组
//---- 指标句柄
int         RVI_handle;           // iRVI指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iRVI指标
   RVI_handle=iRVI(NULL,0,14);
//--- 如果对象创建出错则报告
   if(RVI_handle<0)
     {
      Print("创建iRVI指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 设置数组索引方式为时间序列
//--- 使用指标缓冲区当前值填充数组
//--- 如果出错则返回
   if(!GetRVIBuffers(RVI_handle,0,100,Main,Signal,true)) return;
  }

iStdDev

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      StdDev[];                // iStdDev对应的数组
//---- 指标句柄
int         StdDev_handle;           // iStdDev指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iStdDev指标
   StdDev_handle=iStdDev(NULL,0,20,0,MODE_SMA,PRICE_CLOSE);
//--- 如果创建对象出错则报告
   if(StdDev_handle<0)
     {
      Print("创建iStdDev指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iStdDev指标的当前值填充StdDev[]数组
//--- 设置StdDev[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(StdDev_handle,0,0,100,true,StdDev)) return;
  }


iStochastic

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      Main[];    // iStochastic指标中MAIN_LINE对应的数组
double      Signal[];  // iStochastic指标中SIGNAL_LINE对应的数组
//---- 指标句柄
int         Stochastic_handle;           // iStochastic指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iStochastic指标
   Stochastic_handle=iStochastic(NULL,0,5,3,3,MODE_SMA,STO_LOWHIGH);
//--- 如果对象创建出错则报告
   if(Stochastic_handle<0)
     {
      Print("创建iStochastic指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 设置数组的索引方式为时间序列
//--- 使用指标缓冲区的当前值填充到数组中
//--- 如果出错则返回
   if(!GetStochasticBuffers(Stochastic_handle,0,100,Main,Signal,true)) return;
  }


iTEMA

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      TEMA[];                // iTEMA指标对应的数组
//---- 指标句柄
int         TEMA_handle;           // iTEMA指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iTEMA指标
   TEMA_handle=iTEMA(NULL,0,20,0,PRICE_CLOSE);
//--- 如果创建对象出错则报告
   if(TEMA_handle<0)
     {
      Print("创建iTEMA指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iTEMA指标的当前值填充TEMA[]数组
//--- 设置TEMA[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(TEMA_handle,0,0,100,true,TEMA)) return;
  }


iTriX

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      TriX[];                // iTriX指标对应的数组
//---- 指标句柄
int         TriX_handle;           // iTriX指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iTriX指标
   TriX_handle=iTriX(NULL,0,20,PRICE_CLOSE);
//--- 如果创建对象出错则报告
   if(TriX_handle<0)
     {
      Print("创建iTriX指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iTriX指标的当前值填充TriX[]数组
//--- 设置TriX[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(TriX_handle,0,0,100,true,TriX)) return;
  }


iWPR

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      WPR[];                // iWPR指标对应的数组
//---- 指标句柄
int         WPR_handle;           // iWPR指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                      |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iWPR指标
   WPR_handle=iWPR(NULL,0,14);
//--- 如果创建对象出错则报告
   if(WPR_handle<0)
     {
      Print("创建iWPR 指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iWPR指标的当前值填充WPR[]数组
//--- 设置WPR[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(WPR_handle,0,0,100,true,WPR)) return;
  }


iVIDyA

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      VIDyA[];                // iVIDyA指标对应的数组
//---- handles for indicators
int         VIDyA_handle;           // iVIDyA指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iVIDyA指标
   VIDyA_handle=iVIDyA(NULL,0,14,21,0,PRICE_MEDIAN);
//--- 如果创建对象出错则报告
   if(VIDyA_handle<0)
     {
      Print("创建iVIDyA指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iVlDyA指标的当前值填充VIDyA[]数组
//--- 设置VIDyA[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(VIDyA_handle,0,0,100,true,VIDyA)) return;
  }


iVolumes

#include <GetIndicatorBuffers.mqh>
//---- 指标数组
double      Volumes[];                // iVolumes指标对应的数组
//---- 指标句柄
int         Volumes_handle;           // iVolumes指标的句柄
//+------------------------------------------------------------------+
//| EA初始化函数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建iVolumes指标
   Volumes_handle=iVolumes(NULL,0,VOLUME_TICK);
//--- 如果创建对象出错则报告
   if(Volumes_handle<0)
     {
      Print("创建iVolumes 指标失败: 运行时错误 =",GetLastError());
      //--- 强制程序终止
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| EA订单函数                                                        |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 使用iVolumes指标的当前值填充Volumes[]数组
//--- 设置Volumes[]数组的索引方式为时间序列
//--- 如果出错则返回
   if(!CopyBufferAsSeries(Volumes_handle,0,0,100,true,Volumes)) return;
  }

总结

  1. 在 MQL5 的“EA 交易”中使用标准技术指标极为容易,和之前的版本并无二致。
  2. 仅在“EA 交易”中使用安全编程方法 - 分析和排除所有可能的错误。错误的代价极高,事关您的资金!

本文译自 MetaQuotes Software Corp. 撰写的俄文原文
原文地址: https://www.mql5.com/ru/articles/31

附加的文件 |
EA 交易中的限制和验证 EA 交易中的限制和验证

是否可以在周一交易此交易品种?是否有足够的资金用于开仓?如果止损触发,损失有多大?如何限制挂单数量?交易操作在当前柱上执行还是在前一柱上执行?如果交易机器人无法执行此类验证,则任何交易策略可转为带来损失。本文说明在EA交易中有用的验证示例。

如何订购EA交易,并取得预期的结果 如何订购EA交易,并取得预期的结果

如何正确书写规格要求?当订购EA交易或指标时,什么是能从程序员那里期望得到的,什么是不能期望得到的?如何保持一个对话框,要特别注意什么时刻?本文给出这些以及其他许多对很多人来说并不那么显而易见的问题的答案。

MQL5 简介:如何编写简单的EA 交易和自定义指标 MQL5 简介:如何编写简单的EA 交易和自定义指标

相比 MQL4,MetaTrader 5 客户端的 MetaQuotes 编程语言 5 (MQL5) 具有许多新的发展潜力和更高的性能。本文将帮助您熟悉这一新的编程语言。文中给出了编写EA 交易和自定义指标的简单示例。我们还会涉及到 MQL5 语言的一些细节,这些细节对于理解示例是必要的。

交易系统的评估 - 有关进入、退出与交易效率的概述 交易系统的评估 - 有关进入、退出与交易效率的概述

有很多指标可用于确定一个交易系统的效率和盈利能力。但是,交易者始终会将任何系统推向一个新的崩溃测试。本文讲述基于效率指标的统计如何用于 MetaTrader 5 平台。它包含一个类,该类用于将成交统计解释转变成与 S.V. Bulashev 所著《Statistika dlya traderov(面向交易者的统计)》一书不冲突的一种解释。它还包括一个用于优化的自定义函数示例。