关于MQL5向导和标准交易类库的问题 - 页 11

 
Reshetov:

三个问题。

  1. 如何使信号模块只在开盘价上工作,而不是在每一个点上工作?
  2. 我如何在位置跟踪模块中获得信号模块的投票值?你需要在一个已经计算好的信号上进行拖曳,而不是编造另一个信号模块来跟踪。
  3. 如何获得资金 和风险管理模块 中报警模块的投票值?你需要根据已经计算好的交易信号来打开交易量,而不是为了计算交易量而编制另一个信号模块。

理论上,我们当然可以使用向导建立EA,然后手动添加所有这些功能到代码中。但最好是以标准方法的形式实现所有这些,也就是说,对于想使用向导的傻瓜来说,这样他们就不必进入代码并进行编辑,例如,在他们想用一个信号模块替换另一个模块的情况下。

你回答了你自己的所有问题。"...在向导的帮助下建立EA,然后...手动......"。目前还没有其他选择。巫师,很可能在不久的将来不会被开发。标准库类不是教条,而是试图提供一套典型的(在我看来)解决方案。继承(在向导中使用),重载方法,添加自己的方法。你就会 "快乐 "起来......
 
uncleVic:
你自己已经回答了你所有的问题。"......在向导的帮助下建立EA,然后...手动......"。目前还没有其他选择。巫师,很可能在不久的将来不会被开发。

这么好的事业被遗弃在遥远的角落里,实在令人惋惜。

如果它被更新了,很多事情就可以做了,也就是说,我们可以创建现成的模块,傻瓜和其他用户可以从这些模块中组装各种现成的EA,而不需要通过代码。但在这种情况下,我们得到的是与算法的mql4一样的混乱,即你采取一种算法,进入代码并手动使用它。再次违反了OOP原则。例如,如果你想用一个模块替换另一个模块,你将不得不回到代码中,重新手动更改所有内容。你会得到很多废话,因为只有 "爬 "过代码,才能至少了解在什么地方和什么地方进行修改,这将耗费大量的时间。

这是一个好的开始。遗憾的是。我昨天刚刚创建了一个信号 模块,但我仍然不解,如何使整个EA工作而不需要每次都去看源代码。我想写一篇关于如何使用它的文章。 我刚刚插入了模块,添加了头寸管理、资金管理和风险管理,一切正常。但不,这行不通。如果用户使用向导建立了一个EA,它将无法工作。他将不得不写一大堆指示,在代码中寻找什么,修改什么。更不用说我在写指令之前还得自己处理这一切了。

因此,现在用户除了学习mql5、OpenCL等来处理自动交易外,已经没有其他东西了。否则他们不会有任何运气。

好吧,既然这个项目已经被放弃了,我现在将从不同的方向思考。

 
Reshetov:

如此好的努力被遗弃在遥远的角落里,真是太可惜了。

让我们希望它不是被放弃,而是被搁置。我自己对大师的发展有很多有趣的想法。但是...
 
uncleVic:
让我们希望它不是被放弃而是被推迟。我自己对巫师的发展有很多有趣的想法。但是...

希望终将破灭 (c) 流行谚语

对于第一个问题,即如何通过开盘价 测试信号模块,并按点位进行交易,我找到了一个解决方案,这样我就不用去研究代码了,甚至比普遍接受的方案还要好。

我还没有弄清楚如何在头寸管理和股票及风险管理模块中读取信号模块的指示。我搜索了源代码并做了功课。信号模块通过direction()方法获得其结果,也就是说,我只需要在头寸管理和资本与风险管理模块中解决这个非常模块类的一个实例,并调用这个非常方法来读取其值。如何在不改变代码的情况下做到这一点,目前还不清楚。

 
Reshetov:

希望永存 (c) 流行谚语

对于第一个问题,即如何通过开盘价 测试信号模块,并按点位进行交易,我找到了一个解决方案,这样我就不用去研究代码了,甚至比普遍接受的方案还要好。

我也搞不清楚如何在头寸管理和股票及风险管理模块中读取信号模块的指示,没有挖掘代码。我搜索了源代码并四处查看。信号模块通过direction()方法获得其结果,也就是说,我只需要在头寸管理和资本与风险管理模块中解决这个非常模块类的一个实例,并调用这个非常方法来读取其值。如何在不改变代码的情况下做到这一点,目前还不清楚。

如果不改变代码,它可能不会工作。

 
uncleVic:

不改变代码可能是不行的。

一切都还没有失去。你可以创建继承自CExpert、CExpertMoneu和CExpertTrailing的类,并向它们添加必要的方法来访问信号模块类的一个实例。但这里也有一个问题,因为向导在创建的EA 中写了#include <Expert\Expert.mqh>,而不是它的后代。

我们还没有考虑到这一点。

如果开发人员马上猜到一个信号模块可以作为主要模块用于所有其他模块,并且可以在仓位支持和股票及风险管理模块中添加额外的信号(如这个版本的向导),而且代码会更容易。但在我们的案例中,每个模块都需要为信号指定额外的条件,因此它们需要额外的外部设置,这就导致了这样一个有很多参数需要优化的怪物。更不用说来自一个模块的信号可能发生冲突,也就是说,如果市场进入和退出条件相互矛盾,一个信号模块可以打开一个头寸,而一个随行模块--在下一个刻度上关闭它。

 
Reshetov:

一切都还没有失去。毕竟,你可以创建继承自CExpert、CExpertMoneu和CExpertTrailing的类,并向它们添加访问信号模块类实例的必要方法。但这里也有一个问题,因为向导在创建的EA 中写了#include <Expert\Expert.mqh>,而不是它的后代。

