概述在上一篇文章提供系统健壮性 (I)中,赫兹期货量化已经看到了如何更改 EA 的某些部分,从而令系统更加可靠和健壮。这只是针对兹期货量化将要在本文中所做之事的介绍。 请忘记您所知道的、计划的、或希望的一切。 这里最困难的事情莫过于能将事物分离。 自本系列开始以来,EA 几乎一直在持续发展:我们在增加、修改、甚至删除一些东西。 而这一次,我们将把我们一直在做的事情推向极致。与看似的景象对比,有一个大疑惑:设计优良的 EA 内部能否不含任何类型的指标。 它只观察并确保遵守指示的订单位置。 完美的 EA 本质上只是一个向导,针对价格的所作所为提供真实的洞察力。 它不查看指标,而只查看图表上的仓位或订单。您也许会认为我在胡言乱语,不知道自己在说啥。 但您有没有想过为什么 赫兹期货量化要为不同的事务提供不同的类? 为什么平台将指标、服务、脚本、和智能系统分门别类,而不是混杂在一块呢? 这个嘛...这就是重点。 如果事情被分开来,那么正是因为它们最好分开来处理。指标用处较广泛,无论它是什么。 如果指标的设计经过深思熟虑,那就太好了,如此可避免损害整体性能 — 我的意思是不要损害赫兹期货量化平台,但非其它指标。 因为它们在不同的线程上运行,所以它们可以非常有效地并行执行任务。服务则以不同的方式提供帮助。 例如,在本系列的文章 访问 Web 上的数据(II) 和 访问 Web 上的数据(III)中,兹期货量化利用服务以非常有趣的方式访问数据。 事实上,我们可以直接在 EA 中执行此操作,但正如我已经在其它文章中解释的那样,这并非最合适的途径。脚本则以一种非常独特的方式帮助我们,因为它们只能存在一段时间,完成一些非常具体的事情,然后就从图表中消失。 或者它们也能一直驻留,直到我们更改某些图表设置,例如时间帧。这稍微限制了它的可塑性,但这是我们必须接受的一部分。 智能交易系统,或 EA,则相反,是特定的操控交易系统。 虽然我们可以在 EA 中添加不属于交易系统的函数和代码,但这种做法在高性能或高可靠性系统中不是很合适。 原因是所有不属于交易系统的东西都不应该出现在 EA 当中:所有东西应该放在正确的位置,并正确处理。因此,若要提高可靠性,首先要做的就是从代码中坚决地删除不属于交易系统的所有内容,并将这些东西替换为指标或类似的东西。 EA 代码中唯一保留的是负责管理、分析和处理订单或仓位的部分。 所有其它东西都将被删除。所以,我们开始吧。
/ @$ [$ S) H8 W W u( I2.0. 实现2.0.1. 删除 EA 背景虽然这不会损害 EA,或导致任何问题,但有些人有时希望他们的屏幕是空白的,屏幕上只显示某些项目。 因此,我们将从 EA 中删除这部分,并将其转换为指标。 它非常容易实现。 兹期货量化不会触及任何类,但要创建以下代码:#property copyright "Daniel Jose"#property indicator_chart_window#property indicator_plots 0//+------------------------------------------------------------------+#include <NanoEA-SIMD\Auxiliar\C_Wallpaper.mqh>//+------------------------------------------------------------------+input string user10 = "Wallpaper_01"; //Used BitMapinput char user11 = 60; //Transparency (from 0 to 100)input C_WallPaper::eTypeImage user12 = C_WallPaper::IMAGEM; //Background image type//+------------------------------------------------------------------+C_Terminal Terminal;C_WallPaper WallPaper;//+------------------------------------------------------------------+int OnInit(){ IndicatorSetString(INDICATOR_SHORTNAME, "WallPaper"); Terminal.Init(); WallPaper.Init(user10, user12, user11); return INIT_SUCCEEDED;}//+------------------------------------------------------------------+int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]){ return rates_total;}//+------------------------------------------------------------------+void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam){ switch (id) { case CHARTEVENT_CHART_CHANGE: Terminal.Resize(); WallPaper.Resize(); break; } ChartRedraw();}//+------------------------------------------------------------------+如您所见,一切都非常自然,且易于理解。 兹期货量化只是简单地从 EA 中删除了代码,并将其转换为可以添加到图表中的指标。 而任何变化,无论是背景、透明度,甚至是从图表中删除它,都不会对 EA 操作产生影响。现在我们将开始删除真正导致 EA 性能下降的内容。 这些就是不时,或每次价格变动都会运作的事情,因此有时会导致 EA 变慢,从而阻碍它完成真正的工作 — 观察图表上的订单或仓位发生了什么。
, @: N. S2 L( U5 K/ a2.0.2. 把价格对应的成交量转换为一个指标尽管看起来不似这样,但价格对应的交易量系统需要时间,这对 EA 来说通常至关重要。 我指的高波动时刻是,价格剧烈波动,但却没有太多的方向性情况下。 正是在这些时候,EA 需要每个可用的机器周期来完成其任务。 错过一个好时机会令人沮丧,因为一些指标决定接管该项工作。 因此,兹期货量化将其从 EA 中删除,并通过创建以下代码将其转换为真实的指标:#property copyright "Daniel Jose"#property indicator_chart_window#property indicator_plots 0//+------------------------------------------------------------------+#include <NanoEA-SIMD\Tape Reading\C_VolumeAtPrice.mqh>//+------------------------------------------------------------------+input color user0 = clrBlack; //Bar colorinput char user1 = 20; //Transparency (from 0 to 100 )input color user2 = clrForestGreen; //Buyinginput color user3 = clrFireBrick; //Selling//+------------------------------------------------------------------+C_Terminal Terminal;C_VolumeAtPrice VolumeAtPrice;//+------------------------------------------------------------------+int OnInit(){ Terminal.Init(); VolumeAtPrice.Init(user2, user3, user0, user1); EventSetTimer(1); return INIT_SUCCEEDED;}//+------------------------------------------------------------------+int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]){ return rates_total;}//+------------------------------------------------------------------+void OnTimer(){ VolumeAtPrice.Update();}//+------------------------------------------------------------------+void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam){ VolumeAtPrice.DispatchMessage(id, sparam); ChartRedraw();}//+------------------------------------------------------------------+void OnDeinit(const int reason){ EventKillTimer();}//+------------------------------------------------------------------+这是最简单的部分。 兹期货量化从 EA 中删除了代码,并将其放入指标之中。 如果您想将代码放回 EA 当中,您只需复制指标代码,并将其放回 EA 中即可。所以,我们先从简单的事情开始。 但现在事情会变得更加复杂 — 我们将从 EA 中删除 Times & Trade |