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

 
Reshetov:

到目前为止,只有一个单一的解决方案来解决上述缺点。

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

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

要做到这一点

  1. 在CExpertMoney和CExpertTrailing类中分配字段以存储CExpertSignal类的实例,即信号的主要模块。
  2. 这个非常CExpertSignal类实例,即信号模块,应该在这些模块类实例的初始化过程中传递给头寸管理和资金管理模块,并将其保存在步骤1中指定的字段中。显然,在这样做之前,你应该检查(确保)是否已经有一个信号模块类的实例,即它被创建了。
  3. 在CExpertMoney和CExpertTrailing类中创建额外的方法,标识符为double getMainSignal(),它指的是信号模块类实例,存储在这些类的相应字段中,并作为结果返回,信号模块Direction()方法的结果。

几乎一切都很清楚。我唯一想澄清的是:"为什么你的这种在MM和尾随者层面看到信号的愿望必须在基类层面实现?

我不认为这将是一件好事(即坏事)。这个算法并不典型(在我看来)。按照我的理解,你有自己的MM和尾随模块(有自己的算法与信号相联系)。

在这里,把相应的1.,2.,3.放入其中。

 
uncleVic:

几乎一切都很清楚。我唯一想澄清的是 "为什么你的这种希望在MM和尾部看到信号的愿望要在基类层面上实现?"。

我不认为这将是一件好事(即坏事)。这个算法并不典型(在我看来)。据我所知,你有自己的MM和尾随模块(有自己的算法与信号相连)。

所以,把适当的1、2、3放在其中。

关键是,Master以SEhregt类为基础。因此,我无法在我创建的模块中覆盖必要的功能,因为它们从一开始就与这个非常基本的CEhregt类不兼容,因为它们无法访问信号模块类的实例。

因为信号模块类的实例只存储在Expert.mqh文件中SEhregt类的字段中,第67行

CExpertSignal    *m_signal;                   // trading signals object

并且这个字段不与其他类和由它们创建的模块共享(不可访问)。

正是由于这个原因,我没有办法覆盖CExpertMoney和CExpertTrailing 类,使它们与向导兼容。

毕竟,如果在父类中拒绝访问,那么子类就不会以任何方式得到它。


刨根问底 (c) "箴言",科兹马-普鲁特科夫著

 

我想出了如何在不传递CExpertSignal实例的情况下将交易信号从信号模块传递到头寸维护和资金及风险管理模块。

让我们给CExpertMoney和CExpertTrailing类各添加两行。

  double m_signaldirection; // Direction from signals module
 
  void              setSignalDirection(double value)  { m_signaldirection = value; }
  

对于ExpertMoney.mqh文件。

class CExpertMoney : public CExpertBase
  {
protected:
   //--- Direction from signals module  
   double m_signaldirection;
   //--- input parameters
   double            m_percent;

public:
                     CExpertMoney();
   void              setSignalDirection(double value) { m_signaldirection = value; }        
   //--- methods of setting adjustable parameters
   void              Percent(double percent)    { m_percent=percent; }
   //--- method of verification of settings
   virtual bool      ValidationSettings();
   //---
   virtual double    CheckOpenLong(double price,double sl);
   virtual double    CheckOpenShort(double price,double sl);
   virtual double    CheckReverse(CPositionInfo* position,double sl);
   virtual double    CheckClose(CPositionInfo* position);
  };

对于ExpertTrailing.mqh文件。

class CExpertTrailing : public CExpertBase
  {
protected:
   
    //--- Direction from signals module
   double m_signaldirection;
public:
   //---
   void              setSignalDirection(double value) { m_signaldirection = value; }        
   virtual bool      CheckTrailingStopLong(CPositionInfo *position,double& sl,double& tp)  { return(false); }
   virtual bool      CheckTrailingStopShort(CPositionInfo *position,double& sl,double& tp) { return(false); }
  };


通过这样做,我们已经定义了必要的字段和方法来传递交易信号。现在我们需要将这些交易信号传递给模块类。我们将在Expert.mqh中进行,即对CExpert类进行操作

我们将写一行,将我们的交易信号传递给头寸支持类

m_trailing.setSignalDirection(m_signal.Direction());

并将其插入方法的开头,该方法在每个追踪止损前都被调用,即CheckTrailingStop()。

