脚本: ThirdPartyTicks - 页 2

 
Maxim Dmitrievsky:

我只是在胡思乱想,对不起,我可以删除以前的帖子,我应该这样做吗?)

我不为队伍的纯洁性而战,让它活下去。既然你有关于工具包的东西,那就写吧。

对于 MO 陌生人,我会做的第一件事是与其他来源进行性能比较。

而对于更脚踏实地的人--测试者。


ZЫ 向 "车间同志 "提出建议。

Машинное обучение в трейдинге: теория и практика (торговля и не только)
Машинное обучение в трейдинге: теория и практика (торговля и не только)
  • 2016.05.26
  • www.mql5.com
Добрый день всем, Знаю, что есть на форуме энтузиасты machine learning и статистики...
 
fxsaber:

我不为队伍的纯洁性而战,让它活下去。如果你有关于工具包的任何信息,请写信给我。

对于 MO 陌生人,我会做的第一件事是与其他来源的特征进行比较。

而对于更脚踏实地的人--测试员。


ZY 建议 "战友"。

在我用手指展示之前,除了我之外,其他人不太可能察觉到,但我写了:)

 

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

图书馆:符号

fxsaber, 2018.04.07 22:37

同时也对该实现进行了简短测试(只是条形价差的计算方式不同)

比较了两种模式:"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 倍。

 
Исторически сложилось, что для MetaTrader 4 пользуются популярностью сторонние приложения, позволяющие получать тиковую историю из различных источников. Как правило, ее используют в Тестере Стратегий как полигон для проверки советников, а также для исследований (машинное обучение и т.д.). Некоторые источники котировок в обсуждениях стали почти стандартом при поиске "грааля".
一个简单的例子就能说明,很多人在寻找工作 TC 的过程中都是在胡思乱想。尤其是机器学习爱好者。

让我们在四月的第一周,在 "市场观察窗口中选择所有符号 "模式下运行EA 优化(按真实刻度)。

#include <fxsaber\ThirdPartyTicks\Data.mqh>

input double inCommissionProcent = 0.002;
sinput bool inLog = true;
sinput int inOnTester = 0;

#define  RESERVE 100000

// 以相对值和绝对值(点)表示的潜在利润
class MAXPROFIT : public DATA<double>
{
private:    
  bool FlagUP;
  double MinMax;

  const double MarkupAsk;  
  const double MarkupBid;

  void SetMarkup( MqlTick &Tick ) const
  {
    Tick.bid *= this.MarkupBid;
    Tick.ask *= this.MarkupAsk;
    
    return;
  }
  
  static void MathLog( MqlTick &Tick )
  {
    Tick.bid = ::MathLog(Tick.bid);
    Tick.ask = ::MathLog(Tick.ask);
    
    return;
  }
  
  double MathRelative( const double Value ) const
  {
    return(this.Relative ? ::MathExp(Value) : Value);
  }
  
public:  
  const bool Relative;
  
  MAXPROFIT( const double Commission = 0, const bool inRelative = false ) : FlagUP(true), MinMax(-DBL_MAX), Relative(inRelative),
                                                                            MarkupBid(1 - Commission), MarkupAsk(1 + Commission)
  {
  }
  
  void AddTick( MqlTick &Tick )
  {
    this.SetMarkup(Tick);
    
    if (this.Relative)
      MAXPROFIT::MathLog(Tick);
    
    if (this.FlagUP)
    {
      if (Tick.bid > this.MinMax)
        this.MinMax = Tick.bid;
      else if (Tick.ask < this.MinMax)
      {
        this.Add(this.MinMax, RESERVE);
        
        this.MinMax = Tick.ask;
        this.FlagUP = false;
      }
    }
    else
    {
      if (Tick.ask < this.MinMax)
        this.MinMax = Tick.ask;
      else if (Tick.bid > this.MinMax)
      {
        this.Add(this.MinMax, RESERVE);
        
        this.MinMax = Tick.bid;
        this.FlagUP = true;
      }
    }
    
    return;
  }
  
  double GetProfit() const
  {
    double Res = 0;
    
    const uint Size = this.GetAmount();
    
    for (uint i = 1; i < Size; i++)
      Res += this.MathRelative(::MathAbs(this.Data[i] - this.Data[i - 1]));
      
    if (Size)
      Res += this.MathRelative(::MathAbs(this.MinMax - this.Data[Size - 1]));
      
    return(Res);
  }
};

MAXPROFIT MaxProfit(inCommissionProcent / 100, inLog);

