文章 "构建自动运行的 EA(第 15 部分):自动化(VII)"

 

新文章 构建自动运行的 EA(第 15 部分):自动化(VII)已发布:

我们将继续讨论上一篇文章的主题,以便完成有关自动化的这一系列文章。 我们将看到所有内容如何搭配到一起,令 EA 像钟表一样运行。

我所展示出的主要故障、问题和困难,均涉及一名程序员在创建自动运行 EA 时的管辖工作。 但我也为您展示出,这可以带来很多知识,改变您实际观察市场的方式。

我尝试以这样一种方式呈现事物,即您可以实际创建一个安全,可靠和强大的系统。 与此同时,它应该是模块化的、紧凑的和非常轻巧的。 您应该能够将其与许多其它事物结合运用。 拥有一个不允许您同时操作各种事物的系统是没有用处的。 因为若只交易一种资产,您肯定不能真正获得丰厚的利润。

也许大多数读者会对序列中的最后一篇文章感兴趣,我用 3 个实际示例解释了这个思路。 然而,请注意,为了发挥本文的优势,必须了解文章序列整体。 但以一种非常简单的方式,我相信我已经设法传达了这样一种思想,即没有必要成为编程天才,或专攻几门课程并毕业。 您真正需要了解的是 MetaTrader 5 平台,和 MQL5 语言的工作原理。


我还表述了当 MQL5 或 MetaTrader 5 不未供您想要使用的指标时,如何为高效的工作系统创建特定环境。 这是在示例 3 中完成的,我展示了如何创建内部 HILO 指标。 但无论如何,系统应始终正确实现和测试。 因为创建一个最终不能给您带来任何利润的出色系统是没有意义的。

作者:Daniel Jose

 

你好,丹尼尔,首先我要祝贺你在与开发人员和爱好者社区合作方面所取得的成绩。

关于这一系列文章中 EA 的执行,我有一个问题。

根据您的文档,我将 OCO 订单更改为挂单,并在净额结算和对冲账户中进行了测试。但订单没有执行。

日志中也没有错误。

会是什么原因呢?

注:我没有修改代码中的任何内容,只是修改了买入和卖出逻辑......我用我的逻辑(我的策略)进行了测试,它没有给出任何条目,我就想:我做错了什么,kkkk....,然后我把你的代码原封不动地拿过来,编译了一下,同样的事情发生了。

它可以手动运行(当你设置批量数量时),但不能自动运行。

 
César Augusto #:

嗨,丹尼尔,首先我要祝贺你在与开发人员和爱好者社区合作方面的出色表现。

我有一个关于运行这一系列文章中的 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,即使是元素较多的枚举。

Documentation on MQL5: Language Basics / Data Types / Integer Types / Enumerations
Documentation on MQL5: Language Basics / Data Types / Integer Types / Enumerations
  • www.mql5.com
Enumerations - Integer Types - Data Types - Language Basics - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
FernandoN23 #:

丹尼尔,感谢你对教学的奉献。

能否请您检查一下使用 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 的大小(以字节为单位),而不是返回的最大元素数。

 
Daniel Jose #:

你把事情搞混了。文档中说的 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) 的返回值。

有了这个问题,我应该如何创建一个考虑到枚举中确切元素数量的循环?

版主编辑了 格式不正确的 代码

 
@FernandoN23 #: 脚本 test.mq5

请使用 代码按钮(Alt -S)

编辑器中的代码按钮

Nota de usuário - MQL5.community
Nota de usuário - MQL5.community
  • www.mql5.com
Você acabou de registrar e, provavelmente, você tem perguntas como: "Como faço para inserir uma imagem na minha mensagem?", "Como faço para formatar meu código fonte MQL5?", "Onde são mantidas minhas mensagens pessoais?". Você pode ter muitas outras perguntas. Neste artigo, nós preparamos algumas dicas práticas que ajudarão você a se acostumar com o MQL5.community e tirar o máximo proveito de seus recursos disponíveis.
 
日安,丹尼尔先生,请您分享
EA_v1.mq5、EA_v2.mq5 和 EA_v3.mq5 文件。或者我想知道在哪里可以看到附件中的文件。
 

你好,我在EURUSD 1M图表上使用你提供的EA,在使用过程中,遇到了ClosePosition函数无法成功平仓

我猜想是不是因为账号类型为Hedging,平仓必须采用将action设定为TRADE_ACTION_CLOSE_BY,而不是 TRADE_ACTION_DEAL

 
亲爱的丹尼尔祝贺你的文章。请帮我解决一个问题:当我替换 "inline virtual void Triggers(void) final "方法的代码块,在触发移动平均线信号的条形图的高点或低点发送挂单 时,EA 已经买入了 2 个合约量,尽管它设置为买入 1 个合约量。如果我回到原始代码,它又能完美运行了。如果您能帮助我,谢谢!..!