MT4-测试仪 VS MT5-测试仪 - 页 3

 
fxsaber:
证明

这不是证据。

你错了。

我的论断是正确的--上述专家只是在测试对交易历史 的访问。
 
Renat Fatkhullin:

这不是证据。

你错了。

你的错误是什么?我甚至检查了自己,在有历史记录功能的地方设置断点,运行CTRL+F5进行调试。所有的工作都做得很干净。
Renat Fatkhullin:
我的论断成立--上述专家只测试访问交易历史

你已经妄下结论了。

 

我不确定这种比较是否有意义--云计算 否定了MT4测试器的所有速度优势。

而且,此外,在这种情况下,确实,EA是在测试纯粹的数据访问速度。但我不认为这对大多数EA来说是一个瓶颈。

在MT5引入对冲头寸的账户后,我个人认为MT4对我来说根本没有任何优势。我使用跨平台库只是因为我的真实账户上有MT4。

我个人唯一怀念的是--指针或数组引用。由于某些原因,我不需要在指标中复制数据。MQL5拥有其他一切。

Распределенные вычисления в сети MQL5 Cloud Network
Распределенные вычисления в сети MQL5 Cloud Network
  • cloud.mql5.com
Заработать деньги, продавая мощности своего компьютера для сети распределенных вычислений MQL5 Cloud Network
 
fxsaber:
你妄下结论。
还有什么呢?查询数据,并将其转储到一个文件中。没有其他动作--你认为这个EA在测试什么?
 
fxsaber:

ZS 不是所有的运行都完全匹配。所以三者中肯定有一个在说谎(MT4+TDS、MT5、MT4Orders)。我们将不得不去寻找它。

感谢子,罪魁祸首已经找到了,它总是在有机会比较的时候发生。

专家顾问显示错误

// MQL4&5-code

#property strict

#ifdef __MQL5__
  #define Bid (SymbolInfoDouble(_Symbol, SYMBOL_BID))
  #define Ask (SymbolInfoDouble(_Symbol, SYMBOL_ASK))
#endif // __MQL5__

#define  PRINT(A) Print(#A + " = " + (string)(A));

void OnTick()
{
  static bool FirstRun = true;
  
  static const double PrevBid = Bid;
  static const double PrevAsk = Ask;
  
  if (FirstRun)
  {
    PRINT((PrevBid != Bid) || (PrevAsk != Ask))
    
    FirstRun = false;
  }
}


MT4

2017.05.08 10:57:33.056 2017.04.10 00:00:08  TDS_Test EURUSD,M1: (PrevBid!=Bid)||(PrevAsk!=Ask) = false


MT5

2017.05.08 11:01:31.266 2017.04.10 00:00:08   (PrevBid!=Bid)||(PrevAsk!=Ask) = true
 
George Merts:
还有什么呢?的数据请求,并将其保存到一个文件中。没有进行其他操作--你认为这个EA在测试什么?
我建议你阅读整个讨论,那么这种问题甚至不会出现。
乔治-默茨

在MT5中引入带对冲头寸的账户后,我个人认为MT4没有任何优势。

这条线因其集中了建设性的内容而显得有些突出。所以个人喜好最好在这里 讨论,比如说。

 
fxsaber:
错误在哪里?我甚至检查了自己,在有历史功能的地方都设置了断点,并通过CTRL+F5进行调试。这一切都进行得很干净。

你妄下结论。

总而言之。

  1. 历史工作正如火如荼地进行着,交易在历史扫描后结束。
  2. 使用MT4Orders.mqh--这是对实验的纯洁性的终结。畸形的库有开销,写得很恶心,无法阅读。有人严重地证明了他们的懒惰。
  3. 写作for(i=200 000; i>=0; i--)OrderSelect在每一个刻度 上都是疯狂的,并且试图重复关于日本锯子和俄罗斯男人的笑话。
       for(int i=OrdersTotal()-1; i>=0; i--)
          if(OrderSelect(i,SELECT_BY_POS) && ((!TradeTime) || (OrderProfit()>0) || 
             ((OrderType() == OP_BUY)  && (PriceToInteger(OrderOpenPrice()) - IntBid >= Limit)) ||
             ((OrderType() == OP_SELL) && (IntAsk - PriceToInteger(OrderOpenPrice()) >= Limit))))
             OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
    
  4. 整个测试完全是为了第3点的循环而写的。

    粗略地说,我们在测试中采取了1 800 000个点,其中200 000个交易在5天内被打开。让我们把它简化为900 000 ticks,其中100 000个订单在历史上被扫描,我们得到900 000 000 * 100 000 = 900 000 000 OrderSelect调用(有库的溢出)。被测试的正是9000亿次OrderSelect调用。

    而其中99.99%的电话是绝对不必要的,只是为了证明 "滞后"。


如果你想做一个干净的测试,写两个相同的干净的例子,不需要库。这将保证干净,没有为了兼容性而内置的开销。