void OnTick()
{  
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
    MaxProfit.AddTick(Tick);
}

double OnTester()
{  
  switch (inOnTester)
  {
  case 0:
    return(MaxProfit.Relative ? MaxProfit.GetProfit() : (int)(MaxProfit.GetProfit() / _Point + 0.1));
  case 1:
    return(MaxProfit.GetAmount());
  case 2:
    return((MaxProfit.Relative ? MaxProfit.GetProfit() : (int)(MaxProfit.GetProfit() / _Point + 0.1)) / MaxProfit.GetAmount());
  }
  
  return(0);
}


运行结果

数值是历史记录中可能获得的最大利润(包括佣金)。

截图中突出显示的是 EURUSD,它来自 MQ-Demo,其他符号是 ThirdPartyTicks。我们可以看到,欧元兑美元有 8878.74 点,而其第三方同名货币有 15134.94 点。这意味着欧元兑美元上的任何 TS 显示的利润都低于其同名符号。

事实证明,任何在 MQ-Demo EURUSD 上进行相同操作的人都会错过一整层可能盈利的 TS。而且会大大低估 FOREX 符号。


最上面的是 GBPAUD。它的水平表明,编写一个点差分析器是非常容易的,它将在测试器中显示出完美执行的 OOS 空间。

打破圣杯幻觉的不是演示,因为演示也会显示完美的结果。当然,是真实的结果。


首先,佣金会造成干扰,因为吹笛者的期望值很低~8 点(* 每周数千次交易)。但更糟糕的是,它会扭曲执行结果。

在通过市场实现的情况下,我们将获得大量的负滑点,这些滑点与佣金一起将覆盖预期值。这样就会出现流失。

如果通过限价订单实现,我们不会出现负滑点(有时会出现正滑点),但我们会被频繁的重新套单所破坏,因为这些订单根本无法执行。因此,大量本来可以在同一个模拟器上进行的盈利交易将被忽略。这将再次导致资金流失。如果这不是外汇交易,而是股票交易,执行情况肯定会好得多。


从这个简单的例子中或许仍能得出结论。在编写 TS 之前,不仅要根据报价来源(经纪人),还要根据符号选择最佳交易条件(报价)。该 EA 可以在这方面提供非常明显的帮助。使用这种方法,您可以在 MT5 中检查一家经纪商,然后再检查另一家。并立即了解任何 TS 在哪里以及使用哪种符号更有利可图。

 

没有人会这么做,因为这种勾选策略很容易被经纪商扼杀。

很明显,没有人会在模拟元报价的报价上进行测试,而是在他们将要交易的经纪商的报价上进行测试。

至于 MO 与此有何关系,目前还不清楚:)

 
Maxim Dmitrievsky:

没有人这么做,因为这种股票策略很容易被经纪商扼杀

我不认为我们在这里讨论过基于 tick 的 TS。低期望值不是点差。

很明显,没有人在模拟元报价的报价上进行测试,而是在他们将要交易的经纪商的报价上进行测试。

例如 MQ-Demo。在选择 dts 时,搜索 TS 的理由是什么?

MO 和它有什么关系还不清楚:)

应该注意的是,首先要选择合理的研究对象,而不是随意选择经纪公司的 AUDCAD

 
fxsaber:

我不认为这里有任何关于 TICK TS 的讨论。低预期值不是点差。

例如,MQ-Demo 就是。在选择经纪行时,搜索 TS 的理由是什么?

应该注意的是,首先要选择一个合理的研究对象,而不是随意选择一家经纪公司的 AUDCAD。

通常情况下,策略是在开盘价 时采取的,ticks 完全不会对其产生影响。那么哪家经纪商并不重要

 
Maxim Dmitrievsky:

通常情况下,策略都是按开盘价 执行的,ticks 完全没有影响。那么哪个经纪商都无所谓。

您也可以采取 H1 或更好的 D1,以实现完全独立。总的来说,这些家伙很奇怪。

 
fxsaber:

你也可以选择 H1 或者更好的 D1 来实现完全独立。总的来说,这些家伙很奇怪。

好吧,1-5 分钟是可以的:)您可以创建自己的 TFs,然后您需要好的 ticks,是的。

顺便说一下,根据您的档案 - 他们有 LP Admiral Markets,也许直接从他们那里获取报价是有意义的,应该是一样的。

 
Maxim Dmitrievsky:

那么,1-5 分钟时是正常的)。

那么,"正常 "之前和 "不正常 "之后的界限在哪里呢?