你好,丹尼尔,首先我要祝贺你在与开发人员和爱好者社区合作方面所取得的成绩。
关于这一系列文章中 EA 的执行,我有一个问题。
根据您的文档,我将 OCO 订单更改为挂单,并在净额结算和对冲账户中进行了测试。但订单没有执行。
日志中也没有错误。
会是什么原因呢?
注:我没有修改代码中的任何内容,只是修改了买入和卖出逻辑......我用我的逻辑(我的策略)进行了测试,它没有给出任何条目,我就想:我做错了什么,kkkk....,然后我把你的代码原封不动地拿过来,编译了一下,同样的事情发生了。
它可以手动运行(当你设置批量数量时),但不能自动运行。
嗨,丹尼尔,首先我要祝贺你在与开发人员和爱好者社区合作方面的出色表现。
我有一个关于运行这一系列文章中的 EA 的问题。
我根据您的文档,将 OCO 订单更改为挂单,在净额结算和对冲账户中进行了测试。但是订单没有执行。
日志中也没有显示任何错误。
会是什么原因呢?
注意:我没有修改代码中的任何内容,只是修改了买入和卖出逻辑......我用我的逻辑(我的策略)进行了测试,结果没有给出任何条目,我就想:我做错了什么,kkkk....,然后我把你的代码原封不动地拿过来编译,结果还是一样。
它可以手动运行(当你设置批量数量时),但不能自动运行。
只有当您设置的输入参数允许触发订单时,才会自动输入。换句话说,如果您的逻辑规定指标(不管是什么指标)需要有一定的值,那么只有达到该值时才会自动进入或退出。否则,将永远不会发生。您可能已经看到序列中有 3 个设置示例。试着研究每一个,以了解触发逻辑是如何工作的。如果不了解触发逻辑,就无法让自动装置发挥作用。这就像一个捕鼠器,如果你把它设定为捕捉大象,那么当鼠标碰到它时,它就不会被触发😂......总之,研究一下例子中的机制,祝你好运 ...😁👍
丹尼尔,感谢您对教学的奉献。
能否请您检查一下使用 C_Automaton_v3.mqh 的第 15 版 EA 的功能?
eSelectMedia 列表的定义很清楚。但是,我认为在 FOR 循环中操作 m_Op 数组元素时,特别是在使用 "sizeof(eSelectMedia) "时,会出现问题。
根据文档(https://www.mql5.com/en/docs/basis/types/integer/enumeration),sizeof 总是返回 4,即使是元素较多的枚举。
- www.mql5.com
丹尼尔,感谢你对教学的奉献。
能否请您检查一下使用 C_Automaton_v3.mqh 的第 15 部分第 3 版 EA 的运行情况?
eSelectMedia 列表的定义很清楚。但是,我认为在 FOR 循环中对 m_Op 数组元素的操作,特别是对 "sizeof(eSelectMedia) "的操作上存在一些问题。
根据文档(https://www.mql5.com/en/docs/basis/types/integer/enumeration),sizeof 总是返回 4,即使是元素较多的枚举。
你把事情搞混了。文档中所说的 4 是用于返回 sizeof 的大小(以字节为单位),而不是返回的最大元素数。
丹尼尔,谢谢你的快速回复。
还是关于 FOR 与 sizeof(enum) 的问题,我将在下面添加一个测试脚本、得到的结果和另一个问题。
感谢您的指导。
test.mq5 脚本
//+------------------------------------------------------------------+ void OnStart() { enum eSelectMedia {MEDIA_FAST, MEDIA_SLOW}; enum eSelectMeses {JANEIRO, FEVEREIRO, MARCO, ABRIL, MAIO, JUNHO, JULHO, AGOSTO, SETEMBRO, OUTUBRO, NOVEMBRO, DEZEMBRO}; struct st01 { double Buff[]; int Handle; }m_Op[sizeof(eSelectMedia) + 1]; Print("Tamanho do eSelectMedia = ", sizeof(eSelectMedia)); Print("Tamanho do eSelectMeses = ", sizeof(eSelectMeses)); Print("Tamanho do m_Op = ", ArraySize(m_Op)); Print("========= Mostrar enum eSelectMedia ========="); for (int i = sizeof(eSelectMedia); i >= 0; i--) { Print("eSelectMedia - idx = ", i); } Print("========= Mostrar enum eSelectMeses ========="); for (int i = sizeof(eSelectMeses); i >= 0; i--) { Print("eSelectMeses - idx = ", i); } Print("========= Mostrar enum m_Op ========="); for (int i = ArraySize(m_Op); i >= 0; i--) { Print("m_Op - idx = ", i); } } // 结束 OnStart() //+------------------------------------------------------------------+
结果:
2023.06.07 09:09:10.415 teste (EURUSD,M1) Tamanho do eSelectMedia = 4 2023.06.07 09:09:10.415 teste (EURUSD,M1) Tamanho do eSelectMeses = 4 2023.06.07 09:09:10.415 teste (EURUSD,M1) Tamanho do m_Op = 5 2023.06.07 09:09:10.415 teste (EURUSD,M1) ========= Mostrar enum eSelectMedia ========= 2023.06.07 09:09:10.415 teste (EURUSD,M1) eSelectMedia - idx = 4 2023.06.07 09:09:10.415 teste (EURUSD,M1) eSelectMedia - idx = 3 2023.06.07 09:09:10.415 teste (EURUSD,M1) eSelectMedia - idx = 2 2023.06.07 09:09:10.415 teste (EURUSD,M1) eSelectMedia - idx = 1 2023.06.07 09:09:10.415 teste (EURUSD,M1) eSelectMedia - idx = 0 2023.06.07 09:09:10.415 teste (EURUSD,M1) ========= Mostrar enum eSelectMeses ========= 2023.06.07 09:09:10.415 teste (EURUSD,M1) eSelectMeses - idx = 4 2023.06.07 09:09:10.415 teste (EURUSD,M1) eSelectMeses - idx = 3 2023.06.07 09:09:10.415 teste (EURUSD,M1) eSelectMeses - idx = 2 2023.06.07 09:09:10.415 teste (EURUSD,M1) eSelectMeses - idx = 1 2023.06.07 09:09:10.415 teste (EURUSD,M1) eSelectMeses - idx = 0 2023.06.07 09:09:10.415 teste (EURUSD,M1) ========= Mostrar enum m_Op ========= 2023.06.07 09:09:10.415 teste (EURUSD,M1) m_Op - idx = 5 2023.06.07 09:09:10.415 teste (EURUSD,M1) m_Op - idx = 4 2023.06.07 09:09:10.415 teste (EURUSD,M1) m_Op - idx = 3 2023.06.07 09:09:10.415 teste (EURUSD,M1) m_Op - idx = 2 2023.06.07 09:09:10.415 teste (EURUSD,M1) m_Op - idx = 1 2023.06.07 09:09:10.415 teste (EURUSD,M1) m_Op - idx = 0
eSelectMedia 枚举有 2 个元素。
eSelectMonths 枚举有 12 个元素。
根据文档,sizeof() 的返回值为 4,对于其中任何一个元素都是如此。
根据 C_Automaton_v3.mqh 文件,m_Op 的 ArraySize() = 5,因为它是根据 sizeof(eSelectMedia) + 1 定义的。
当我在 FOR 循环中使用 sizeof(enum) 时,没有考虑相应枚举中的元素数量。对于有 2 个元素的枚举和有 12 个元素的枚举,交互都考虑了 4,也就是 sizeof(enum) 的返回值。
有了这个问题,我应该如何创建一个考虑到枚举中确切元素数量的循环?
版主编辑了 格式不正确的 代码。
- www.mql5.com
你好,我在EURUSD 1M图表上使用你提供的EA,在使用过程中,遇到了ClosePosition函数无法成功平仓
我猜想是不是因为账号类型为Hedging,平仓必须采用将action设定为TRADE_ACTION_CLOSE_BY,而不是 TRADE_ACTION_DEAL
新文章 构建自动运行的 EA(第 15 部分):自动化(VII)已发布:
我们将继续讨论上一篇文章的主题,以便完成有关自动化的这一系列文章。 我们将看到所有内容如何搭配到一起,令 EA 像钟表一样运行。
我所展示出的主要故障、问题和困难,均涉及一名程序员在创建自动运行 EA 时的管辖工作。 但我也为您展示出,这可以带来很多知识,改变您实际观察市场的方式。
我尝试以这样一种方式呈现事物,即您可以实际创建一个安全,可靠和强大的系统。 与此同时,它应该是模块化的、紧凑的和非常轻巧的。 您应该能够将其与许多其它事物结合运用。 拥有一个不允许您同时操作各种事物的系统是没有用处的。 因为若只交易一种资产,您肯定不能真正获得丰厚的利润。
也许大多数读者会对序列中的最后一篇文章感兴趣,我用 3 个实际示例解释了这个思路。 然而,请注意,为了发挥本文的优势,必须了解文章序列整体。 但以一种非常简单的方式,我相信我已经设法传达了这样一种思想,即没有必要成为编程天才,或专攻几门课程并毕业。 您真正需要了解的是 MetaTrader 5 平台,和 MQL5 语言的工作原理。
我还表述了当 MQL5 或 MetaTrader 5 不未供您想要使用的指标时,如何为高效的工作系统创建特定环境。 这是在示例 3 中完成的,我展示了如何创建内部 HILO 指标。 但无论如何,系统应始终正确实现和测试。 因为创建一个最终不能给您带来任何利润的出色系统是没有意义的。
作者:Daniel Jose