太好了...
这篇文章是另一篇 文章的一小部分摘录。没有做任何工作来使其有效运行。没有缓存指标和时间序列。无 High[i]、Low[i] 等。没有 iCustom。
我们期待看到完全不同的东西。此外,如果连来源都没有,专家顾问中的快餐又有什么意义呢?
for(int i=PositionsTotal()-1;i>=0;i--) if(m_position.SelectByIndex(i)) // 通过索引选择位置,以便进一步访问其属性 if(m_position.Symbol()==m_symbol.Name()) { //----多头仓位已建立 if(m_position.PositionType()==POSITION_TYPE_BUY) { //--- 是否应该关闭? if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && MacdCurrent>(MACDCloseLevel*m_adjusted_point)) { //--- 关闭仓位并退出 if(!m_trade.PositionClose(m_position.Ticket())) Print("PositionClose error ",m_trade.ResultRetcodeDescription()); return; } //--- 检查跟踪止损 if(TrailingStop>0) { if(m_position.PriceCurrent()-m_position.PriceOpen()>m_adjusted_point*TrailingStop) { if(m_position.StopLoss()<m_symbol.Bid()-m_adjusted_point*TrailingStop) { //--- 修改位置并退出 if(!m_trade.PositionModify(m_position.Ticket(), m_symbol.NormalizePrice(m_position.PriceCurrent()-m_adjusted_point*TrailingStop), m_position.TakeProfit())) Print("PositionModify error ",m_trade.ResultRetcodeDescription()); return; } } } } if(m_position.PositionType()==POSITION_TYPE_SELL) { //--- 是否应该关闭? if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*m_adjusted_point)) { //--- 关闭仓位并退出 if(!m_trade.PositionClose(m_position.Ticket())) Print("PositionClose error ",m_trade.ResultRetcodeDescription()); return; } //--- 检查跟踪止损 if(TrailingStop>0) { if((m_position.PriceOpen()-m_position.PriceCurrent())>(m_adjusted_point*TrailingStop)) { if((m_position.StopLoss()>(m_symbol.Ask()+m_adjusted_point*TrailingStop)) || (m_position.StopLoss()==0.0)) { //--- 修改位置并退出 if(!m_trade.PositionModify(m_position.Ticket(), m_symbol.NormalizePrice(m_symbol.Ask()+m_adjusted_point*TrailingStop), m_position.TakeProfit())) Print("PositionModify error ",m_trade.ResultRetcodeDescription()); return; } } } } }

- 2010.05.11
- Sergey Pavlov
- www.mql5.com
下面是一个典型的 MQL4-ca 例子--不阅读,不看代码,直接带着旗帜走上讲台 :) 。
在发表评论之前,我不仅阅读了文章的正文,还阅读了所有附带的资料(包括 IndicatorsMQL4.mqh 与 IndicatorsMQL5.mqh 的对比分析)。
你一定忽略了 MQL5\Include\SimpleCall\Series.mqh 文件。
请仔细阅读。High[i] 等在哪里?
关于缓存 - 这些都是您个人的猜测(期望)。
本文无意欺骗 MQL4 用户:"插入我的文件,您就可以继续按照 MQL4 的风格无意识地工作",它展示了如何将处理指标的旧方法转移到 MQL5。
iCustom 在哪里?你不假思索地几乎复制和粘贴了另一篇文章的一部分,结果导致性能失败。事实上,欺骗用户说这是 MQL4 风格的代价,而不是您的实现。
这里有性能测量结果,表明 MQL4-style 在某些问题上并不比 MQL5 差。在指标方面也可以这样做。
下面是时间序列的实现之一。您可以看到,作者已经做出了努力,强调了性能并摒弃了 MQL4 风格(如果您愿意,也可以完善这一想法)。

- 投票: 25
- 2017.05.25
- nicholishen
- www.mql5.com
请仔细阅读。High[i] 等在哪里?
iCustom 在哪里?你不假思索地几乎复制粘贴了另一篇文章的一部分,结果导致性能失败。事实上,你欺骗用户说这是 MQL4 风格的代价,而不是你的实现。
这里有性能测量结果,表明 MQL4-style 在某些问题上并不比 MQL5 差。在指标方面也可以这样做。
下面是时间序列的实现之一。您可以看到,作者试图强调性能,并略微偏离了 MQL4 风格(这对他来说更方便)(如果您愿意,可以完善这一想法)。
为了更快地适应 MQL5,只留下了系列的 iXXXX 函数,因为它们有更完整的参数(符号、时间范围、移位),很容易取代专业性更强的 High[] 等。我们的目标不是让用户继续无意识地使用 MQL4,而是开始慢慢重写他们的 MQL4 代码。
iCustom 甚至不在计划中--只考虑了标准指标。
关于缓存 - 这绝对不在面向大众的文章中。
补充:顺便说一句,用户的反馈将明确 High[] 和类似函数是否必要,或者我们是否可以不使用 iXXXX 系列。
我们的目标不是让用户继续无意识地使用 MQL4,而是慢慢地开始重写他的 MQL4 代码。
MQL4-style 是纯粹的 MQL5。它并不比 SB 差。不要在想象中与风车作斗争。你不会与标准库风格作斗争。
iCustom 甚至不在计划中 - 只考虑了标准指标。
关于缓存 - 这绝对不在面向大众的文章中。
在 MT4 与 MT5 关于指标的话题中,标准指标是讨论最少的。几乎所有人都在谈论自定义指标。标准指标是几十年前编写的,已经无可挽回地过时了。在高级 MQL5 中使用古老的指标看起来很奇怪。
文章中不应该解释缓存,但应该做缓存,因为您在 MQL4 风格方面的结论是客观的。
同时访问多个指标时测试速度下降;
补充:顺便说一句,用户的反馈将显示是否需要 High[] 和类似功能,或者是否可以省去 iXXXX 系列。
做个民意调查,看看结果,什么评论都不用说。即使是 Bid/Ask 变量这样简单的事情也是如此。
这篇文章应该叫做 "如何无法编写代码来保存 MQL4 表示法"。
这篇文章的标题应该是 "如何不能编写试图保存 MQL4 表示法的代码",因为这篇文章会让人感到非常恐怖,会泄露句柄(为什么要关闭指标句柄?很多人都会不加思索地复制它。
此外,从指标中提取 1 个值的效率也很低。
我完整地阅读了这篇文章,也看了足够多的代码。
新文章 交易员生存技巧: 由指标制作的快餐已发布:
如果您刚刚切换到 MQL5, 那么本文将会很有用处。首先, 以正常的 MQL4 风格访问指标数据和序列已经完成。其次, 以 MQL5 实现这些整体上更简单。所有函数都尽可能地清晰, 并且非常适合单步调试。
我已经实线了 "注释" 仅供验证。如果在测试器可视化模式下启动 "MACD MQL4 style EA short.mq5" 并将光标放在索引为 #1 的柱线上, 您可以验证它的工作:
图例 1. 在测试器中的 "MACD MQL4 style EA short.mh5"
作者:Vladimir Karputov