bool CExpert::CheckTrailingStop()
  {
//--- Set signal direction to trailing stops module
   m_trailing.setSignalDirection(m_signal.Direction()); 
//--- position must be selected before call
   if(m_position.PositionType()==POSITION_TYPE_BUY)
     {
      //--- check the possibility of modifying the long position
      if(CheckTrailingStopLong()) return(true);
     }
   else
     {
      //--- check the possibility of modifying the short position
      if(CheckTrailingStopShort()) return(true);
     }
//--- return without operations
   return(false);
  }

我们将写一条线,把交易信号传到资金和风险管理类。

m_money.setSignalDirection(m_signal.Direction());

并将其插入方法的最开始,该方法在每个位置打开 之前被调用,即CheckOpen()。

bool CExpert::CheckOpen()
  {
//--- set signal direction to money management module
   m_money.setSignalDirection(m_signal.Direction());
   if(CheckOpenLong())  return(true);
   if(CheckOpenShort()) return(true);
//--- return without operations
   return(false);
  }

就这样,问题就解决了。

现在,我们可以通过访问m_signaldirection字段的值来获得仓位管理和股票及风险管理模块中交易信号的当前值。我们现在要做的就是在文档中注册CExpertMoney和CExpertTrailing类中的新字段和方法,并将修改后的文件加入到更新中。

 

以下是这些文件。在《专家》中,第100和123行是手写的。

如果你有更多的问题,请不要犹豫地提出。

 
uncleVic:

以下是这些文件。在《专家》中,第100和123行是手写的。

如果你有更多问题,请随时与我联系。

这些开发者是什么样的人?他们什么时候才能开始倾听已经有创建交易系统经验的交易者的需求,而不是想出他们自己设计的交易系统的设想,因为他们需要手动调整源代码,所以终端用户几乎无法使用?我必须解释多少次,我可以手动爬进去纠正它,即使这样,我也要花很长时间才能明白什么是什么,尽管我熟悉编程。而终端用户不太可能进入代码,因为他不懂编程。你自己宣称,我引用一下。

"编程语言的知识不再是创建交易机器人的先决条件。"见https://www.mql5.com/ru/articles/240。

