程序库: 交易品种 - 页 2

 
Stanislav Korotky:

我们应该添加类似的内容:

否则,有时只需要属性,而不需要栏。

该类的 所有方法 都是公共的。因此,要只克隆属性,请调用 CloneProperties()。

 

库和使用示例已更新。

Пример

在交叉盘上运行回溯测试时,测试器不仅会调用主符号,还会调用辅助符号,以便将主符号的盈利货币转换为账户货币。在单次运行模式,尤其是优化模式下,提取辅助符号、生成其刻度点并使其与主符号同步会占用非常宝贵的计算资源(和时间)。


然而,这种精度几乎总是不必要的。因此,我想绕过 MetaTrader 5 测试程序的这一缺陷。在 MetaTrader 4 中,要做到这一点很容易--可以在测试器中直接更改账户货币。MetaTrader 5 却没有这样的选项。

演示脚本显示了绕过测试器这一限制的方法 - 删除不必要的计算。为此,创建了一个用于回溯测试的符号副本,但利润/保证金的货币被设置为等于账户货币。也就是说,无需重新转换交易结果。利润实际上是以点为单位计算的,这在某些情况下非常明显。

// 创建一个符号副本,以加快测试速度
#property script_show_inputs

#include <Symbol.mqh>

void OnStart()
{
  const SYMBOL Symb("TESTER_" + _Symbol); // 创建一个符号

  if (Symb.IsExist()) // 如果创建了符号
  {
    Symb = _Symbol; // 复制主符号的所有属性和柱状图历史记录(如果自定义,还包括刻度线历史记录) - 克隆

    // 使符号的货币成为账户的货币
    Symb.SetProperty(SYMBOL_CURRENCY_PROFIT, AccountInfoString(ACCOUNT_CURRENCY));
    Symb.SetProperty(SYMBOL_CURRENCY_MARGIN, AccountInfoString(ACCOUNT_CURRENCY));

    if (Symb.On()) // 包括在市场观察中
      ChartOpen(Symb.Name, PERIOD_CURRENT); // 打开一个新的符号图表
  }
}


交易结果


通过这种方式,Tester/Optimiser 可以自由加速。


ZЫ 我在EURGBP 上进行了详细测量 时间收益为 ~2 倍。交易完全匹配。确实是免费的!

 

下面的说明不仅涉及程序库。


如果需要更改自定义符号的某些属性,在某些情况下应在导入引号之前完成。

因此,为了保证结果的可靠性,我强烈建议先设置符号的所有属性,然后再导入。

例如,如果要设置SYMBOL_TRADE_TICK_VALUE 和 SYMBOL_TRADE_TICK_SIZE,应在导入刻度线/条形图之前完成。

 

在 MT5 测试仪中(例如外汇),限价订单通常会出现正滑点,从而导致自欺欺人的 情况(有时甚至会出现测试仪在真实点数上的砾石!)。



但有一种方法可以绕过测试器的这一功能。下面是详细的操作说明。


1.如果原始符号(开放图表)不是自定义的,或者账户是对冲的,则在符号图表上运行此脚本

#include <Symbol.mqh>

void OnStart()
{
  const SYMBOL Symb(_Symbol + "_Custom"); // 创建一个符号

  if (Symb.IsExist()) // 如果创建了符号
  {
    Symb = _Symbol;   // 复制主符号的所有属性和柱状图历史记录(如果自定义,还包括刻度线历史记录) - 克隆

    if (Symb.On())    // 包括在市场观察中
      ChartOpen(Symb.Name, PERIOD_CURRENT); // 打开一个新的符号图表
  }
}


您将看到以下图片



2.如果账户被对冲(终端窗口标题栏中出现对冲字样),转到任何净额结算账户(例如MetaQuotes-Demo)并重新加载终端。

在当前图表上运行此脚本

// 创建一个符号副本,以加快测试速度,并可禁用限价订单的滑点。
#property script_show_inputs

#include <Symbol.mqh>

input bool OrderLimitSlippage = false;