我们已经优化了对历史的访问,并完全取消了这个演示。它是故意这样写的。

 
Renat Fatkhullin:

总而言之。

  1. 历史工作正在如火如荼地进行,历史扫描后的交易已经结束
在哪里?
  1. 使用MT4Orders.mqh--是为了结束实验的纯洁性。 这是一个可怕的库,其开销以令人厌恶和无法阅读的方式编写。
这就是我。
  1. 写作for(i=200 000; i>=0; i--)OrderSelect在每一个刻度 上都是疯狂的,试图重复关于日本锯子和俄罗斯男人的笑话。
你已经完全忘记了MQL4。这里没有提到历史。
  1. 整个测试完全是为了第3点的循环而写的。

    99.99%的挑战是完全不必要的,纯粹是为了演示 "刹车"。
这个例子不是编造的,来源中有一个与原文 的链接。这是一个最著名和最古老的黄牛党。

如果你想做一个干净的测试,写两个相同的干净的例子,不需要库。这样就能保证清洁度,而且不会因为兼容性的原因而内置开销。

我希望能够对两个测试者进行比较。请看各自的优点和缺点。同时,比较也是识别虫子的最有效方法之一。

这条线从展示两个测试者的原始数据的身份开始。这是基础,没有这个基础我们什么都做不了。然后大家可以选择一个专家顾问进行测试。

我们已经优化了对历史的访问,完全否定了这种示范。它是故意这样写的。

多亏了别人的申请,SD才得以如此。建设性的批评是一件好事。
 

在历史上工作是OrderSelect和类似的OrderXXXX命令。不要假装你不明白这一点。特别是如果你已经写了库。

我没有忘记MQL4,它在那里也能用历史记录。

为20万个交易写一个历史扫描器,深入到每个tick,并忘记了合理退出循环的条件?这就是所谓的--故意玩弄俄罗斯男人。

也不要参考一些黄牛党。这个循环是故意写得如此愚蠢的。甚至在测试的5天内,除了数以千亿计的OrderXXX函数被测试,其中99.99%都不需要被调用。


问题是,你开始用绝对准确的说法来争论:"整个专家顾问的例子是这样写的,它只做一件事--在每一个tick上扫描整个交易历史",尽管你很清楚为什么你故意写了这个测试。毕竟,你可以用你的手一动就把99.99%的愚蠢扫描去除,但那样的话,测试就会失败。
 
Renat Fatkhullin:

处理历史的工作是OrderSelect和类似的OrderXXXX命令。不要假装你不了解它。特别是如果你已经写了库。

我没有忘记MQL4,它在那里也能用历史记录。

为20万个交易写一个历史扫描器,深入到每个tick,并忘记了合理退出循环的条件?这就是所谓的--故意玩弄俄罗斯男人。

也不要提及一些黄牛党。这个循环是故意写的。而即使在5天内,它所测试的只是数以千亿计的OrderXXXXX函数,其中99.99%不需要被调用。

我不会争论。我请熟悉MQL4的论坛用户审查这个简短的源代码,并解释Renat的意思。

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

MT4-测试仪 VS MT5-测试仪

fxsaber, 2017.05.08 01:11

EA

// Idea - https://www.mql5.com/ru/code/7464
#property strict

input int Shift = 3; 
input int Limit = 18;
input double Lots = 0.1;

int PriceToInteger( const double Price )
{
  return((int)(Price / _Point + 0.1));
}

void OnTick()
{
  static int PrevBid = PriceToInteger(Bid);
  static int PrevAsk = PriceToInteger(Ask);    

  const int IntBid = PriceToInteger(Bid);
  const int IntAsk = PriceToInteger(Ask);
  
  const bool TradeTime = (TimeCurrent() % (24 * 60 * 60) < D'1970.01.01 23:50'); // exclude swaps
  
  if (TradeTime && (IntAsk - IntBid < Limit))
  {
    if ((IntBid - PrevBid >= Shift)) 
      OrderSend(_Symbol, OP_SELL, Lots, Bid, 0, 0, 0);
    
    if (PrevAsk - IntAsk >= Shift) 
      OrderSend(_Symbol, OP_BUY, Lots, Ask, 0, 0, 0);
  }

  PrevBid = IntBid;
  PrevAsk = IntAsk;
  
  for (int i = OrdersTotal() - 1; i >= 0; i--) 
    if (OrderSelect(i, SELECT_BY_POS) && ((!TradeTime) || (OrderProfit() > 0) ||
        ((OrderType() == OP_BUY)  && (PriceToInteger(OrderOpenPrice()) - IntBid >= Limit)) ||
        ((OrderType() == OP_SELL) && (IntAsk - PriceToInteger(OrderOpenPrice()) >= Limit)))) 
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0); 
}

我一定是搞错了,但我看不出MT4的历史工作是怎么回事。请帮助。