针对初学者的 MQL 5 中的自定义指标(电子书版)
针对初学者的 MQL 5 中的自定义指标(电子书版)长远阐明任何常识学科(无论是数学、音乐仍旧编程等)的基本是对其基本的研习。假若从很小的光阴起就出手一致的研习则再 好但是,如许对付基本的阐明要容易得众,而且阐明实在而所有。 可惜的是,大个人人是人到中年才出手接触金融和股票市集,于是研习起来并谢绝易。正在本文中,我将助助行家制服这一阐明 MQL5 和为 MetaTrader 5 客户端编写自界说目标的最初攻击。
研习事物最有用且最合理的方法是实质题目的处置计划。既然咱们接洽的是自界说目标,咱们将从研习简易目标出手,简易目标 包罗正在 MQL5 中显示目标操作的基本方面的少许代码。 行为示例,咱们会探求最著名的本事说明目标 - 简易转移均匀线 (SMA)。它的揣测简易: SMA = SUM (CLOSE (i),MAPeriod) / MAPeriod 个中: SUM - 值的总和; CLOSE (i) - 第 i 个柱的收盘价; MAPeriod - 求均匀的柱的数目(均匀周期)。 以下是不征求任何出格效力的该目标的代码:
最初,咱们须要斟酌两件事项 - 一方面,每个代码串的宗旨,另一方面,圭臬代码和客户端的交互。
必必要预防到,它们只是解说,和代码没有直接的合连,它们为代码的可读性打算而生,用于显示代码某些个人的特定语义内 容。当然,咱们能够将解说从代码中去除,而不会对代码的进一步简化有任何的损害,但如许一来代码将正在阐明上落空简略性。 正在咱们的示例中,咱们应用单行解说,这类解说开始于字符对 // 并以换行符行为了局记号。 显而易睹,作家能够正在解说中写下一起须要实质,以助助正在一段时候后阐明该代码。正在咱们的示例中,解说的第一个人合乎目标 名称和作家音讯,第二和第三个人用于分别函数OnInit()和OnCalculate()。末尾的结果一行只是合上圭臬代码。
于是,如咱们所睹,目标的全豹代码可分为 3 个个人: 1. 正在整体层面编写的未包罗正在括号中的代码,位于第一和第二段解说之间。 2. OnInit() 函数的解释。 3. OnCalculate() 函数的解释。 必必要预防的是,函数正在编程中的意旨比正在数学中要广泛得众。比如,正在编程说话中,数学函数老是接受少许输入参数并返回计 算值,另外,MQL5 中的函数还能够实践少许字符操作、来往操作、文献操作等。 真相上,任何用 MQL5 编写的目标老是具有最小用户编写个人集,该个人的解说是个体的并基于创筑目标的效力。 除了这些组分,最小函数集可包罗其他 MQL5 函数的解释 - OnDeInit():
配合翻开的 SMA.mq5 正在 MetaEditor 中按下 Compile(编译)键后,现正在咱们来接洽取得的编译文献 SMA.ex5 的职业。须要要 预防的是,含扩展名 .mq5 的文本文献只是文本形式的源代码,务必正在编译后本事用于客户端中。 将该目标从 Navigator (导航器)窗口附加至图外后, MetaTrader 将实践目标的第一个人代码。之后, MetaTrader 将挪用函数 OnInit() 以实践该函数一次,然后对每个新的订单号(新报价到来后)挪用 OnCalculate() 函数并实践该函数的代码。假若 OnDeInit() 呈现正在目标中,MetaTrader 将正在从图外平分离目标或正在时候外调度后挪用该函数。 经此阐明,目标的一起个人的意旨和宗旨了如指掌。处于整体层面的代码的第一个人有少许简易运算符,这些运算符会正在目标启 动后实践一次。除此除外,该个人还包罗了对变量的声明,这些变量正在目标的一起圭臬块中“可睹”,而且正在目标位于图外上时记 住变量的值。 实践一次的常量和函数应位于 OnInit() 函数内部,由于将它们放正在函数OnCalculate() 的圭臬块中是不明智的。目标的揣测代码可 为每个柱揣测目标的值,应安顿正在函数OnCalculate()内。 用于正在目标从图外移除后删除图外无用数据(如有)的圭臬应安顿正在OnDeInit() 内。比如,务必删除目标创筑的图形对象。 颠末上述解释的铺垫,咱们已打定好周密视察正在前文中接洽的目标的代码。
代码行的第一组开始于运算符 #property,该运算符可用于指定目标配置的其他参数。也许圭臬属性的无缺列外可正在MQL5 文档中 找到。如须要,能够编写目标的出格属性。咱们的示例包罗 5 行代码,各行代码的宗旨正在解说中指出:
预防,代码行的末尾没有分号 (;)。出处如下:真相上,正在咱们的示例中,这些是以另一种方法显露的常量界说。 咱们的简易转移均匀线 个参数,用户可更改这些参数 - 它是目标沿时候轴的均匀周期和水准平移(以柱为单元)。因为正在 更深一层的两行代码行中声明,这两个参数应声明为目标的输入变量:
请预防,正在声明这些输入参数后又有解说,且这些解说将行为输入参数的名称正在目标的 Properties(属性)窗口中可睹:
正在咱们的示例中,这些名称比拟目标的变量名称要更为显现。于是,这些解说应当是简易的。 结果一行没有括号的代码行是动态数组 ExtLineBuffer[] 的声明。
由于下述的几个出处,它被声明为整体变量。 最初,该数组应转换为目标缓冲区,它正在 OnInit() 函数的圭臬块中施行。其次,目标缓冲区自身将正在 OnCalculate() 函数内部使 用。再次,该数组将存储目标的值,这些值将用于正在图外上绘制弧线。因为该数组声明为整体变量的真相,它对目标的一起圭臬 块均可用,并会连续存储本身的值直至目标从图外离别。 OnInit() 函数的实质仅通过 3 个运算符显露,这些运算符是 MetaTrader 客户端的内置函数。 第一个函数的挪用将一维动态数组 ExtLineBuffer[]分拨给第零个目标缓冲区。带分歧输入参数值的别的两个函数的挪用可用于将 目标沿代价轴平移,以及指定从编号为 MAPeriod 的柱出手的目标画图。
PlotIndexSetInteger() 函数的结果挪用传达等于 MAPeriod(通过函数 OnCalculate() 的参数 begin)的值到其他目标,假若其利用 至咱们的目标的值的话。逻辑很简易,最初的 MaPeriod-1 个柱没有什么须要均匀,这便是该目标的画图无用的出处。然而,须要 传达该值以平移其他目标的揣测原点。 它不是内置函数的无缺列外,内置函数用于自界说目标并可安顿正在目标的该圭臬块内。请参睹 MQL5 文档通晓周密音讯。 结果,咱们来探求一下 OnCalculate() 函数的代码。该函数和函数 OnInit() 相同没有任何自界说挪用,由于这些函数通过 MetaTrader 客户端挪用。因为这个出处,函数的输入参数声明为常量。
这些输入参数无法更改,参数值由客户端传达进一步用于该函数的代码中。OnCalculate 输入变量的解释请参睹 MQL5 文档。函数 OnCalculate() 应用 return(rates_total) 函数将其值返回客户端。客户规矩在实践 OnCalculate() 后接受眼前订单号的该值并将返回 值传达至其他参数 prev_calculated。于是,咱们永远能够确定柱索引的周围,并仅为上一订单号之后呈现的目标的新值实践计 算。 务必预防的是,MetaTrader 客户端中柱的排序是从左至右实践,于是最旧的柱(左边)正在图外上具有索引 0,接下来的柱具有索 引 1,依此类推。缓冲区 ExtLineBuffer[] 的元素具有雷同的排序。 目标 OnCalculate 函数内的简易代码布局是通用的,对付很众本事说明目标而言吵嘴老例范的。于是,接下来咱们接洽它的细 节。OnCalcualte() 函数的逻辑为: 1. 2. 3. 4. 5. 查抄揣测所需的柱是否存正在。 声明部分变量。 获取用于揣测的开始柱的索引。 目标揣测的主轮回。 应用运算符 return() 将 rates_total 的值返回客户端。
我以为第一项是昭着的。比如,假若转移均匀线 个柱,则没有须要实践揣测,由于没有足 够的柱用于揣测。于是,咱们应用运算符 return 返回 0 至客户端。
咱们的目标能够利用至其他少许目标的数据,这些目标同样可有少许最小数目的柱用于揣测。斟酌到这一真相,则常量 begin 的 应用是必不行少的。请参睹著作将目标利用至其他目标通晓周密音讯。 正在该圭臬块中声明的部分变量仅对 OnCalculate() 函数内的中央揣测是须要的。这些变量正在函数挪用后从电脑的 RAM 开释。
务必小心主轮回的开始索引(变量first)。正在函数的第一次挪用时(咱们能够通过参数 prev_calculated 的值确定),咱们务必为 一起的柱实践目标值的揣测。对付客户端更众的订单号,咱们仅须要为呈现的新柱实践揣测。它通过 3 行代码行实行:
主轮回中柱的管制遵循递增顺序 (bar++) 实践,换言之,从左至右,契合自然和无误的方法。正在咱们的目标中,柱的管制应以其他 的方法施行(以相反的次序)。更好的手法是正在目标中应用递增顺序。主轮回的变量名为 “ 柱 ” ,但很众编程职员更可爱称之为 i。我更偏向于应用前者,由于如许使代码更显现易读。 正在主轮回中施行的均匀算法很简易。
正在第二个轮回中,咱们从时候周期较早的柱出手实践代价的累积乞降,并应用该均匀周期将其划分。行为结果,咱们取得 SMA 的 最终值。 主轮回了局后,OnCalculate 函数从变量 rates_total 返回可用柱的数目。正在 OnCalculate() 函数的下一次挪用中,该值将由客户 端传达至变量 prev_calculated。该值减去 1 后的值将用作主轮回的开始索引。 以下是目标的无缺源代码,每一代码行都标注有详细的解说:
这种情势的代码要更易于阐明和阅读。 又有另一个特性可用于简化代码的阐明。您能够应用空格和空行使代码特别分明。
这便是相合自界说目标的代码和 MetaTrader 客户端交互的总共实质。当然,该焦点比拟咱们已接洽的个人要广泛得众,本文的目 标是助着初学者阐明根基道理,于是干系细节请参睹文档。