void OnStart()
{
  const SYMBOL Symb("TESTER_" + _Symbol); // 创建一个符号

  if (Symb.IsExist()) // 如果创建了符号
  {
    //https://www.mql5.com/ru/forum/212096/page2#comment_7017794
// Symb = _Symbol; // 复制主符号的所有属性和条形图历史记录(如果自定义,还包括勾选历史记录) - 克隆

    Symb.CloneProperties(); // 复制主符号的所有属性

    // 使符号的货币成为账户的货币
    Symb.SetProperty(SYMBOL_CURRENCY_PROFIT, AccountInfoString(ACCOUNT_CURRENCY));
    Symb.SetProperty(SYMBOL_CURRENCY_MARGIN, AccountInfoString(ACCOUNT_CURRENCY));
    Symb.SetProperty(SYMBOL_CURRENCY_BASE, AccountInfoString(ACCOUNT_CURRENCY));
    
    int Answer = IDNO;
    
    // 消除限价订单的滑点
    //https://www.mql5.com/ru/forum/212096/page2#comment_7018318
    if (!OrderLimitSlippage &&
        (((ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE) != ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) ||
        ((Answer = MessageBox("You will need to change the account type to netting.\nDo you agree to disable limit order slips?", __FILE__, MB_YESNOCANCEL | MB_ICONQUESTION)) == IDYES)))
    {
      Symb.SetProperty(SYMBOL_TRADE_EXEMODE, SYMBOL_TRADE_EXECUTION_EXCHANGE);
      Symb.SetProperty(SYMBOL_TRADE_CALC_MODE, SYMBOL_CALC_MODE_EXCH_FUTURES);
      
      // 计算利润
      Symb.SetProperty(SYMBOL_TRADE_TICK_VALUE, 1);
      Symb.SetProperty(SYMBOL_TRADE_TICK_SIZE, Symb.GetProperty(SYMBOL_POINT));
    }
    
    if ((Answer != IDCANCEL) && (Symb.CloneHistory() > 0) && Symb.On()) // 从主符号中复制柱状图历史记录(如果自定义,还包括刻度线历史记录
      ChartOpen(Symb.Name, PERIOD_CURRENT); // 打开一个新的符号图表 
  }
}



3.在测试器中选择收到的自定义符号


现在限价订单将不会滑动!

 

关于交易、自动交易系统和测试交易策略的论坛

错误、漏洞和问题

fxsaber, 2018.02.14 14:41 pm.

丑陋的错误不是终端,而是 MT5 平台
#include <MT4Orders.mqh> //https://www.mql5.com/zh/code/16006

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, Bid);
  
// OrderSend(_Symbol, OP_BUYLIMIT, 1, Ask, 100, 0, 0);
}

在一些移动缓慢的符号上运行 MQ-Demo。例如,EURHUF。

脚本打开一个买入头寸,TP = Bid。也就是说,应立即平仓。但只有在下一个交易日才会检查 TP 是否符合接受条件!

在下一个交易时段之前,不会立即平仓。此外,如果下一个价位的 Bid < TP,则 TP 仍将不被接受。


这同样适用于限价订单(注释线)。在 Tester 中,情况也类似。

关于突出显示,应该说,因为在上一个帖子中有这样的内容

关于交易、自动交易系统和测试交易策略的论坛。

库:符号

fxsaber, 2018.04.06 09:21 pm.

2.如果账户已对冲(终端窗口标题栏中出现对冲字样),请转到任何净额对冲账户(如MetaQuotes-Demo)并重新加载终端。

并非每个人都会注意到,净额结算账户 交易所符号当前价格的限价订单将立即执行(并在测试器中),无需等待下一个刻度线。


请注意,重要的不仅是股票代码,还有净额结算账户。例如,您可以在对冲-MQ-Demo 中使用 MOEX 符号,但它的执行方式(和在测试器中的执行方式)与在同一净额结算-MQ-Demo 中的执行方式(和在测试器中的执行方式)不同。

这就是为什么在完全相同的 MOEX 符号上进行的回溯测试会因账户类型不同而不同的原因之一。


ZЫ 我在自言自语....

 
fxsaber:

ZY 我在自言自语......

不,我只是没什么要补充的。

可惜的是,要实现正常触发命令,您需要与手鼓共舞。

 
Andrey Khatimlianskii:

遗憾的是,要实现正常的指令触发,您需要用手鼓跳舞。

我修改了指令,大大简化了舞蹈。例如,在下网时,只需单击启动脚本即可完成所有操作。

 

我对真实点数进行了简单过滤,在最轻的变量中,过滤掉了 90% 以上的信息。过滤器越强,反向测试结果就越粗糙。

但最弱的过滤器对结果和速度的影响也很有趣。


质量。

曾经是