"MQL5向导 "的第一个版本已经有可能快速创建一个随时可用的专家顾问,作为MQL5源代码形式的一组简单模块。你甚至不需要知道MQL5- 你只需要阅读"在MQL5向导中建立自己的专家顾问"(见https://www.mql5.com/ru/articles/275)

现在,事实证明,需要有编程语言的知识,因为用户必须在向导之后输入代码,在那里编辑一些东西。也就是说,以前所有的声明都是开发者的发明和欺骗。

例如,如果我自己编写的资金和风险管理模块,必须根据另一个模块开发者编写的模块发出的交易信号水平开仓。因此,我的模块将与向导不兼容。如何向用户解释,他们必须在代码的某个地方插入一些字符串,才能使模块工作?毕竟,模块开发者应该创建模块,而master应该自动将它们组合成一个一致的系统,这样的模块,至少不会相互冲突,而且完全兼容。但在你的情况下,向导并没有做到这一点,因为在向导之后,你必须进入代码,手动重做一切。

我在上一篇文章中指出,在父类文件中六行,真的有这么难吗?而且问题会自己解决,没有人必须进入来源并改变那里的东西。你的手会掉落什么?为什么要把时间浪费在一些乱七八糟的东西上,并演示在向导之后必须手动修正的东西? 你就不能把同样的时间花在更有用的任务上,这样以后就没有人需要进入代码来解决类似的问题了?

你们公司的意识形态是什么--一方面宣称完全自动化,但当涉及到实践时,他们建议进入代码,在所谓的 "自动化 "之后用手重做一切?

总而言之,按照我的理解,解释这一切是没有用的。你不应该对交易者不愿意切换到MT5感到惊讶,因为该平台是粗糙的,不是为了方便自动交易而开发的,而是为了方便该平台的开发者。除非用户彻底学会了编程,否则他最好远离自动交易。

如果你不愿意,你就不必这样做。如果你没有别的事可做,那就坐在这里,向每个用户解释他们需要在哪里以及如何用手进入源代码,以及到底要修复什么。

Собери свой торговый советник в Мастере MQL5
Собери свой торговый советник в Мастере MQL5
  • 2011.01.14
  • MetaQuotes Software Corp.
  • www.mql5.com
Знание языков программирования теперь не является обязательным условием для создания торговых роботов. Если раньше это действительно служило непроходимым препятствием для реализации своих торговых стратегий, то появление Мастера MQL5 в корне изменило ситуацию. Начинающие трейдеры могут перестать тревожиться из-за отсутствия опыта программирования - с новым визардом, позволяющим быстро генерировать код советника, он не понадобится.
 
我担心你要么是被极端主义所控制,要么是根本不了解这些工具的适用性极限。

在任何情况下,以这样的论证水平和几乎每一个问题都超出了夸张的限度,就不可能与你合作了。真正的工作涉及有意识的决策,而不是口头上的蛊惑。
 
Renat:
恐怕你要么是被最大化主义所控制,要么是根本不了解工具的适用性限制。

在任何情况下,以这样的论证水平和几乎每一个问题都超出可接受的夸张程度,就不可能与你合作了。真正的工作意味着有意识的决策,而不是口头上的蛊惑。

总的来说,我没有要求工作,即挣钱,我很乐意在自愿的基础上合作。我如何谋生,在哪里谋生,我自己决定。

好吧,它不会,也没有必要。我们的业务是提供,你有权利拒绝。正如他们所说:主人是老板。

如果你的公司已经了解了一切,甚至教傻瓜创建所谓的 "现成的 "专家顾问。 此外,关键是他们只适合演示向导,但他们不是很适合自动交易,因为即使在历史数据上,股权曲线看起来不方便,因为模块化的实现,但一个完整的交易系统的模块一致性是缺乏的。

好运!

 
Reshetov:
...

例如,如果我自己编写的资金 和风险管理模块,应该根据另一个模块开发者编写的模块发出的交易信号的水平来开仓。结果将是我的模块已经与向导不兼容了。如何向用户解释,他们必须在代码的某个地方插入一些字符串,才能使模块工作?毕竟,模块开发者应该创建模块,而master应该自动将它们组合成一个一致的系统,这样的模块,至少不会相互冲突,而且完全兼容。而你有一个向导并没有做到这一点,因为之后你必须进入代码并手动重做一切。

我在上一篇文章中指出,六行 到父类文件中,真的有这么难吗?而且问题会自己解决,没有人必须进入源头并改变那里的东西。你的手会掉落什么?为什么要把时间浪费在一些乱七八糟的东西上,演示如何在向导之后手动修复一些东西呢? 你就不能把同样的时间花在更有用的地方,这样以后就不会有人再进入代码来解决类似的问题了。

...

你的方法违反了类的封装,结果带来了层次的混乱。

闲暇时可阅读史蒂夫-麦考内尔的《完美代码》一书。

想象一下,作为一个生产手套的工厂,有一个用于左右手的五指印章,但后来有一个六指手套的小订单。毕竟有这样的人。但你没有为他们制作邮票(会制作一批,并在那里停留一段时间),而是建议修改五趾邮票,制作一个滑动的手指。它似乎是普遍的,一切都很好,但为了普遍性(为了偶尔生产六指的微小需要),五指手套印章的力量将被削弱。然后再订购一批300个四指,再次把经过充分验证的、可靠的模板揉碎。

上面已经告诉你了。

"为什么你想在MM和尾随者层面看到信号的愿望必须在基类层面实现?"。

我不认为这将是好事(即坏事)。这个算法并不典型(在我看来)。按照我的理解,你有自己的MM和尾随模块(有自己的算法与信号相联系)。

与其对标准圣经进行修改,还不如进行开发来扩展它(通过继承)。那么这将是非常有趣的。

HZZ此外,为了让人们不必处理错综复杂的代码(就像你上面写的那样),你可以把准备好的模块用biblio包装起来,然后sharovariously倒入市场,然后只需插入Reshetov的模块,然后点击【下载面团】。

 
Urain:

你的方法违反了对类的封装,因此引入了层次混乱的问题。

闲暇时可阅读史蒂夫-麦考内尔的《完美代码》一书。

简单地说,把大师想象成一个手套工厂,有一个五指的印章,供左右手使用,但后来有一个小订单,是六指的手套。毕竟,有这样的人。但你没有为他们制作邮票(会制作一批,并在那里停留一段时间),而是建议修改五趾邮票,制作一个滑动的手指。它似乎是普遍的,一切都很好,但为了普遍性(为了偶尔生产六趾手套的微小需要),五趾印章的力量将被削弱。然后再订购一批300个四指,再次把这个经过充分验证的可靠模板揉碎。

上面已经告诉你了。

与其对标准圣经进行修改,不如进行开发来扩展它(通过继承)。那么,这将是真正有趣的。
我们可以说多少次,我们不能继承父类中没有的东西?你什么时候才能最终结识史蒂夫-麦康奈尔(Steve McConell)亲自撰写的《代码大全》一书?
  1. 我的方法并不违反封装原则,因为在我提出的版本中,所有多余的东西都被隐藏起来,模块只被赋予一个交易信号,作为一个双倍类型的值,并且只在读取模式下。与某些人不同的是,我不仅读过关于OOP的书,而且仔细研究过它们。
  2. 我没有建议在模板的基础上创建六指手套,即把第六个手指作为额外的模块附在上面,而只是建议把所有现有的模块与信号模块的信号相匹配,实际上,信号模块是交易系统的主要模块,因为整个系统必须按其指令运行。是你提出了模块化的建议,也就是说,有可互换手指的手套。但是,由于你使右手不知道左手在做什么,也就是说,其他模块不能从信号模块获得信息并与之同步行动,因此,当用户把手套戴在手上时,看到它的一个手指很小,不适合戴在手上,而另一个手指却很大,过度了,手套就会有不同大小的手指(模块)。

例如,跟踪止损是根据模块的第三方开发者开发的独立信号系统执行的,如移动波或抛物线,其信号在某些点上与模块的信号相矛盾,交易系统开始不一致地工作。资金和风险管理模块也不能以心灵感应的方式猜到交易信号很弱,是时候减少开仓量,并根据一些独立于信号模块的规则行事,即其中一个要求在转角处放慢速度,另一个则加快速度。而在你所谓的大师的帮助下建立的整个交易系统,结果就像克雷洛夫的寓言 "螃蟹和梭鱼 "一样。不多也不少。而这种召集鲁莽的顾问的寓言式意识形态,贵公司正试图强加给我们用于自动交易。我们需要它吗?

其结果是交易系统中的这种公平和平衡的图表,只能吓唬交易者和投资者,见https://www.mql5.com/ru/code/833。




这并不是因为模块的创建者,在这个特定的情况下,尼古拉-科西津做错了什么,而是因为其余的交易系统模块不能相互协调,工作不一致。

但解释是没有用的。平台开发者不写可怜的六行字来解决问题,而是在论坛上写下数公里的脚注,指责交易系统的开发者散布妖言惑众、违反封装规定和其他弥天大罪,但他们不会动用一根手指来纠正自己的不足和误解。

所以没有必要再进行讨论。保持你的观点,做你想做的事。我很厌恶它,它毫无用处,因为平台开发者根本不在乎,因为他们不做自己的东西,这些非常的工具是否可以被平台用户用于自动交易,开发者也不在乎。饱受饥饿的人不知道自己在饿什么。

Модуль торговых сигналов, выполненный на основе индикатора Heiken_Ashi_Smoothed
Модуль торговых сигналов, выполненный на основе индикатора Heiken_Ashi_Smoothed
  • 投票: 7
  • 2012.02.23
  • Nikolay Kositsin
  • www.mql5.com
Модуль торговых сигналов для Мастера MQL5. Сигналом для открытия позиций служит изменение цвета свечи, формируемой индикатором Heiken_Ashi_Smoothed.
 
Reshetov:
...

雷谢托夫,我甚至不想读你的情绪化的涂鸦。你想争论,就争论你的案子。

向导的意义在于创建一个能满足大多数交易者需求的模板。我在cherver上有一个EA模板(我自己写的),它设置了基本功能。而在实践中,它总是要被纠正的。但编辑的内容很少。如果我创建了一个模板,根本不需要编辑,那将是一个巨大的代码,适用于所有场合,人们可能会迷失在其中。

向导创建的模板已经在工作,不懂编程的人可以照样使用。如果你了解编码,很容易把它改成你想要的样子。仅仅一次就足以了解事物是如何被创建的,以及它们在标准库中被分离的位置。此外,你也可以将标准库作为模板,只需将你喜欢的部分复制到你自己的代码中。