文章 "基于交易模块创建多个 EA 交易" - 页 3

 
Serj_Che:

我认为这篇文章应该改名--既然可以复杂化,为什么还要简单化呢?

说得好。

有趣

至少我理解了(或者我认为我理解了)作者想要传达给读者的精髓。

这就是我要说的。每个人都理解了所写内容的精髓,但有谁会把所附代码当作某个开发阶段的现成实现呢?除了作者,几乎没有人。这篇文章只是一篇入门文章,你只能从中获得理念,而不是代码。而且你也不需要为此写那么多字母。

如果你说自己是装载机,那就进入正文。如果你决定教导他人或分享自己的经验,那么你在写作时就应该仔细斟酌每一个字和所提供信息的结构。如果思想是行走的,想拥抱浩瀚,写尽世间万物,那就没有什么可拿出来写文章的 根本计划。 而说这是 1.0 版测试版的话,也是不合适的。因为这有损一个称职的程序员的声誉。

我希望论坛管理部门能对发表的材料多加注意,对作者的作品(不仅是文章,还有代码)进行更严格的控制。不要为了增加发表数量而一窝蜂地发表所有文章。这样就不会像 MQL4 中的 Codebase 那样。在数以百计的 1.0 测试版之后,真正有价值的无类比作品就会丢失。

 

Руководству форума желаю...

1.不要告诉我怎么写或写什么。

2.不要告诉 MetaQuotes 软件公司应奉行何种营销政策,以及如何评估和选择其产品的作者。

这些观点不是愿望,而是警告。如果您继续在我文章的论坛主题中散布消极言论,并告诉 MetaQuotes 应该做什么以及如何做,我将认为您是在诋毁我所做的工作,并质疑 MetaQuotes 团队的专业性。在这种情况下,我将向该版块的版主提出相应的投诉,我有充分的理由相信,我和您之间的冲突将得到有利于我的解决。

让我们不要将此事诉诸官方澄清关系,而直接达成友好协议:您将停止在专门讨论我的文章的主题中撰写与此处讨论的主题毫无关系的信息,并停止诋毁我所做的工作。如果你不再在这里发表任何东西,那就更好了。我理解你的观点,你已经在前几页表达过了。我不同意你的观点,你也不同意我的观点。我认为我们都是聪明人,让我们停止这种无用的争论吧。

 
udmurt2:

我希望论坛的管理部门能够更加关注发表的材料,对作者的作品(不仅是文章,还有代码)进行更严格的控制。不能为了增加发表数量,就把所有的东西都一网打尽。这样就不会像 MQL4 中的 Codebase 那样。在数以百计的 1.0 测试版之后,真正有价值的无类比作品就会丢失。

+1

我认为"文章" 部分应该 消费者 有用Nadelektsya,不吓唬和混淆他们 !

现在--"Chukcha 是作家,Chukcha 不是读者" .....

 

>>> 试想一下,您的单个智能 交易系统可同时在所有可用工具和所有可能的时间框架上交易几十种交易策略! 此外,该智能交易系统在测试器中经过完美测试,其中包含的所有策略都有一个或多个资金管理系统

这正是我在锦标赛上组织 Expert Advisor 交易的方式。在我看来,一切都比较简单。最重要的是正确设计一切,不要混为一谈。

//+------------------------------------------------------------------+
//|Vigor-Levels.mq5
//| 2010 年,MetaQuotes 软件公司版权所有。
//|http://www.mql5.com | |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#include <Vigor\Strategy.mqh>

#include <Vigor\TradeSignal.mqh>
#include <Vigor\ADXMAStrategy.mqh>
#include <Vigor\ADXStrategy.mqh>
#include <Vigor\MAVSimpleStrategy.mqh>
#include <Vigor\Order.mqh>
#include <Vigor\Dispatcher.mqh>
#include <Vigor\AdaptiveStrategy.mqh>
CDispatcher dispatcher;

