文章 "MQL5 对决 QLUA - 为什么在 MQL5 中交易操作速度快达 28 倍?" - 页 2

 
Rashid Umarov:
代码已经提供,任何人都可以自己检查,看看结论是否成立。这里没有问题。

我的代码

sinput int Interval = 30; // 以秒为单位的时间间隔

class BENCH
{
protected:
  MqlTick FirstTick;
  int Count;
  ulong StartTime;

  int GetAmountTicks( const ulong From = 0, const int Amount = 10000 ) const
  {
    MqlTick Ticks[];

    return(::CopyTicks(this.symbol, Ticks, COPY_TICKS_ALL, From, Amount));
  }
  void Init( void )
  {
    this.Count = 0;

    this.GetAmountTicks(); // 热身
    ::SymbolInfoTick(this.symbol, this.FirstTick);

    this.StartTime = ::GetMicrosecondCount();

    return;
  }

public:
  const string symbol;
  const int TimerInterval;

  BENCH( const int iTimerInterval, const string Symb = NULL ) :
         symbol((Symb == NULL) ? ::Symbol() : Symb), TimerInterval(iTimerInterval * (int)1 e6)
  {
    this.Init();

    this.StartTime = 0;
  }

  ~BENCH( void )
  {
    ::Comment("");
  }

  void Refresh( const string Symb )
  {
    if (Symb == this.symbol)
    {
      if (this.GetBenchTime() >= this.TimerInterval)
      {
        if (Count > 0)
          ::Alert(this.ToString());

        this.Init();
      }

      Count++;
    }

    return;
  }
  int GetBenchTime( void ) const
  {
    return((int)(::GetMicrosecondCount() - this.StartTime));
  }

  string ToString( void ) const
  {
    const ulong BenchTime = this.GetBenchTime();
    const int Amount = this.GetAmountTicks(this.FirstTick.time_msc);

    if ((BenchTime == 0) || (Amount == 0))
     return(NULL);

    const double Velocity1 = 1 e6 * this.Count / BenchTime;
    const double Velocity2 = 1 e6 * Amount / BenchTime;

    return((string)this.Count + "/" + (string)Amount + " = " + ::DoubleToString(100.0 * Count / Amount, 2) + "%, ExChange_History = " +
           ::DoubleToString(Velocity2, 1) + " ticks/sec, MT5_RealTime = " + ::DoubleToString(Velocity1, 1) + " units/sec, Interval = " +
           ::DoubleToString(BenchTime / 1 e6, 1) + " sec.");
  }
};

class BENCH_BOOK : public BENCH
{
public:
  BENCH_BOOK( const int iTimerInterval, const string Symb = NULL ) : BENCH(iTimerInterval, Symb)
  {
    ::MarketBookAdd(this.symbol);
  }

  ~BENCH_BOOK( void )
  {
    ::MarketBookRelease(this.symbol);
  }
};

/*
BENCH Bench(Interval);

void OnTick( void )
{
 Bench.Refresh(_Symbol);

 return;
}
*/

BENCH_BOOK BenchBook(Interval);

void OnBookEvent(const string &symbol )
{
  BenchBook.Refresh(symbol);

  return;
}

结果

2016.09.13 17:18:35.667 Bench (Si-9.16,M1)      851/754 = 112.86%, ExChange_History = 25.1 ticks/sec, MT5_RealTime = 28.3 units/sec, Interval = 30.1 sec.
2016.09.13 17:18:05.524 Bench (Si-9.16,M1)      662/506 = 130.83%, ExChange_History = 16.9 ticks/sec, MT5_RealTime = 22.1 units/sec, Interval = 30.0 sec.
2016.09.13 17:17:35.424 Bench (Si-9.16,M1)      883/1610 = 54.84%, ExChange_History = 53.6 ticks/sec, MT5_RealTime = 29.4 units/sec, Interval = 30.0 sec.
2016.09.13 17:17:05.319 Bench (Si-9.16,M1)      834/2707 = 30.81%, ExChange_History = 90.1 ticks/sec, MT5_RealTime = 27.8 units/sec, Interval = 30.0 sec.
2016.09.13 17:16:35.196 Bench (Si-9.16,M1)      789/627 = 125.84%, ExChange_History = 20.9 ticks/sec, MT5_RealTime = 26.3 units/sec, Interval = 30.0 sec.
2016.09.13 17:16:05.110 Bench (Si-9.16,M1)      900/822 = 109.49%, ExChange_History = 27.4 ticks/sec, MT5_RealTime = 30.0 units/sec, Interval = 30.0 sec.
2016.09.13 17:15:34.993 Bench (Si-9.16,M1)      772/747 = 103.35%, ExChange_History = 24.8 ticks/sec, MT5_RealTime = 25.7 units/sec, Interval = 30.1 sec.

您可以清楚地看到,即使在相邻的半分钟内,结果也有很大差异。眼镜的比较只能在同一时间进行!

[删除]  
Тестирование синхронных операций  - 进行一系列 10 次同步连续买入交易操作,并在交易所确认每次交易成功。在收到交易服务器关于交易在交易所成功/失败的确认之前,不会执行后续操作。 执行速度取决于终端--交易服务器--交易所--交易服务器--终端的整个链条。同步交易操作的平均时间越短越好。
//--- 运行操作循环
      for(int i=0;i<Trades;i++)
        {
         req.price  =SymbolInfoDouble(_Symbol,SYMBOL_ASK);
         req.comment=string(i+1);
         //--- 行动
         if(!OrderSend(req,res))
           {
            PrintFormat("OrderSend() failed, retcode=%d",res.retcode);
           }
         else
           {
            trades_finished++;
            PrintFormat("#%d Buy %s 1 lot",i+1,_Symbol);
           }
        }

