Пример
在交叉盘上运行回溯测试时,测试仪不仅会调用主符号,还会调用辅助符号,以便将主符号的盈利货币转换为账户货币。在单次运行模式,尤其是优化模式下,提取辅助符号、生成其刻度点并使其与主符号同步会占用大量宝贵的计算资源(和时间)。然而,这种精度几乎总是不必要的。因此,我想绕过 MetaTrader 5 测试程序的这一缺陷。在 MetaTrader 4 中,要做到这一点很容易--可以在测试器中直接更改账户货币。MetaTrader 5 却没有这样的选项。
演示脚本显示了绕过测试器这一限制的尝试 - 删除不必要的计算。为此,创建了一个用于回溯测试的符号副本,但盈利货币被设置为等于账户货币。也就是说,无需重新转换交易结果。实际上,利润将以点为单位计算,这在某些情况下非常明显。
它很有效!
这是让测试仪更快、更合理地工作的最简单方法。
ZЫ 我急了。新的交叉计算是正确的--它不转换利润。但由于某种原因,当它不在其他地方使用时,就会拖累主力。
2017.09.04 14:46:43.062 Core 1 EURCHF_custom: generate 975389 ticks in 0:00:00.063, passed to tester 3210 ticks 2017.09.04 14:46:43.062 Core 1 EURUSD: generate 979976 ticks in 0:00:00.062, passed to tester 8696 ticks
对脚本代码稍作编辑:
const SYMBOL Symb(_Symbol + PostFix); // 创建一个符号
Symb = _Symbol; // 复制主符号的所有属性和条形图历史记录 - 克隆。
将 _Symbol 替换为 "SBER"。
我在 VDSB 股票图表上运行了脚本。
运行脚本后,打开了 SBER_custom图表,显示的不是 SBER 的条形图,而是 VDSB 股票的条形图。这不符合逻辑。我本希望在图表上看到 SBER..... 的条形图。
在执行 Symb = "SBER "这一行时,由于某种原因创建了一个对象,其值为 Name="VDSB",也就是运行脚本的符号名称。
不幸的是,我无法修复这个错误。能否请您修复一下代码。
很遗憾,我无法修复这个错误。您能修改一下代码吗?
即使在 "SBER "Metaquotes-Demo 上不做修改地运行脚本,也足以看出结果与您的预期不同。
我发现CustomRatesReplace 对某些字符不起作用(似乎对所有非外汇字符都不起作用),因此开发人员需要修复这个错误。
我在一个真实的 BCS账户 上运行了它。原始脚本在 SBER 图表上运行。带有 SBER 报价的 SBER_custom 图表已打开。自定义汇率替换功能不能正常工作是什么意思?如果有必要,我可以解释如何在 BCS 上创建一个余额为零的真实账户。
谢谢,我有一个错误!在 Symbol.mqh 第 126 行
// return(this.CloneProperties() && (this.CloneHistory() != -1)); // Was return(this.CloneProperties(Symb) && (this.CloneHistory(Symb) != -1)); // Stahl
另一种使用自定义符号的情况(不一定需要借助该库)。
可以在新的历史数据 上对智能交易系统进行全自动定期回溯测试,并将测试结果传输到实战智能交易系统,使真实情况与测试器同步。这样,无需编写自己的测试程序,即可实现此类交易逻辑。
交易系统(Expert Advisor)的 交易 逻辑从策略测试器(MT4)中 的 ticks测试最大限度地准确转换到真实账户工作的任务。
我的理由是
在测试仪中,智能交易系统 不仅 在理想的交易条件下工作,而且实际上还在另一种模式下工作--实时模式,即 在 一个刻度线中计算 TS、发送订单并获得响应,但在实际交易账户中使用时并非如此。原来 我们 有两个不同的机器人 , 一个是实时的,另一个不是。 向 真实账户发送/修改 订单 (即使是一个!) = ping + 执行时间等。= 最多 100-500 毫秒,而与此同时,滴答声不断传来,需要对其进行计数 - 而我们正站在一旁,等待着....。然后我们随机进入数据流(相对于我们的刻度平均值 ,我不 知道价格在这段时间内的走势。 + 我们肯定错过了一些最快的、通常也是最重要的刻度)。 事实证明, 我们在测试器中推出的策略最终可能什么也没留下。
因此,经过思考,我得出了以下结论:
- 在 实战模式 下 ,"智能交易系统 " 中 的交易逻辑被关闭,实际上它只是一个复制工具。
- 交易系统被转移到指标中,指标会生成开仓和平仓指令,它不会等待智能交易系统执行这些指令,而只是在理想 条件 下执行 嵌入其中的 TS,几乎就像在测试仪中一样。据我所知,该指标不应该错过刻度线,虽然我怀疑这在技术上是否可行,但至少应该比 Expert Advisor 少错过刻度线。+ 即使由于 TC 计算误差的分离,误差也应该更少,因为不会中断任何次于 TC 逻辑的操作。
使用该方案的另一种可能性:
从市场上获取免费的 Expert Advisor 演示版,并在测试器中对新报价进行跟踪,复制器从测试器的结果中获取数据。因此,不需要付费版本。
也许有必要禁止 Market Expert Advisors 在自定义符号上进行回溯测试....。
代码中有这样一行
const int Size = ::CopyRates(Symb, PERIOD_M1, 0, ::Bars(Symb, PERIOD_M1), Rates);
我没有检查过你的脚本,但我正在编写一个用于大量复制字符的脚本。CopyRates 函数 和 Bars 函数的返回值不能超过 "Settings->Graphics->Max. bars in window"(设置->图形->窗口中的最大条数)中指定的值,因此大部分历史记录不会被复制。
这些冒号在您的代码中是什么意思?
我没有检查过你的脚本,但我正在编写一个用于大量复制字符的脚本。CopyRates 函数 和 Bars 函数的返回值不能超过 "Settings->Charts->Max. bars in window"(设置->图表->窗口中的最大条数)中指定的值,因此大部分历史记录不会被复制。
我复制的正是图表上已有的内容。否则会花费很长时间--分页。
您代码中的这些冒号是什么意思?
fxsaber, 2017.02.14 20:00
粗略地说,在冒号之前指定类的名称,从类中调用相应的方法。
如果冒号前没有任何内容,则该类是全局的。
在这种情况下,所有冒号都可以擦除。使用冒号很方便,因为不同的类可能有相同的方法(包括虚拟方法)。为了避免出错,可以使用冒号来明确指出应调用哪个方法。
我们应该添加类似的内容:
bool Template(const string Symb = NULL) const { return(this.CloneProperties(Symb)); }
或者有时只需要属性,而不需要条形图。

交易品种:
作者: fxsaber