//+------------------------------------------------------------------+
//| 专家初始化函数|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   int myTick = 60;
   EventSetTimer(myTick);
   dispatcher.tickSeconds = myTick;

  //--调度器对象处理订单,策略对象
// 只处理信号,不与市场打交道

  //-- CStrategy 类的继承者。
 //--战略
   CMAVStrategy *s4 = new CMAVStrategy();
   s4.Symbol = "EURGBP";
   s4.onBars = true;
   s4.TimeFrame = PERIOD_M5;
   s4.HourStart = 7;
   s4.HourEnd = 18;
   s4.Risk = 0.1;
   s4.takeProfit = 2000;
   s4.stopLoss = 450;
   s4.trailingStop = 77;
   s4.lots = 0.1;
   s4.maxLots = 5;
  //--custom;
   s4.period1 = 2;
   s4.max = 0.0025;
   s4.sensity = 0.39;
   s4.unsensity = 0.53;
   s4.init();
   dispatcher.strategies.Add(s4);



  //--战略
   CADXStrategy *s2 = new CADXStrategy();
   s2.Symbol = "GBPUSD";
   s2.onBars = true;
   s2.TimeFrame = PERIOD_M5;
   //s2.mHourStart = 0;
   //s2.mHourEnd = 24;
   s2.Risk = 0.13;
   s2.takeProfit = 2000;
   s2.stopLoss = 360;
   s2.trailingStop = 150;
   s2.lots = 0.1;
   s2.maxLots = 5;
  //-自定义
   s2.period = 17;
   s2.level = 0.0042;
   s2.init();
   dispatcher.strategies.Add(s2);

  //--等等。


  //--自适应策略本身包含一个虚拟
//trade 的连接列表(CStrategy heirs again),
//also CStrategy heir and for dispetcher'a there is no difference.
   CAdaptiveStrategy *sadapt4 = new CAdaptiveStrategy();
   sadapt4.onBars = false;
   sadapt4.mRisk = 0.13;
   sadapt4.lots = 0.1;
   sadapt4.performance_variant = 2;
   sadapt4.maxLots = 5;
   sadapt4.init();
        
        // ***************************************** M30
        CADXStrategy *s_gbpjpy1 = new CADXStrategy();    s_gbpjpy1.Symbol = "GBPJPY";    s_gbpjpy1.onBars = true;    s_gbpjpy1.TimeFrame = PERIOD_M30;  s_gbpjpy1.takeProfit = 2000; s_gbpjpy1.trailingStop = 70; s_gbpjpy1.lots = 0.1; s_gbpjpy1.maxLots = 5; 
        s_gbpjpy1.stopLoss = 300;  s_gbpjpy1.init();
        sadapt4.strategies.Add(s_gbpjpy1); // 将所有内容都纳入自适应战略
        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
        //  и т.д.
        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
        


  dispatcher.strategies.Add(sadapt4);


 // 随心所欲地填充

  return(0);
  }
//+------------------------------------------------------------------+
//| 专家去初始化函数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   EventKillTimer();
   
  }
//+------------------------------------------------------------------+
//| 专家勾选功能|
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   dispatcher.control();
  }
//+------------------------------------------------------------------+
 

你举的例子其实和我的很相似。两者之间的差异比看上去的要小。一切都通过类来实现,每个类-策略都有自己独立的参数。最大的区别在于它们的布局,在你的例子中,所有策略都是由派发器处理的,而在我的例子中,它们是在CObject 类型的列表中处理的。事实上,我的方法并不比你的复杂多少,我们只是用不同的语言谈论同样的事情。

最初,我打算用我的方法来解决三个 "multis "的任意组合:multitimeframe、multistrategy 和 multitool。现在我认为它远不止这些。在第二部分,我想解决专家决策问题。专家顾问将决定如何交易、交易什么以及何时交易。所有这些都是我的方法。也许您的方法也可以,这很好,因为同一事物有几种解决方案是一种发展。