我们还没有考虑到这一点。

如果开发人员马上猜到一个信号模块可以作为主要模块用于所有其他模块,并且可以在仓位支持和股票及风险管理模块中添加额外的信号(如这个版本的向导),而且代码会更容易。但在我们的案例中,每个模块都需要为信号指定额外的条件,因此它们需要额外的外部设置,这就导致了这样一个有很多参数需要优化的怪物。不提来自一个模块的信号可能冲突的事实,也就是说,如果市场进入和退出的条件是矛盾的,一个信号模块可以打开一个头寸,而一个随从模块--在下一个刻度上关闭它。



这就是它的设计方式。该向导创建了EA的 "鱼"。更进一步。

  • 替换包容是没有问题的。
  • 主信号是故意在外面产生的(为了方便替换)。
  • 添加一些ints和设置方法调用?
 
uncleVic:

这就是它的本意。主人创造了顾问的 "鱼"。下一步。

  • 替换内联是没有问题的。
  • 主信号是故意在外面产生的(为了便于替换)。
  • 添加一些intuts和setting方法调用?


这就是它的丑陋之处,事情是这样的。

  1. 对交易系统中包含的模块类的方法 的访问甚至被拒绝阅读,这完全排除了协调其工作的可能性。
  2. 信号模块可能很容易与位置跟踪模块发生冲突,因为它们的信号不同,因此不能排除不兼容的情况。
  3. 模块中不同的信号,因此它们都有独立的设置,这导致一个EA的输入设置不是少数,而是很多。不同的设置越多,符合历史的概率就越高。
  4. 在操作向导之后,有时需要通过来源来修复问题。对于不熟悉编程的终端用户来说,它根本不适合,因为他或她需要即插即用。这种混淆也给程序员带来了问题,因为用自己的代码工作要比用向导堆积的代码容易得多。另外一个困难是,类是继承的,也就是说,误解的原因很少能在后代的层面上找到,而是要深入到父类。

我们想要最好的。结果是一如既往的(c)切尔诺梅尔丁

一般来说,大部分的误解都可以被修复,但这必须在根父类层面上进行,然后通过平台的更新来分发固定的类。也就是说,你需要从头寸支持和股票及风险管理模块打开对信号模块的Direction()方法的访问。因为如果个别模块开发者编辑了父类的源代码,所产生的源代码不兼容,所创建的模块将无法在其他计算机上运行。如果模块的开发者创建了带有重载方法的父类,那么不兼容仍然是在主控层面,因为后者写了自己的嵌套,因此,终端用户需要再次编写指令,他们几乎不想进入源代码,如果他们这样做,那么在一个单一的符号或其他地方出错,等等。

 
Reshetov:

这就是问题所在,因为从一开始就有一些事情没有考虑到。

  1. 对交易系统中包含的模块类的方法 的访问甚至被拒绝阅读,这完全排除了协调其工作的可能性。
  2. 信号模块可能很容易与位置跟踪模块发生冲突,因为它们的信号不同,因此不能排除不兼容的情况。
  3. 模块中的信号不同,因此它们都有独立的设置,这导致EA的输入设置不是少数,而是很多。不同的设置越多,符合历史的概率就越高。
  4. 在操作向导之后,有时需要通过来源来修复问题。对于不熟悉编程的终端用户来说,它根本不适合,因为他或她需要即插即用。这种混淆也给程序员带来了问题,因为用自己的代码工作要比用向导堆积的代码容易得多。另外一个困难是,类是继承的,也就是说,误解的原因很少能在后代的层面上找到,而是要深入到父类。

我们想要最好的。结果是一如既往的(c)切尔诺梅尔丁

一般来说,大部分的误解都可以被修复,但最好是在根父类层面上进行修复,然后通过更新分发固定的类。因为如果父类的源代码被模块开发者修正,所产生的源代码不兼容,创建的模块将无法在其他计算机上运行。如果开发者创建了带有重载方法的父类,那么不兼容就已经在主控层面了,因为他写了自己的内含物,因此又需要给终端用户写说明,而他们不太可能想进入源代码,如果他们进入了,那么在一个字符或其他地方出错,如此反复。

给我们提出你的具体建议。我们将考虑这些问题。
 
uncleVic:
让我们为您提供一些建议。我们将审查它们。

到目前为止,只有一件事能解决上述缺点。

开放读取信号模块的Direction()方法从头寸管理和资本与风险管理模块返回的数值的权限。

再增加一个方法,例如,标识符为double的getMainSingnal(),它指向信号模块类的一个实例,并返回信号模块的Direction()方法的结果。由于这种信息交流是在只读模式下进行的,因此安全不会受到任何破坏。

要做到这一点

  1. 在CExpertMoney和CExpertTrailing类中分配一些字段来存储CExpertSignal 的实例,即信号的主要模块。
  2. CExpertSignal的实例,即信号模块,应该在初始化这些模块的实例时传递给头寸管理和资本与风险管理模块,并存储在步骤1的指定字段中。显然,在这样做之前,我们还应该检查(确保)是否已经有一个信号模块类的实例,即它已经被创建。
  3. 在CExpertMoney和CExpertTrailing类中创建额外的方法,标识符为double getMainSingnal(),该方法指向信号模块类的一个实例,存储在这些类的相应字段中,并返回信号模块Direction()方法的结果。

P.S. CExpert类有一个对信号模块类实例的引用。

CExpertSignal    *m_signal;                   // trading signals object
你必须为CExpertMoney和CExpertTrailing类创建类似的字段,并在初始化时将上述字段的相同值传递给CExpert类。