程序库: 交易品种 - 页 4

 

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

交易中的机器学习:理论与实践(不仅是交易)

fxsaber, 2018.04.15 16:31

让我们创建一个具有正确 tick 分布的自定义符号,并编写一个圣杯 TC。让我们进行回溯测试并发布结果。

// 利用生成的刻度线创建自定义字符的示例

#property script_show_inputs

input string SymbName = "TESTER";

#include <fxsaber\ThirdPartyTicks\CustomSymbol.mqh> //https://www.mql5.com/zh/code/20225

// 生成具有所需属性的刻度历史记录 - 技术示例
int GetTicks( MqlTick &Ticks[], const int Amount = 1 e5 )
{
  static const MqlTick NullTick = {0};
  
  const int Size = ArrayResize(Ticks, Amount);
  
  long time = (TimeCurrent() - 7 * 24 * 3600) * 1000;
  
  for (int i = 0; i < Size; i++)
  {
    Ticks[i] = NullTick;
    
    const double Price1 = NormalizeDouble(MathRand() / 1000.0, 3);
    const double Price2 = NormalizeDouble(MathRand() / 1000.0, 3);
    
    Ticks[i].bid = MathMin(Price1, Price2);
    Ticks[i].ask = MathMax(Price1, Price2);
    
    time += MathRand();
    
    Ticks[i].time_msc = time;
    Ticks[i].time = (datetime)(time / 1000);
  }
  
  return(Size);
}

void OnStart()
{  
  CUSTOMSYMBOL Symb(SymbName); // 创建一个符号

  if (Symb.IsCustom())
  {
    Symb.SetProperty(SYMBOL_TRADE_STOPS_LEVEL, 0);    

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

    // 计算利润
// Symb.SetProperty(SYMBOL_TRADE_TICK_VALUE, 1);
// Symb.SetProperty(SYMBOL_TRADE_TICK_SIZE, Symb.GetProperty(SYMBOL_POINT));
    
    MqlTick Ticks[];
    
    GetTicks(Ticks); // 形成勾选历史记录
    
    if ((Symb.AddTicks(Ticks) > 0) && (Symb.DataToSymbol() > 0) && Symb.On()) // 向符号发送打钩历史记录
      ChartOpen(Symb.Name, PERIOD_CURRENT); // 打开图表
  }
}

在这个脚本中,我们只需要编写自己的 GetTicks。根据生成的历史记录,我们将拥有一个几乎完整的(自定义)符号,可在测试器中进行交易。


 
fxsaber:

另一种使用自定义符号的情况(不一定需要借助该库)。


可以在新的历史数据 上对智能交易系统进行全自动定期回溯测试,并将测试结果传输到实战智能交易系统,使真实情况与测试器同步。这样,您无需编写自己的测试程序即可实现此类交易逻辑。


使用此方案的另一种可能性:

从市场上获取免费的 Expert Advisor 演示版,并在测试器中使用新报价进行追逐,复制器从测试器的结果中获取数据。因此,不需要付费版本。


也许有必要禁止市场专家顾问在自定义符号上进行回溯测试....。

// 在回溯测试中包含当前日期
#property script_show_inputs

#include <Symbol.mqh> //https://www.mql5.com/zh/code/18855

input int Offset = -24 * 7; // 以小时为单位的偏移

#define  HOUR 3600

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

  if (Symb.IsExist()) // 如果创建了符号
  {
    Symb.CloneProperties(); // 复制属性
    
    MqlRates Rates[];

    // 移位条形图时间
    for (int i = CopyRates(_Symbol, PERIOD_M1, 0, (int)SeriesInfoInteger(_Symbol, PERIOD_M1, SERIES_BARS_COUNT), Rates) - 1; i >= 0; i--)
      Rates[i].time += Offset * HOUR;
      
// Symb.CloneTicks(Ticks);

    // 记录偏移柱状图,并将符号纳入市场观察中
    if ((Symb.CloneRates(Rates) > 0) && Symb.On())
      ChartOpen(Symb.Name, PERIOD_CURRENT); // 打开一个新的符号图表
  }
}

MT5 Build 1880 - 目前运行正常。

 