顺便问一下,您能看看调度器本身的实现吗?

 
class CDispatcher {
   public:
      CTrade trade;
      CList strategies; 
      CList newOrders; 
      CList currentOrders;
      CList* strategiesResults;
      int repeats;
      int tickSeconds;
   private:
      ulong Magic;            
   public:
      void CDispatcher() {
          strategiesResults = new CList();
          repeats = 5;
          tickSeconds = 1;
      }
      void ~CDispatcher() {
        delete(strategiesResults);
      }
      
      void control();

      bool controlLimits();
      void controlOrders();
      bool controlOpen();
      bool controlClose();
      bool controlModify();      
      ulong ticketOpen(string smb, ENUM_ORDER_TYPE type,double lot,int SL,int TP);
      double countLotByRisk(CSymbolInfo *symbinfo, CStrategy *s, int dist, double risk, double lot, double maxlot);
       double NormalPrice(CSymbolInfo *symbinfo, double d);
      double NormalLot(CSymbolInfo *symbinfo, double lot);
      double BasePrice(CSymbolInfo *symbinfo, int dir);
      double ReversePrice(CSymbolInfo *symbinfo, int dir);
      double ReversType(ENUM_ORDER_TYPE type);
      double NormalTP(CSymbolInfo *symbinfo, int dir,double op,double pr,int TP,double stop);
      double NormalSL(CSymbolInfo *symbinfo, int dir,double op,double pr,int SL,double stop);
      void   checkDeals(CStrategy *s);
       ENUM_ORDER_TYPE getTypeByDirection(int dir);
       int getDirectionByType(ENUM_ORDER_TYPE type);
};
我就不公布实施方案了。这里的一切都很清楚。策略都是 CObject 的后代。但它们是由调度程序处理的。我们需要从简单到复杂。对于外部观察者来说,一个简单的对象接口应该可以隐藏所有的实现细节。我只想说,多重对象并没有什么特别之处。有了 OOP 和多态性,一切都变得简单了。
 
Vigor:
我就不公布实施方案了。这里的一切都很清楚。策略都是 CObject 的后代。但它们是由调度程序处理的。我们需要从简单到复杂。对于外部观察者来说,一个简单的对象接口应该可以隐藏所有的实现细节。我只想说,多重对象并没有什么特别之处。有了 OOP 和多态性,一切都可以简单实现。
+1.我完全同意。总的来说,我想说的是,我的方法和你的方法就像两滴水。策略都是基础策略 CModel 的后代,而 CModel 又是 CObject 的后代。和你一样,所有东西都是动态初始化并放入一个列表中。就像你一样,实现了一个简单的对象接口,隐藏了所有实现细节。另外,我不得不在文章中描述整个实现过程,这也是很多人认为它很复杂的原因。但要使用我这种类型的对象,你甚至不需要知道内部是如何工作的。
 

瓦西里,非常感谢你的文章!我一口气读完了!它来得非常容易,我想我对这种材料的接受能力已经成熟了。和许多交易者一样,我也在思考文章中提到的一些问题。有些问题我解决了,有些没有。还有一些只是一个模糊的想法。看到文章如此系统地介绍了所有问题,我感到非常高兴和意外。

已解决的问题和前景是巨大的。并不是每一个 "头脑 "都足够成熟,能够提出问题,更不用说解决问题了。这就是人们用克雷洛夫的寓言 "狐狸和葡萄 "来评论的原因,因为 "虽然眼睛看到了眼睛,但牙齿却不知道牙齿"。自我主张的欲望是不屈不挠的,因此他们发表评论,希望别人会想:"啊,苔藓!我知道她足以对大象狂吠!":)这根本不值得关注。

继续创作吧,我们期待着你的继续!

附注:虽然您还不能在现实生活中使用 MetaTrader 5,但您可以使用 "将交易从 MetaTrader 5 复制到 MetaTrader 4 "一文。这是一篇非常明智、经过验证的文章!因此,所有内容都非常实用,可用于当前的交易中!

 

......
杜鹃不畏罪孽,
为了什么而赞美公鸡?

 

与其被无端指责,不如受到应有的赞扬。