final balance 10007242.00 EUR
TESTER_Censored,M1: 6589567 ticks, 60353 bars generated. Environment synchronized in 0:00:00.031. Test passed in 0:00:05.101 (including ticks preprocessing 0:00:00.874).
TESTER_Censored,M1: total time from login to stop testing 0:00:05.132 (including 0:00:00.031 for history data synchronization)
476 Mb memory used including 27 Mb of history data, 192 Mb of tick data


变为

final balance 10007246.00 EUR
FILTER_Censored,M1: 402622 ticks, 50887 bars generated. Environment synchronized in 0:00:00.030. Test passed in 0:00:00.516 (including ticks preprocessing 0:00:00.078).
FILTER_Censored,M1: total time from login to stop testing 0:00:00.546 (including 0:00:00.030 for history data synchronization)
314 Mb memory used including 27 Mb of history data, 64 Mb of tick data


速度

曾经

OnTesterInit
i = 0 Pass = 0 OnTester = 3.881 s.: Count = 6589567, 1697904.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 1 Pass = 1 OnTester = 3.893 s.: Count = 6589567, 1692670.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 2 Pass = 2 OnTester = 3.898 s.: Count = 6589567, 1690499.5 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 3 Pass = 3 OnTester = 3.842 s.: Count = 6589567, 1715139.8 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 4 Pass = 4 OnTester = 3.912 s.: Count = 6589567, 1684449.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
iMin = 3 Results[iMin] = 3.842 s.
iMax = 4 Results[iMax] = 3.912 s.
Amount = 5 Mean = 3.885 s. - 84.80%
OnTesterDeinit


曾经

OnTesterInit
i = 0 Pass = 0 OnTester = 0.264 s.: Count = 402622, 1525083.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 1 Pass = 1 OnTester = 0.264 s.: Count = 402622, 1525083.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 2 Pass = 2 OnTester = 0.264 s.: Count = 402622, 1525083.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 3 Pass = 3 OnTester = 0.266 s.: Count = 402622, 1513616.5 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 4 Pass = 4 OnTester = 0.306 s.: Count = 402622, 1315758.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
iMin = 0 Results[iMin] = 0.264 s.
iMax = 4 Results[iMax] = 0.306 s.
Amount = 5 Mean = 0.273 s. - 29.28%
OnTesterDeinit


结果

根据实际刻度,刻度数减少了 16 倍(最轻过滤器),优化速度提高了 14 倍,质量没有受到任何影响(此处未包括分析)。当然,只有以特定方式编写 TS 时才能做到这一点。特别是在没有条形分析的情况下。

之前的免费通用加速度 只提高了两倍。现在的也是免费的(质量不受影响),但通用性较差。然而,收益却超过了一个数量级。现在,我只用这种方法优化 TC。没有错。


SZY

同时,对这种实现方式进行简短检查(只有条形价差的计算方式不同)。

关于交易、自动交易系统和交易策略测试的论坛。

脚本: ThirdPartyTicks

Automated-Trading, 2018.03.16 09:35 pm.

Баровая история создается с учетом минимальных потерь качества при переходе от режима тестирования "Каждый тик на основе реальных тиков" к "Только цены открытия" - ТС на лимитных ордерах;

两种模式比较:"All ticks "和 "OHLC M1"。


全部点差

final balance 10006150.00 EUR
TESTER4_Censored,M1: 6576734 ticks, 60353 bars generated. Test passed in 0:00:04.587 (including ticks preprocessing 0:00:00.343).
394 Mb memory used including 27 Mb of history data, 128 Mb of tick data


OHLC M1

final balance 10006119.00 EUR
TESTER_Censored,M1: 240366 ticks, 60353 bars generated. Test passed in 0:00:00.359 (including ticks preprocessing 0:00:00.031).
306 Mb memory used including 27 Mb of history data, 64 Mb of tick data


回溯测试质量相同,第二个变体在单次运行中的性能要好 12 倍。

 

对于非程序员来说,是否需要将这些脚本写入 Expert Advisor 程序?

优化速度提高 12 倍是非常诱人的。

通过开仓点进行优化时,会有这样的加速吗?

 
Aleksey Panfilov:

对于非程序员来说,这些脚本是否需要写入 EA 程序?

优化速度提高 12 倍是非常诱人的。

在通过开放点进行优化时,会有这样的加速吗?

遗憾的是,很难解释这一过程的所有方面。这可能需要一篇文章。因此,我们不可能简明扼要地解释清楚。