在测试仪中设置滑点的两种方法

  1. 在实际刻度点之间插入伪刻度点(根据滑点值降低价格)。奇数点差 - 分析,偶数点差 - 交易。
  2. 分析使用真实符号,交易使用自定义符号。自定义 - 根据滑点值对真实符号进行降级。

 

伟大的图书馆,但是,我引述:

Andrey Khatimlianskii:

谢谢!一如既往,比我想的要复杂一些;)

您的代码有一个不可否认的优点--可以被提取和使用。但要修改其中的任何内容都很困难,这是一个缺点。

只需一行代码,我就能创建一个完全现成的自定义符号副本,这非常方便,但是:

请告诉我如何使用您的库创建自己的符号,但不是复制历史数据- 我想修改 OHLC,不想破坏您的代码 ))), 谢谢您的帮助!

 
我想知道为什么需要自定义符号?如果 DC 上的真实符号可以交易?
 
Viktar Dzemikhau:
我想知道为什么需要自定义符号?如果 DC 中的真实符号可以交易?

我的想法是,"自动交易不可能总是使用任何符号,如果 EA 不能在该符号上运行,也许需要另一种符号或使用自定义图表"。

这是有一定道理的。

;)

 
Igor Makanu:

我正在发展 dickfix 的想法,比如 "并不总是可以使用任何符号进行自动交易,如果 EA 无法在此符号上运行,可能需要另一种符号或使用自定义图表"。

这是有一定道理的。

;)

这是垃圾。什么符号有什么区别?如果符号是真实的,它就可以被访问。我有自己的符号类。该类的 唯一必要成员 是交易工具的名称。你输入另一个工具,我就能得到所有必要的数据。因此,在进入这个主题后,我就在想,为什么要自定义符号呢?如果可以交易,它的名称就是如此这般;如果不能交易......它怎么会不能交易呢?
 
Viktar Dzemikhau:
如果可以交易,它的名字就叫某某;如果不能交易......它怎么会不能交易呢?

为什么不能交易? 专家顾问将在策略测试器中工作,因此您可以使用优化器...这意味着您可以寻找模式。

俗话说,人各有志--如果你认为可以将数据存储在类中,那就请便吧,对我来说,将数据输出到自定义符号中,然后在该图表上使用指标会更容易。

以下是我的合成图表中的欧元兑美元 - 英镑兑美元价差。

https://charts.mql5.com/18/849/spread-h1-alpari-international-limited.png

非常方便的是,您可以直观地查看图表并分析条形图的时间,此外还有所有的 TF,您可以在策略测试器中运行策略,而且返回到真实符号也不成问题。

 
Igor Makanu:

为什么不呢?在策略测试器中,智能交易系统可以工作,因此您可以使用优化器...这意味着您可以寻找模式。

俗话说,人各有志--如果你认为数据可以存储在类中,那就继续吧,对我来说,将数据输出到自定义符号中,然后在该图表上使用指标会更方便。

我当然会这么做。毕竟,在 5 中,您可以随时访问不同的工具。为每种工具编写一个类是多余的。这就好比有形状,我们不会使用基类形状,而总是写一个新的。fxsaber 有时写的 东西很有水平。而且他知道得更清楚,显然他需要这样做。但我认为这是不必要的。


Igor Makanu:

Expert Advisor 可以在策略测试器中运行,因此您可以使用优化器......这意味着您可以寻找模式

俗话说,人各有志--如果您认为数据可以存储在类中,那就请便吧,对我来说,将数据输出到自定义符号中,然后在该图表上使用指标更方便。

下面是我的合成图表中欧元兑美元 - 英镑兑美元价差的草图。

https://charts.mql5.com/18/849/spread-h1-alpari-international-limited.png

非常方便的是,您可以直观地查看图表并分析条形图的时间,此外还有所有 TFs,您可以在策略测试器中运行策略,而且返回到真实符号也不成问题。

如果我知道它能带来什么,也许我会支持这个想法。但现在的情况是......) ))

 
Igor Makanu:

请告诉我如何使用您的库创建自己的符号,但不要复制历史数据- 我想修改 OHLC,不想破坏您的代码 ))),不胜感激!

以上是简短代码。那里有详细的注释。