您提到的确认在哪里?我在代码中没有注意到。如果您指的是OrderSend() 的响应,那么可以从帮助中找到:

返回值

如果基本结构检查(指针检查)成功,则返回 true,但 这并不表示交易操作执行成功。要获得函数执行结果的更详细描述,应分析 结果结构的字段

请解释一下。
 
fxsaber:

视频显示的是会议的开始。文章中的视频是果汁。而

数字不足以启动会话。请解释一下什么是 "排队 "和 "热身"。

看看测试中的时间--这是安静的一天的中间,而不是课程的开始。因此,跳过少量刻度是合理的,这足以避免未选择刻度的潜在残差。

我们并不是在论坛上让孩子们不知道如何进行测试测量,然后因为证据不足而输掉比赛。测试运行了几十次,以确保没有错误。然后才是发表。

 
Alexey Kozitsyn:

你说的确认在哪里?我在代码中没有注意到。如果您指的是 OrderSend() 的响应,那就是帮助中的响应:

请解释一下。

OrderSend 是 100% 同步操作,需要等待服务器上完整订单的结果。

也就是说,在外部交易所执行的情况下,它是一个完整的处理周期,交易所确认订单下达。

 
Renat Fatkhullin:

看看测试中的时间--这是宁静的一天的中间,而不是会议的开始。

您的同事说的交易时段

交易时段 开始之前 ,堆栈会有几次单次更新。因此,脚本会跳过前 N 个刻度,以确保堆栈中确实有订单。之后才开始计算刻度。


如果代码与之前的视频保持一致,那就另当别论了。
 
fxsaber:

我的代码

结果

您可以清楚地看到,即使是相邻的半分钟,结果也有很大差异。眼镜的比较只能在同一时间进行!

同时进行是指测量结果相差 10%左右。

但是,如果几十次测试的结果稳定在 4-5 倍之间,那就没什么好讨论的了。

 
Alexey Kozitsyn:

你说的确认在哪里?我在代码中没有注意到。如果您指的是 OrderSend() 的响应,那就是帮助中的响应:

请解释一下。

OrderSend 返回的值与 OrderCheck 相同。但在这种情况下,如果返回值为 true,OrderSend 只有在交易服务器的响应到达时才会完成执行。

交易服务器(网关)是通往交易所的管道,只对 GO 进行检查。因此,如果 GO 错误,订单将无法到达交易所。从这个意义上说,您检查MqlTradeResult 是正确的。但在这种情况下,GO 每次都是正确的,因此所有订单都发送到了交易所。OrderSend 在收到交易所的准确回复后就结束了工作。

因此结果是正确的。

 
fxsaber:
您的同事说到会话
如果代码与之前的视频没有变化,那就不一样了。

您与另一个视频混淆了,该视频展示了三个终端会话启动的视觉对比。在该视频https://www.youtube.com/watch?v=i5vvD66I3Ik 中,您可以很容易地看到 MT5 在数据更新速度方面的明显优势。

在文章https://www.mql5.com/zh/articles/2635 中,我们证明了数据速度上的差异,并特别选取了一天中的中间时段(2016.09.12 13:57 GMT+1),这样就不会有人抱怨有人在市场开始时刹车的潜在可能性。文章https://www.youtube.com/watch?v=J5nqWGQ1zh8 中的视频显示了三分钟内干净利落的顺序测量,没有任何中断。

3markets 25082016 blur
3markets 25082016 blur
  • 2016.08.25
  • www.youtube.com
Запись стаканов в терминалах MetaTrader 5, Quik и SmartX 25 августа 2016. Инструмент Si-9.16
 
Renat Fatkhullin:

您可能会对另一个视频感到困惑,该视频对三个终端的会话启动进行了直观比较。在该视频https://www.youtube.com/watch?v=i5vvD66I3Ik 中,您很容易注意到 MT5 在数据更新速度上的明显优势。

https://www.mql5.com/zh/articles/2635 一文中,我们证明了数据更新速度的差异,并特意选择了一天中的中间时段(13:57 GMT+1),这样就不会出现有人在市场开始时刹车的说法。文章https://www.youtube.com/watch?v=J5nqWGQ1zh8 中的视频显示了三分钟内的连续测量结果。

我只是对当前文章来源中的评论有疑问

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

讨论文章 "MQL5 和 QLUA 的比较 - 为什么 MQL5 中的交易操作快达 28 倍?

fxsaber, 2016.09.13:25 pm

 //--- 跳过初始队列清理和预热的第一个刻度点
   tickcounter++;
   if(tickcounter<ExtSkipFirstTicks)
      return;

需要澄清队列和预热对性能的影响。

如果它是一个基本要素(从之前的视频来看)--是一回事,如果不是--又是另一回事。
 
fxsaber:
我只是对当前文章来源中的评论有一个疑问
如果是基本的(从之前的视频中)--是一回事,如果不是--又是另一回事。

任何测试都应包含冷启动保护。

因此,跳过 N 个刻度就表明我们意识到并考虑到了这一点。这样做的目的是为了避免有人提出 "你们为什么不对冷启动的影响进行补偿 "的说法。


关于三个终端会话开始的 视频是 2016 年 8 月 25 日为另一位声称 MT5 在会话开始时变慢的交易员准备的。后来的事实证明,该交易员根本没有使用 MT5,只是在论坛上散布了一些猜测。此外,一些交易员并不知道,外汇交易工具的图表不是根据出价(Bid),而是根据最后成交价(Last)绘制的。他们将堆栈中出价的变化及其在图表中的不显示视为 "MT5 制动器"。

当然,并没有什么 "刹车"。