简介
很少有“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()
内部创建。
- “将元素的索引设置为序列,这和 MQL4 中是一样的”-
这意味着什么?在我们的示例中,我们使用元素索引作为时间序列。换言之,当前柱(尚未形成)始终具有索引
[0],上一个(已经形成)具有索引 [1],等等。
- 为什么要设置索引?我们使用索引是出于方便的考虑,同时为了优化算法的实施。MQL5 语言允许编程人员使用便利的索引。
- 为什么最好在函数 OnInit()
中创建指标?当然,您可以在程序的任何位置创建指标,因为没有任何规定明确禁止这样做。然而,有一个有利的论据支持所推荐的方式:函数
OnInit() 在“EA
交易”启动时调用一次,这足以执行指标的初始化,并且在执行过程中不会更改指标的参数。在改变指标输入参数的情况下,系统有可能在其
他函数的内部再次初始化指标,例如,在函数 OnTick() 中。
编程教程
几乎所有“EA 交易”都旨在执行交易操作,不仅是在模拟帐户上,同时也在真实帐户上。如果您想在其交易时实现无人值守,您应能预测到交易的所有可能 结果。即便是自动交易系统的资深开发人员也常常犯下恼人的错误。而犯错的代价可能极其高昂!
例如,这里有一个关于 2008 自动交易锦标赛的故事。参赛者之一的“EA 交易”应将他的存款增加到某个水平然后休眠。操作如期进行。接下来发生的事情让见证这一幕的作者和其他所有人员大吃一惊,& ldquo;EA 交易”被系统唤醒后开始再次交易,失去了赚得的资金。
当然,您肯定不希望在系统失控时经历同样的错误。因为,在 使用标准技术指标时我们需要考虑可能出现的问题:
- 对象指针在初始化代码块中创建。但如果创建不成功呢?在此情况下,我们将获得一个空的引用。因此,我们使用已由 MQL5 开发人员提供的可能性来检查其有效性。如果指针未创建,函数返回的处理函数值将为标准常量 INVALID_HANDLE = -1。
- 当我们从指标获取数据时,我们将其值复制到指标的缓冲区并用于计算。那如果失败了呢?如果复制失败,交易系统可能会生成错误的交
易信号。在这种情况下,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; }
总结
- 在 MQL5 的“EA 交易”中使用标准技术指标极为容易,和之前的版本并无二致。
- 仅在“EA 交易”中使用安全编程方法 - 分析和排除所有可能的错误。错误的代价极高,事关您的资金!