文章 "通用智能交易系统:事件模型和交易策略原型(第二章)" - 页 4

 
Andrey Khatimlianskii:
至少要分析一下价格。也许你根本不需要入场。
是的,有这样一种机制。如果不是在交易订单 中,那应该在哪里建立呢?如何将这种机制正规化,什么样的剧烈波动才是关键?
 
Гога:
是的,有这样一种机制。如果不在贸易订单 中建立,那么应该在哪里建立?如何将这种机制正规化,什么样的剧烈运动应被视为关键?

这就是问题所在!这就是为什么引擎中没有内置这种机制。

对于一种策略来说,20 个点的滑点并不重要,无论如何都应该进场;而对于另一种策略来说,2 个点的滑点打破了所有的统计数据,你就不应该进场。

那么通用交易引擎应该如何处理这两种策略呢?对,返回重新报价,让交易逻辑做出决定。

或者添加自定义功能。更准确地说,是对所有情况的设置 )

 
这是一篇非常好的文章。我学到了很多东西。贡献良多,谢谢。
 
Alain Verleyen:

在第 1241 版中,代码编译得很好,因此我试着进行回溯测试。它没有进行任何交易。

经过深入研究,我发现这是由于填充模式造成的。我使用的经纪商/符号允许的模式是 ORDER_FILLING_IOC。您的 TradeCustom 类默认将填充模式设置为ORDER_FILLING_FOK。我很困惑,如何才能为 Agent.mq5 EA 更改这种填充模式以进行交易?我可以搜索,但会花很多时间。

这就是这类工具的问题所在,它与 Metaquotes 的 MQL5 向导 EA 非常相似,对于不了解类的所有细节的人来说几乎无法使用。一旦遇到作者没有提供的问题,要修复或修改/添加就会变得非常麻烦。我看不出你的解决方案与 Metaquotes(向导)的解决方案有什么真正的区别。

无论如何,祝贺您所做的大量工作。这是一项伟大的编程工作。

MetaEditor5 include 文件夹中有一些类。如果有人能深入解释一下专家文件夹的类,那将会非常有帮助,因为它们看起来非常复杂。人们喜欢在正式基类的基础上编写标准的 EA,而不是总是重新创建轮子....。无论如何,这篇文章对不重新创建轮子有很大帮助。
 
Amy Liu:
MetaEditor5 include 文件夹中有一些类。如果有人能深入解释一下 Expert 文件夹中的类,那将会非常有帮助,因为它们看起来非常复杂。人们喜欢在正式基类的基础上编写标准的 EA,而不是总是重新创建轮....。无论如何,这篇文章对不重复创建轮子有很大帮助。
我同意这一点。问题在于框架中存在 bug。在使用一个框架之前,我们要么决定深入学习它,要么确保它得到了作者的良好支持。
 
Alain Verleyen:
我同意。问题在于框架中存在错误。在使用一个框架之前,我们要么决定深入学习它,要么确保它得到作者的良好支持。
这就是为什么我想学习 MetaEditor5 中的类,因为它们来自 "政府"。)
 
Amy Liu:
这就是为什么我想学习 MetaEditor5 中的类,它们来自 "政府"。)
而且还存在漏洞,得不到很好的支持 :-D
 
谢谢。
 

瓦西里先生

非常漂亮的代码......对我很有用...

在 mt5 news builds (1952) 中,我们在编译器中得到了一条 "消息"、


bool CBarDetector::IsNewBar(void)

  {

   datetime time[];

   if(CopyTime(m_symbol, m_timeframe, 0, 1, time) < 1)return false;

   if(time[0] == m_last_time)return false;

   return (m_last_time = time[0]);    //<=============HERE

  }

//+------------------------------------------------------------------+

///////////MESSAGE in THE METAEDITOR compiler///////////////
expression not boolean NewBarDetector.mqh 87 24


正确的应该是这样吗?

//+------------------------------------------------------------------+
//| 如果给定的符号和时间框架中存在"......",则返回 true。
//| 一个新栏。|
//+------------------------------------------------------------------+
bool CBarDetector::IsNewBar(void)
  {
   datetime time[];
   if(CopyTime(m_symbol, m_timeframe, 0, 1, time) < 1)return (false);
   if(time[0] == m_last_time)return (false);
   return (m_last_time == time[0]);
  }
//+------------------------------------------------------------------+



 

你好,瓦西里、

请原谅我在您写完这篇文章之后才提出问题。我现在只是在仔细阅读文章,寻找框架的替代方案。我觉得有些地方很奇怪,很可能是我的误解。

关于 "新建刻度线 "和 "新建条形图 "事件处理程序。您循环查看添加的刻度线列表,然后建立事件结构,将其传递给 Init 和 Support 事件处理程序,例如下面的新刻度线事件:

//+------------------------------------------------------------------+
//| 检测多仪器新刻度的到来。
//+------------------------------------------------------------------+
void CStrategy::NewTickDetect(void)
  {
   if(m_ticks_detectors.Total()==0)
      AddTickEvent(ExpertSymbol());
   for(int i=0; i<m_ticks_detectors.Total(); i++)
     {
      CTickDetector *tick=m_ticks_detectors.At(i);
      if(tick.IsNewTick())
        {
         m_event.period=PERIOD_CURRENT;
         m_event.type=MARKET_EVENT_TICK;
         m_event.symbol=tick.Symbol();
         CallSupport(m_event);
         CallInit(m_event);
        }
     }
  }

在你的一个示例中,例如下面的移动平均线剪辑;

bool CMovingAverage::IsTrackEvents(const MarketEvent &event)
  {
//--- 我们只处理在工作符号和时间框架上打开新条形图的情况
   if(event.type != MARKET_EVENT_BAR_OPEN)return false;
   if(event.period != Timeframe())return false;
   if(event.symbol != ExpertSymbol())return false;
   return true;
  }

这个 IsTrackEvents函数 似乎抹杀了上述 NewTickDetect 函数的作用!因此,基于 NewTickDetect 中检查多个符号的能力,上述移动平均线示例应能在多个工具上进行交易,但 IsTrackEvents 只允许在策略时间框架和符号(符号是这里的关键)上进行交易。这是否意味着,由于策略只能对其符号进行交易,因此不需要真正使用 NewTickDetect 循环?实际上,"新刻度检测 "应该只检查接收到的刻度是否属于策略符号,而不进行循环。这实际上类似于为每个感兴趣的符号设置一个策略对象,而 CStragyList 会对其进行循环?

希望我说的有道理,也希望您能为我解释清楚。

我喜欢你的工作。我从您的文章中学到了很多,非常感谢。

谨致问候、

谢普