FXCG投资网

针对初学者以 MQL5 编写“EA 交易”的分步指南

mt5平台开户 2022-04-01 19:27110未知admin

  针对初学者以 MQL5 编写“EA 交易”的分步指南 - MQL5文章本文的目的受众是念要练习怎样以全新的 MQL5 发言编写大略“EA 营业”的初学者。最初,咱们将界说咱们的 EA(EA 营业)的功 能,接下来是 EA 怎样告终这些功用。

  EA 将看管一个特定的目标,当知足某一条目时(或知足某些条目时),它将基于目今知足的条目举办营业(卖出/出售或买 入/采办)。

  以上被称之为营业战术。您必需最初开辟您念要 EA 主动实践的战术,然后您才具编写 EA。于是正在这种情形下,让咱们改正上述 语句以使其响应咱们念要正在 EA 中开辟的战术。

  咱们将操纵功夫周期为 8、名为“挪动均匀线”(Moving Average) 的目标(您能够选拔轻易功夫周期,但出于战术的思虑咱们 将操纵 8)。 当“挪动均匀线”(为轻易阐述,下文将其简称为 MA-8)向上渐增且价值收正在 MA-8 之上时,咱们愿望咱们的 EA 实行买 入(采办)营业;当 MA-8 向下渐减且价值收正在 MA-8 之下时,EA 将实行卖出(出售)营业。 咱们还将操纵功夫周期同样为 8、名为“均匀目标性运动”(Average Directional Movement, ADX) 的目标助助咱们确定市集是 否沿趋向运动。咱们云云做是由于咱们只念正在市集沿趋向运动时举办营业,而正在市集无目标性时(即无趋向)松开监控。 要到达此目标,咱们将仅正在上述条目知足且 ADX 值大于 22 时举办咱们的营业(买入或卖出)。借使 ADX 大于 22 但渐 减,或 ADX 小于 22,尽管条目 B 知足咱们也不会举办营业。 咱们还需求扶植 30 点止损来爱戴己方;关于利润目的,咱们将目的定正在 100 点利润。 咱们同样愿望咱们的 EA 仅正在新柱造成时寻找买入/卖出机遇,咱们还将确保咱们正在买入条目知足而咱们尚未兴办买入头寸 时兴办买入头寸,并正在卖出条目知足且咱们尚未兴办卖出面寸时兴办卖出面寸。

  不才一窗口中,将您念要为 EA 指定的名称键入 Name(名称)框中。正在这里,我输入的是 My_First_EA。然后您能够正在 Author(作家)框中输入您的名字,并正在 Link(链接)框中输入您的网址或电子邮件地方(如有)。

  图 3.“EA 营业”的凡是属性 因为咱们要或许更改 EA 的某些参数以寻得哪些值能够带来最佳结果,咱们应操纵 Add(增添)按钮将这些参数增添进来。

  图 4. 扶植 EA 输入参数 正在 EA 中,咱们需求或许实验咱们的“止损”、“赢利”、“ADX 功夫周期”以及“挪动均匀线功夫周期”扶植,所以咱们将正在此界说这些设 置。

  正在 Name(名称)片面下双击并输入参数的名称,然后正在 Type(类型)片面下双击以选拔参数的数据类型,结尾正在 Initial value(初始值)片面下双击并输入参数的初始值。

  如您正在上图中所睹,我为一起参数选拔了整数 (int) 数据类型。接下来让咱们就数据类型稍作阐述。

  从上述各样数据类型的注释咱们能够得知,无符号整数类型不是为存储负值而计划,任何扶植负值的实验恐怕导慰问念不到的后 果。比如,若要存储负值,不行将其存储于无符号类型中(即 uchar、uint、ushort、ulong)。

  回到相合 EA 的议论。考试这些数据类型,您会容许咱们操纵 char 或 uchar 数据类型,由于咱们要正在这些参数中存储的数据折柳 小于 127 或 255。要取得优秀的内存束缚,这么做是最符合的。但为了便于咱们议论,咱们将不断操纵 int 类型。

  告终一起须要参数的扶植后,单击 Finished(告终)按钮,“MetaQuotes 发言编辑器”将为您创筑如下图所示的代码框架。

  代码的顶部(头)是界说 EA 属性的所正在。正在这里您能够看到您正在图 3 中填入“MQL5 指导”的值。 正在该片面代码中,您能够界说诸如 description(注释)(EA 中的简杂文字注释)的其他参数、声明常量、包蕴其他文献或导入函 数。

  当语句以 # 符号发轫时,它是挪用一条预照料措施指令,且该语句不以分号 ; 完毕。预照料措施指令的其他示例网罗: #define: #define 指令用于声明常量。它的书写步地为 #define 标识符 token_string 其效用是正在代码中每次浮现标识符时用值 token_string 举办更换。 示例:

  您能够正在 MQL5 手册中找到更众相合预照料措施指令的音讯。现正在咱们不断咱们的议论。

  咱们正在该片面指定将用于咱们的 EA 的一起参数。这些参数网罗一起咱们将写入 EA 的函数将会用到的一起变量。 正在该层面声明的变量称为全部变量,由于 EA 中的每一个恐怕需求它们的函数都能拜望它们。 输入参数 是只可正在咱们的 EA 外部 举办更改的参数。咱们还能够正在该片面声明咱们将正在 EA 中操纵而正在 EA 外部不成用的其他变量。

  接下来是 EA 初始化函数。这是正在 EA 启动或附加至图外时挪用的第一个函数,且仅挪用一次。

  为确保咱们的 EA 就业杰出,该片面是举办某些首要反省的最佳所正在。 咱们能够了然图外是否有足够的柱用于 EA 的就业等。 这同样是获取咱们将用于目标(ADX 和“均匀挪动线”目标)的句柄的最佳所正在。

  正在 EA 从图外移除时,OnDeinit 函数挪用。 咱们将为 EA 开释正在初始化经过中正在此片面为目标创筑的句柄。

  该函数照料 NewTick 事项,该事项正在采纳到营业种类的新报价时天生。 属意,借使正在客户端中不批准操纵“EA 营业”(按钮 Auto Trading (主动营业)),该“EA 营业”无法实践营业操作。

  图 6. 主动营业已启用 大片面施行咱们先前开辟的营业战术的代码将正在该片面中编写。 现正在看看咱们 EA 代码的各个片面,让咱们入手下手正在“骨架”上增添“血肉”。 2.2 输入参数片面

  如您所睹,咱们增添了更众的参数。正在入手下手议论新参数前,咱们先议论您现正在能够看到的少许实质。咱们能够操纵正斜杠 // 正在我 们的代码中增添注脚。通过注脚,咱们或许了然变量的道理,或此时正在代码的该处咱们正在做什么。注脚还使得咱们的代码更易于理 解。撰写注脚有两种根基格式:

  这是众行注脚。众行注脚的开始和完毕以符号对 /* 和 */ 标示。 正在编译代码时,编译措施会大意一起注脚。

  将单行注脚用于输入参数是一个很好的格式,使 EA 用户能够分解那些参数的道理。 正在 EA 输入属性上,咱们的用户将不会看到参 数自己,而是看到如下所示的注脚:

  图 7.“EA 营业”输入参数 现正在,回到咱们的代码自己... 咱们肯定为咱们的 EA 增添更众参数。EA_Magic 是出自 EA 的一起订单的幻数。 最小 ADX 值 (Adx_Min) 将声明为 double 数据 类型。double 用于存储浮点常数,浮点常数包蕴整数片面、小数点和小数片面。 示例:

  营业手数 (Lot) 默示咱们念要营业的金融用具的量。接下来咱们声明将要操纵的其他参数: adxHandle 用于存储 ADX 目标句柄,而 maHandle 将用于存储“均匀挪动线”目标的句柄。plsDI[]、minDI[]、adxVal[] 是动态 数组,用于生存图外上每个柱的 +DI、-DI 和(ADX 目标的)主 ADX 的值。maVal[] 是动态数组,用于生存图外上每个柱的“挪动 均匀线”目标的值。 正在这里乘隙注释一下什么是动态数组。动态数组是正在声明时没有确天命组巨细的数组。换言之,方括号对中没有指定任何值。与之 相对,静态数组正在声明时界说了数组的巨细。 示例:

  p_close 是用于存储咱们将要看管以反省咱们的买入/卖出营业的柱的收盘价。 STP 和 TKP 将用于正在 EA 中存储“止损”值和“赢利”值。 2.3. EA 初始化片面

  ADX 目标函数通过 iADX 函数取得。它将图外营业种类(NULL 也意味着目今图外确当前营业种类)、图外功夫周期/功夫外(0 也意味着目今图外确当前功夫外)和 ADX 均匀周期用于动作参数或实参的索引(之前咱们正在输入参数片面已界说)的估计打算。

  图外营业种类(可通过 _symbol、symbol() 函数取得,目今图外确当前营业种类则为 NULL)、 图外功夫周期/功夫外(可通过 _period、period() 函数取得,目今图外确当前功夫外则为 0)、 挪动均匀线均匀周期(之前咱们正在输入参数片面已界说)、 目标相关于价值图外的平移(此处平移为 0)、 挪动均匀线滑润 型(恐怕是以下均匀法的轻易一种:大略挪动均匀线 - MODE_SMA、指数挪动均匀线 - MODE_EMA、

  滑润挪动均匀线 - MODE_SMMA 或 线性加权挪动均匀线 - MODE_LWMA),且 价值用于均匀线(正在这里咱们操纵收盘价)。

  //营业种类名称 //功夫周期 //均匀周期 //秤谌平移 //滑润类型 //价值或句柄类型

  请阅读 MQL5 手册以取得相合这些目标函数的更众细节。它将助助您更好地分解怎样操纵每个目标。

  借使函数未得胜返回句柄,咱们将取得一个 INVALID_HANDLE 过错,此时咱们需求再次反省是否存正在过错。咱们操纵 GetlastError 函数通过警示函数来显示过错。

  咱们肯定将“止损”值和“赢利”值存储正在咱们先前声明的 STP 和 TKP 变量中。咱们云云做的道理是什么?

  这是由于存储正在输入参数中的值是只读的,无法对其举办更改。所以,咱们愿望正在此确保一起经纪人的 EA 都运转优秀。Digits 或 Digits() 返回肯定目今图外营业种类的价值精度的小数位数。关于 5 位或 3 位价值图外,咱们将“止损”和“赢利”均乘以 10。

  因为该函数是正在将 EA 从图外中移除或禁用 EA 时挪用,咱们将正在此开释咱们正在初始化经过中创筑的一起目标句柄。咱们创筑了两 个句柄,一个用于 ADX 目标,别的一个用于“均匀挪动线”目标。

  咱们将操纵 IndicatorRelease() 函数来告终开释就业。该函数仅有一个实参(目标句柄)

  该函数删除目标句柄并开释目标的运算块,借使未正在操纵的线 EA ONTICK 片面

  正在这里咱们最初要做的是反省目今图外是否有足足数目的柱。咱们能够操纵 Bars 函数正在任图谋外的史书数据中获取总柱数。该函 数有两个参数,symbol(可操纵 _Symbol 或 Symbol() 获取,它们将返回附加 EA 确当前图外确当前营业种类)和目今图外的 period 或 timeframe (可操纵 Period 或 Period() 获取,它们将返回附加 EA 确当前图外的功夫外)。

  借使总可用柱数少于 60,咱们愿望 EA 不做任何操作直至咱们正在图外上有足够的柱可用。 Alert 函数正在独立窗口中显示音尘。它 将任何故逗号分开的值动作参数/实参。正在本例中,咱们只要一个字符串值。返回退出咱们的 EA 初始化。

  //正在每一次实践 OnTick函数的岁月咱们都将反省目今柱的功夫和生存的功夫.

  “EA 营业”将正在新柱入手下手时实践营业操作,于是相合新柱识此外题目必需处理。换言之,咱们愿望确定咱们的 EA 不会针对每个订单 号反省买入/卖出扶植,咱们仅愿望 EA 正在有新柱时反省买入/卖出持仓。

  咱们最初声明一个 datetime 功夫变量 Old_Time,用于存储柱功夫。咱们将其声明为静态,是由于咱们愿望将值保存正在内存中直 至下次挪用 OnTick 函数。然后咱们就能够将它的值和 New_Time 变量(同样为 datetime 数据类型)举办对比,后者是用于生存 新(目今)柱功夫的包蕴一个元素的数组。咱们还声清晰一个 bool 数据类型变量 IsNewBar,并将其值设为 false。这是由于我 们愿望它的值仅正在咱们具有新柱时为 TRUE。

  咱们操纵 CopyTime 函数来获取目今柱的功夫。函数将柱功夫复制到仅有一个元素的数组 New_Time;借使得胜,咱们将新柱的 功夫与之前的柱功夫举办对比。借使功夫不等,即默示咱们有了一个新柱,则咱们将变量 IsNewBar 设为 TRUE 并将目今柱功夫 的值生存至变量 Old_Time。

  IsNewBar 变量指示咱们有了新柱。借使其值为 FALSE,咱们完毕 OnTick 函数的实践。

  该代码用于调试形式实践,正在调试形式时将打印相合柱功夫的音尘;咱们稍后还将进一步议论。

  正在这里咱们接下来要做的是反省是否有足足数目的柱用于照料。为什么要反复反省?咱们只是愿望确定 EA 就业平常。该当要属意 的是,OnInit 函数仅正在将 EA 附加至图外时挪用一次,而 OnTick 函数正在每次有新的订单号(报价)时挪用。 您能够伺探到,正在这里咱们从头反省了一次,但和之前有所区别。咱们肯定将咱们从以下外达式

  中取得的史书数据中的总柱数存储到新变量 Mybars 中,该变量正在 OnTick 函数中声明。该类型的变量是片面变量,和咱们正在代码 的输入参数片面声明的变量不雷同。正在代码的输入参数片面声明的变量关于代码中一起需求它们的函数均可用,而正在简单函数中声 明的变量则受到局限,仅对该函数可用。这类变量无法正在相应函数的外部操纵。

  接下来,咱们声明一个 MQL5 机合类型的新变量,新变量将用于咱们 EA 的此片面。MQL5 具有大批的内置机合,为 EA 开辟职员 供应了极大的轻易。接下来让咱们逐一领悟这些机合。

  //前次更新价值的功夫 //目今卖价 //目今买价 //前次营业价值(结尾价值) //目今结尾价值的营业量

  借使挪用 SymbolInfoTick() 函数,咱们能够操纵任何声明为 MqlTick 类型的变量很容易地取得 买价、卖价、结尾价值以及交 易 量 确当前值。 所以咱们将 latest_price 声明为 MqlTick 类型,以便咱们将其用于获取买价和卖价。 MqlTradeRequest 该机合用于实践营业操作的一起营业乞请。其机合包蕴实践营业所需的一起字段。

  //营业操作类型 //“EA营业”ID(幻数) //订单号 //营业种类 //以手数默示的营业的乞请营业量 //价值

  任何营业操作的结果均动作 MqlTradeResult 类型的特地预订义机合返回。任何声明为 MqlTradeResult 类型的变量都或许拜望营业 乞请结果。

  //操作返回代码 //营业订单号,借使已实践的话 //订单号,借使已下达的话 //营业量,由经纪人同意 //营业价值,由经纪人同意 //目今卖价 //目今买价 //经纪人对操作的注脚(默认情形下此处填写操作注释)

  正在这里,咱们将 mresult 声明为 MqlTradeResult 类型。 MqlRates 营业种类的价值(开盘价、收盘价、最高价、最低价)、功夫、每个柱的营业量以及点差均存储于该机合中。 MqlRates 类型的数组可用于存储营业种类的史书价值、营业量和点差数据。

  /* 让咱们确认用于生存报价, ADX值 和 MA值的数组都以 功夫序列数组好像的步地存放

  接下来,咱们肯定扶植一起咱们将用于存储柱细节序列的数组。云云做是为了确保复制到数组的值如时序雷同编入索引,即 0、 1、2、3(以对应柱索引。于是咱们操纵 ArraySetAsSeries() 函数。

  应当属意的是,这同样能够正在代码的初始化片面实践一次。然而,为便于论述,我肯定正在此处举办注释。

  现正在,咱们操纵 SymbolInfoTick 函数以取得最新的报价。该函数有两个实参 – 图外营业种类和 MqlTick 机合变量 (latest_price)。同样地,借使有过错,讲演过错。

  接下来,咱们操纵 CopyRates 函数将相合最新的三个柱的音讯复制到 Mqlrates 类型数组中。CopyRates 用于获取指天命目的指定 营业种类-功夫周期的 MqlRates 机合的史书数据至 MqlRates 型数组中。

  //营业种类名称 //功夫周期 //开始职位 //要复制的数据计数 //要复制的目的数组

  营业种类名称操纵 _symbol 获取,目今功夫周期/功夫外操纵 _period 获取。关于开始职位,咱们将从目今柱柱 0 入手下手,而且我 们仅计数三个柱,即柱 0、1 和 2。结果将存储正在数组 mrate[] 中。

  mrate[] 数组现正在包蕴柱 0、1 和 2 的一起价值、功夫、营业量和点差音讯。 所以,要获取轻易柱的细致音讯,咱们将操纵:

  接下来,咱们将一起目标值复制到咱们操纵 CopyBuffer 函数声明的动态数组中。

  //目标句柄 //目标缓冲区数目 //开始职位 //复制数目 //复制目的数组

  目标句柄是咱们正在 OnInit 片面中创筑的句柄。合于缓冲区数目,ADX 目标具有三 (3) 个缓冲区:

  咱们将目今柱 (0) 复制到较早的两个柱。于是要复制的记实量为 3(柱 0、1 和 2)。buffer[] 是咱们之前声明的目的动态数组 – adxVal、plsDI、minDI 和 maVal。

  正如您正在这里再次看到的雷同,咱们实验缉捕正在复制经过中恐怕爆发的任何过错。借使存正在过错,无需实践进一步操作。

  务须要属意,借使复制得胜,CopyBuffer() 和 CopyRates() 函数返恢复制的记实总数,借使正在此经过中浮现过错则返回 -1。这就 是咱们正在此处的过错反省函数中反省小于 0(零)的值的道理。

  此时,咱们愿望反省咱们是否已有未平仓买入或卖出面寸,换言之,咱们愿望确认咱们一次仅有一 个 卖出或买入营业未平仓。如 果咱们已有一个未平仓买入或卖出,咱们不肯望兴办一个新的买入或卖出。

  为此,咱们最初应声明两个 bool 数据类型变量(Buy_opened 和 Sell_opened),用于正在咱们已有未平仓买入或卖出面寸时保 存 TRUE 值。

  咱们操纵营业函数 PositionSelect 来获知咱们是否有未平仓头寸。借使咱们已有未平仓头寸,该函数返回 TRUE;借使没有则返 回 FALSE。

  函数将咱们愿望反省的营业种类(货泉对)动作实参/参数。正在这里咱们操纵 _symbol,由于咱们反省的是目今营业种类(货泉 对)。

  借使该外达式返回 TRUE,则咱们愿望反省未平仓头寸是买入依旧卖出。咱们操纵 PositionGetInteger 函数来举办反省。咱们将该

  装饰符操纵时,函数给出未平仓头寸的类型。该函数将返回来寸类型标识符,这能够是

  正在咱们的示例中,咱们用它来确定咱们未平仓的头寸。借使该头寸为卖出,咱们将 TRUE 值存储正在 Sell_opened 中,借使是买 入,咱们则将 TRUE 值存储正在 Buy_opened 中。当咱们稍后正在代码中反省卖出或买入条目时,咱们将或许操纵这两个变量。

  现正在是岁月存储咱们将用于咱们的买入/卖出扶植的柱的收盘价。咱们之前已为此声清晰一个变量。

  让咱们来分解上述外达式,该外达式外现了咱们此前计划的战术。咱们声明一个 bool 类型的变量,用于不才达订单之前必需知足 的各个条目。bool 类型的变量只可包蕴 TRUE 或 FALSE 值。所以,咱们的买入战术可细分为四个条目。 借使任一条目知足,则 TRUE 值将存储正在咱们的 bool 类型变量中,反之将存储 FALSE 值。让咱们一一举办论述。

  正在这里咱们看到的是柱 0、1 和 2 上的 MA-8 值。借使目今柱上的 MA-8 值大于较早的柱 1 上的 MA-8 值,而且柱 1 上的 MA-8 值大于柱 2 上的对应值,这意味着 MA-8 向上填补。这便知足了咱们买入扶植的四个条目的此中一个。

  该外达式旨正在反省正在同有时间周期内(柱 1 功夫周期),柱 1 的收盘价是否高于 MA-8 的值。借使高于,则咱们的第二个条目也 同样取得知足,接下来咱们将反省其他条目的知足情形。然而,借使咱们刚刚议论的两个条目并未知足,则没有须要反省其他条目 的知足情形。这便是咱们肯定将下述外达式包蕴正在这两个初始条目(外达式)中的道理。

  现正在,咱们愿望反省 ADX 确当前值(ADX 值或柱 0)是否大于正在输入参数中声明的最小 ADX 值。借使外达式为 true,即 ADX 的 目今值大于最小所需值;咱们还愿望确认 plusDI 值大于 minusDI 值。这是咱们不才一外达式中取得的结果

  借使一起这些条目均取得知足,即全数返回 true,则咱们愿望确认正在咱们已有买入头寸时不会兴办新的买入头寸。现正在是反省我 们之前正在代码中声明的 Buy_opened 变量的值的岁月了。

  借使 Buy_opened 返回 TRUE,咱们不肯望兴办其他的买入头寸,所以咱们显示一则警示音尘来通告咱们然后返回,所以咱们的 EA 将恭候下一订单号的到来。然而,借使 Buy_opened 返回 FALSE,则咱们操纵之前声明用于发送订单的 MqlTradeRequest 类型 变量 (mrequest) 来打算咱们的记实。

  因为咱们下达了一个当即实践的营业订单,此处营业操作类型的操动作TRA DE_A CTION_DEA L。借使咱们是改正订单,则 咱们将操纵 TRADE_ACTION_MODIFY。要删除订单,咱们将操纵 TRADE_ACTION_REMOVE。 咱们操纵咱们的 MqlTick 型 latest_price 来获取最新买价。 订单止损价值通过从买价中减去咱们的 StopLoss 点取得,而订单赢利价值通过正在买 价的根本上加上咱们的 TakeProfit 点取得。您还将属意到,咱们将 NormalizeDouble 函数用于买价、StopLoss 和 TakeProfit 值,这是一种优秀的风气做法,即正在将价值发送至营业任职器前永远先将这些价值轨范化为货泉对的位数。 营业种类是目今营业种类(_Symbol 或 Symbol())。订单类型是咱们正不才达的订单的类型,正在这里咱们下达的是买入订 单 ORDER_TYPE_BUY。卖出订单则为 ORDER_TYPE_SELL。 订单 type_filling 是订单实践类型;ORDER_FILLING_FOK 默示营业可仅以订单指定的价值或更优的价值遵照指定的营业量 实践。借使订单营业种类没有足够的卖盘,订单将不被实践。

  正在发送订单后,现正在咱们将操纵 MqlTradeResult 类型变量来反省订单的结果。借使订单得胜实践,咱们愿望取得通告;借使未成 功,咱们同样愿望知情。通过 MqlTradeResult 类型变量 mresult,咱们可拜望操作返回码和订单号,借使订单已下达的线 默示 OrderSend 乞请已得胜实践,而 10008 默示订单已下达。这便是咱们需求反省这两个返回码的道理。借使我 们取得两个返回码的轻易一个,咱们能够确认咱们的订单已告终或已下达。

  要反省卖出机遇,除了咱们的 ADX 必需大于指定的最小值外,咱们应反省咱们为买入机遇所做的对应片面。

  正宛如咱们正在买入片面所做的那样,咱们声明一个 bool 类型的变量,用于不才达订单之前必需知足的各个条目。bool 类型的变量 只可包蕴 TRUE 或 FALSE 值。所以,咱们的卖出战术可细分为四个条目。 借使任一条目知足,则 TRUE 值将存储正在咱们的 bool

  类型变量中,反之将存储 FALSE 值。宛如咱们正在买入片面所做的那样,让咱们一一举办论述。。

  正在这里咱们看到的是柱 0、1 和 2 上的 MA-8 值。借使目今柱上的 MA-8 值小于较早的柱 1 上的 MA-8 值,而且柱 1 上的 MA8 值小于柱 2 上的对应值,这意味着 MA-8 向下删除。这便知足了咱们卖出扶植的四个条目的此中一个。

  该外达式旨正在反省正在同有时间周期内(柱 1 功夫周期),柱 1 的收盘价是否低于 MA-8 的值。借使低于,则咱们的第二个条目也 同样取得知足,接下来咱们将反省其他条目的知足情形。然而,借使咱们刚刚议论的两个条目并未知足,则没有须要反省其他条目 的知足情形。这便是咱们肯定将下述外达式包蕴正在这两个初始条目(外达式)中的道理。

  现正在,咱们愿望反省 ADX 确当前值(ADX 值或柱 0)是否大于正在输入参数中声明的最小 ADX 值。借使外达式为真,即 ADX 确当 前值大于最小所需值;咱们还愿望确认 MinusDI 值大于 plusDI 值。这是咱们不才一外达式中取得的结果

  借使这些条目取得知足,即全数返回 true,则咱们愿望确认正在咱们已有买入头寸时不会兴办新的买入头寸。现正在是反省咱们之前 正在代码中声明的 Buy_opened 变量的值的岁月了。

  借使 Sell_opened 返回 true,咱们不肯望兴办其他的卖出面寸,所以咱们显示一则警示音尘来通告咱们然后返回,所以咱们的 EA 将恭候下一订单号的到来。然而,借使 Sell_opened 返回 FALSE,则咱们遵照正在买入订单中所做的扶植卖出营业乞请。

  此处要紧的区别正在于咱们估计打算止损价值和赢利价值的格式。同样地,因为咱们卖出,咱们以卖价卖出;这便是咱们操纵 MqlTick 类型的变量 latest_price 来获取最新卖价的道理。正在这里,其他类型为 ORDER_TYPE_SELL,此前已给出了注释。

  同样是正在这里,咱们将 NormalizeDouble 函数用于卖价、StopLoss 和 TakeProfit 值,这是一种优秀的风气做法,即正在将价值发送 至营业任职器前永远先将这些价值轨范化为货泉对的位数。

  正宛如咱们对买入订单所做的那样,咱们也必需反省卖出订单得胜与否。所以咱们操纵正在买入订单中操纵的统一外达式。

  到这一步,咱们需求测试咱们的 EA,以获悉咱们的战术就业与否。同样地,正在咱们的 EA 代码中恐怕存正在片面过错。这些过错将 正在接下来的环节中寻得。

  通过代码调试,咱们能够逐行(借使扶植了断点)查看代码的实践情形,寻得代码中存正在的任何过错或缺陷,然后正在将代码用于真 实营业前速捷对其举办须要的更改。

  正在这里,咱们将正在扶植断点和接下来不扶植断点的两种情景中逐渐遍历“EA 营业”的调试经过。为此,确保咱们没相合闭“编辑器”。 最初,咱们应选拔愿望用于测试 EA 的图外。正在编辑器菜单栏上,点击 Tools(用具),然后点击 Options(选项),如下图所 示:

  图 8. 扶植调试选项 Options(选项)窗口浮现后,选拔要操纵的货泉对、功夫周期/功夫外,然后单击 OK(确定)按钮。

  启动调试措施前,咱们先设定断点。断 点 使咱们能够看管某个选定职位或代码行的代码的动作/职能。当调试措施碰到断点时,它 将结束运转以恭候您的操作,而非一次运转完一起的代码。通过这种伎俩,咱们便或许正在代码来到每个断点时对其举办分解并看管 其动作。咱们还将或许估计打算某些变 量 的值,以查看事宜是否遵照咱们设念的格式进展。

  要扶植断点,前去您念要扶植断点的代码行。正在左侧亲密代码行畛域的灰色区域内双击,您将看到一个蓝色的圆形小按钮,按钮内 部有一个白色的实心方框。或者,将鼠标的光标悬停正在代码行中您念要扶植断点的轻易职位,然后按 F9。要移除断点,再次按 F9 或双击断点。

  图 10. 扶植断点 咱们将正在五行区别的代码行中扶植断点。 为便于论述,我将操纵从 1 到 5 的五个数字来标示断点。 如下图所示,咱们不断正在七行代码行中扶植断点。断点 1 已正在上文中创筑。

  图 11. 扶植其他断点 告终断点的扶植后,咱们便能够入手下手调试代码。 要启动调试措施,按 F5 或单击 MetaEditor 用具栏上的绿色按钮:

  图 12. 启动调试措施 编辑器最初将编译代码,借使代码中存正在过错,编译器将显示过错,反之编译器将通告您代码得胜编译。

  图 13. 编译讲演 请属意,代码编译得胜并不虞味着代码中没有过错。取决于代码的编写格式,恐怕会存正在运转时过错。比如,借使由于任何小的疏 忽而导致外达式未能确切求值,代码将得胜编译但恐怕不会确切运转。少说众做,让咱们来实践操作一下... 调试措施正在告终代码的编译后,将跳转至营业端,并将 EA 附加至您正在 MetaEditor 选项扶植中指定的图外。同时,调试措施将显 示 EA 的输入参数片面。因为咱们未作任何调剂,单击 OK(确定)按钮即可。

  图 14.“EA 营业”输入参数调试 现正在,您将正在图外的右上角理会地看到 EA。 启动 OnTick() 后,它将正在断点 1 处结束运转。

  图 15. 调试措施正在第一个断点处结束运转 您将属意到,正在代码行的左边有一个绿色的箭头浮现。该箭头默示已实践了前面的代码行;现正在咱们已打算好实践目今的代码行。 正在不断前,请批准我做少许须要的注释。伺探编辑器的用具栏,您会发掘之前展示灰色的三个带弯曲箭头的按钮现已激活。这是因 为咱们现正在正正在运转调试措施。这些按钮/夂箢用于单步骤试咱们的代码(单步实践、跳过或跳出)。

  图 16. 单步实践夂箢 Step Into(单步实践)用于从措施实践的一步进入下一步,将进入该代码行中任何挪用的函数。点击按钮或按 F11 挪用夂箢。 (咱们将该夂箢用于代码的逐渐调试。)

  图 17. 跳过夂箢 另一方面,Step over(跳过)不会进入该代码行内挪用的任何函数。点击按钮或按 F10 挪用夂箢。

  同样地,正在“编辑器”的底部,您将看到 Toolbox window(用具箱)。窗口中的 Debug(调试)选项卡具有以下题目:

  File( 文 件 ) : 用于显示挪用文献的文献名。 Funct ion( 函 数 ) : 用于显示来自挪用文献确当前函数。 Line( 行 号 ) : 用于显示从其挪用函数的文献中的代码行的行号。 Expression( 外 达 式 ) : 用于输入您愿望从代码中看管的外达式/变量的名称的所正在。 Value(值):用于显示咱们正在 Expression(外达式)区域中输入的外达式/变量的值。 Ty pe( 类 型 ) : 用于显示看管的外达式/变量的数据类型。

  接下来要做的是输入咱们愿望正在代码中看管的变量/外达式。确保仅看管代码中真正首要的变量/外达式。关于咱们的示例,咱们将 看管以下实质:

  IsNewBar(指示新柱的记号) Mybars(史书数据中的总柱数)– EA 取决于它 您能够增添诸如 ADX 值、MA-8 值等等 要增添外达式/变量,双击 Expressions(外达式)区域或右键单击该区域然后选拔 Add (增添),如上图所示。 输入要看管或查看的外达式/变量。

  图 20. 增添要查看的外达式或变量 借使变量尚未声明,其类型为 Unknown identifier(未知标识符)(静态变量除外)。 现正在,让咱们不断...

  点击 Step into(单步实践)按钮或按 F11,伺探爆发的情形。如下所示,按住该按钮或 F11 不放,直至来到断点 2,不断直至 来到断点 4,然后伺探 外达式查看窗口。

  一朝有新订单号,它将返回 OnTick() 函数的第一行代码。因为是新的订单号,除非已声明为静态变量,不然一起变量/外达式的 值现正在将重置。正在咱们的示例中,咱们有一个静态变量 Old_Time。

  图 25. NewTick 事项的变量值 要反复该经过,不断按 F11 键并正在外达式查看窗口中络续看管变量。您能够结束调试措施,然后移除一起断点。 正在“调试”形式下,咱们将看到显示的音尘 We have new bar here...(此处有新柱...)。

  再次启动调试经过;但此次未扶植断点。络续合切每个订单号,借使有任何买入/卖出条目取得知足 EA 将下达订单,而且通过编 写的代码,咱们将获悉订单是否得胜下达或是看到一则警示音尘。

  我以为您能够脱离几分钟去喝杯咖啡,使 EA 正在无人值守的形态下就业。回来时,您会发掘己方已有所进账(开个玩乐),然后单 击 MetaEditor 上的 STOP(结束)(血色)按钮结束调试。

  图 28. 结束调试措施 实践上,咱们正在这里告终的就业是查看咱们的 EA 仅正在兴办新柱时反省营业,而且 EA 确实起到了效用。咱们的 EA 代码仍有很大 的改正空间。 有一点我要昭着一下,营业端必需连结汇集,不然调试会由于终端无法举办营业而不起效用。 3.2 测试 EA 战术 现正在,咱们将操纵营业端内置的战术测试措施来测试咱们的 EA。 要启动战术测试措施,按 CONTROL+R 或点击终端菜单栏上的

  View(视图)菜单,然后单击 Strategy Tester(战术测试措施),如下图所示。

  图 26. 启动战术测试 测试措施(战术测试措施)正在终端的下部显示。要查看测试措施的一起扶植,需求将其打开或调剂巨细。为此,将鼠标指针移至红 色箭头标示的职位(如下所示)。

  图 27. 战术测试措施窗口 鼠标指针将变为双向箭头,按住鼠标并向上拖动线条。当您能够看到扶植选项卡上的一起实质时,结束拖动鼠标。

  1. 选拔您愿望测试的 EA 2. 选拔用于测试的货泉对 3. 选拔用于测试的功夫周期/功夫外 4. 选拔 Custom Period(自界说功夫周期)并正在 5 中扶植日期 5. 扶植用于测试的自界说功夫周期的日期 6. Execution(实践)为 Normal(平常) 7. 选拔用于测试的以 USD 为单元的存款额 8. 将 Optimization(优化)扶植为 Disable(禁用)(咱们现正在不是优化,仅仅是出于测试目标) 9. 借使测试停当,点击此按钮。

  正在咱们点击 Start(入手下手)按钮前,咱们先谙习一下测试措施上的其他选项卡。

  测试措施正在测试中操纵的照料器。基于您的电脑的照料器类型。我的仅仅是单 (1) 核照料器。

  图 30. 测试时的战术测试措施代劳选项卡 Journal( 日 志 ) 选 项 卡 这是正在测试功夫周期内一起运转事项显示的所正在

  图 31. 显示营业勾当的战术测试措施日记选项卡 Input s( 输 入 ) 选 项 卡 这是您可认为 EA 指定输入参数的所正在。

  图 32. 战术测试措施输入选项卡 借使咱们要优化 EA,咱们需求正在圈出的区域中扶植值。

  Start(入手下手)是您愿望测试措施从其入手下手的值。 Step(步长)是您选拔的值的增率,且 Stop(结束)是测试措施将正在此结束增大参数值的值。 然而,正在咱们的示例中并未央求优化 EA,于是咱们现正在还无需操纵这片面功用。 当全面停当,咱们将回到 Settings(扶植)选项卡并点击 Start(入手下手)按钮。然后测试措施入手下手运转。借使您承诺,您现正在要做 的是再次脱离去喝杯咖啡,或者像我雷同,恐怕愿望看管一起全面,然后转到 Journal(日记)选项卡。 Graph( 图 形 ) 选 项 卡 一朝您入手下手正在 Journal(日记)选项卡上查看已发送订单的干系音尘,您恐怕会念要转到刚才创筑的名为 Graph(图形)的新选项

  卡。切换至 Graph(图形)选项卡,您将会看到图形络续上升或低落,全体情景恐怕取决于营业的结果。

  图 33.“EA 营业”测试的图形结果 Result s( 结 果 ) 选 项 卡 测试告终后,您将会看到名为 Results(结果)的选项卡。切换至 Results(结果)选项卡,您将看到咱们刚刚所实践测试的摘 要。

  正在这里,您能够查看总毛利、净利、总营业数、亏折营业总数以及更众实质。看到咱们正在为测试选拔的功夫周期内具有约 USD 1,450.0 是一件意思的事宜。起码咱们取得了利润。

  正在这里,我要着重夸大一件事宜。您会发掘,您正在战术测试措施中看到的 EA 参数的扶植和 EA 输入参数中的初始扶植区别。我刚 刚向您指出,您能够更改那些输入参数中的轻易参数以取得最优的 EA 职能。我能够将“挪动均匀线 的功夫周期折柳 改为 10 和 14。我还能够将止损从 30 改为 35。结尾一点也很首要,我能够操纵 2 小不时间外。记住,这是战术测试措施。

  借使念要查看测试的完美讲演,正在 Results(结果)选项卡中操纵右键单击轻易处,然后您将会看到一个菜单。正在该菜单上选 择Save as Report(另存为讲演)。

  图 35. 生存测试结果 生存对话框窗口将显示,借使您承诺,为报外输入名称,或是保存默认名称,然后单击生存按钮。完美的讲演将以 HTML 形式保 存。

  要查看所实践测试的图外,单击Open Chart(翻开图外),然后您将看到显示的图外。

  就云云,咱们得胜编写和测试了咱们的 EA,现正在咱们有了一个可操纵的结果。现正在您能够返回战术测试措施 Settings(扶植)选 项卡,操纵其他的功夫外/功夫周期来举办测试。

  我愿望您能够操纵区别的货泉对、区别的功夫外、区别的止损值、区别的赢利值来举办测试,看看 EA 是怎样就业的。您以至能够 尝尝新的“挪动均匀线”值和 ADX 值。如我之前所言,这恰是战术测试措施的精华所正在。同样,我也愿望您能够将结果与我分享。

  正在天职步指南中,咱们能够找到基于开辟的营业战术编写大略的“EA 营业”所需的根基环节。指南中也包蕴了怎样操纵调试措施检 查 EA 是否存正在过错的伎俩。咱们还议论了操纵战术测试措施测试 EA 职能的伎俩。为此,咱们或许会意到全新的 MQL5 发言的强 大性和牢靠性。咱们的 EA 尚不圆满或完满,正在用于切实营业前咱们还必需对其举办大批改正。

  尚有良众学问亟待咱们练习,我愿望您能配合 MQL5 手册重读此文,并将本文中所学的全面逐一印证,我能够保障,正在不久的将 来您必定会是一名优异的 EA 开辟职员。

  属意: MetaQuotes Software Corp.将保存所相合于这些质料的权力。全数或片面复制或者转载这些质料将被禁止。

FXCG投资网-MT4平台开户|MT5开户|原油黄金期货开户 Copyright @ 2022 FXCG投资网 All Rights Reserved. 版权所有 网站地图