MT5和速度在行动 - 页 18

 
Renat Fatkhullin:

你只有5000和unlim两种状态?

你是你自己幸福的主谋。

是的,你需要完全的控制或表面的控制。我不认为在这两者之间有什么意义。
 
Renat Fatkhullin:

在理论上,是的。

不要忘记同步过程。平台中大量的进程是异步的。

例如,与交易所或流动性供应商整合的网关可能会发送交易报告,延迟时间为几秒钟甚至是几分钟。通常情况下,api根本不提供对历史记录的访问,而是提供缓慢和无节奏的报告生成器。

在开市时,或由于意外的网关重新连接,报告可能会被延迟。它们被复制到服务器上的历史记录,并立即异步发送到终端。由于按日期排序,它们被插入正确的位置,同时,你可以开立新的交易。

大多数集成API是如此不识时务,功能紊乱,几乎让人无法做出有保障的 网关。尽管有一种观点认为这是他们的开发者故意破坏的产物。

我们应该给予选择权吗?谁需要物理扣球,谁需要足够的指数与适当的风险一起工作。

 
与本主题无关的评论已被移至"来自MQL5 MT5 MetaTrader 5初学者的问题"。
 
fxsaber:

我们应该给予选择的权利吗?谁需要物理扣球,谁需要足够的与指数合作的适当风险。

在EA上保留一个本地缓存,并相对于最后的更新时间进行采样,这有什么问题?我是这样做的,而且从来没有出现过任何滞后情况。我的网络功能因为其同步实现而拖慢了整个界面,如果能有WebRequestAsync 开箱即用就好了,尽管我已经在考虑DLL甚至绑定python和C++的包装器,因为python中有一个交易API :)

但在没有本地缓存的情况下处理大量的数据是非常奇怪的。

PS。总的来说,哈希掩码和缓存在多币种中的需求非常大,这就是为什么我在这个主题中询问了正常(读作快速)哈希掩码的开箱。
Документация по MQL5: Сетевые функции / WebRequest
Документация по MQL5: Сетевые функции / WebRequest
  • www.mql5.com
Для использования функции WebRequest() следует добавить адреса серверов в список разрешенных URL во вкладке "Советники" окна "Настройки". Порт сервера выбирается автоматически на основе указанного протокола - 80 для "http://" и 443 для "https://". Функция WebRequest() является синхронной, это означает, что она приостанавливает выполнение...
 
Andrey Pogoreltsev:

在EA上保留一个本地缓存,并相对于最后的更新时间进行采样,这有什么问题?

该剧本 就是这样做的。

至于本地缓存,这就是MT4Orders历史的实现方式

 
fxsaber:

至于本地缓存,这就是MT4Orders实现的故事

我没有想到,这个两年前的剧本会

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

订单关闭时间专家顾问MQL5

fxsaber, 2018.07.06 00:49

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

void LastTimeMQL4( datetime &OpenTime, datetime &CloseTime )
{
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      OpenTime = OrderOpenTime();
      CloseTime = OrderCloseTime();
      
      break;
    }
}

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
  
      if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
          OpenTime = (datetime)HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME);
          
        break;
      }
    }
  }
}

typedef void (*GetLastTime)( datetime&, datetime& );

void Bench( GetLastTime LastTime, const int Amount = 10000 )
{
  datetime OpenTime, CloseTime;
  datetime Tmp = 0;

  for (int i = 0; i < Amount; i++)
  {
    LastTime(OpenTime, CloseTime);
    
    Tmp += CloseTime - OpenTime;        
  }
  
  Print(Tmp);
}

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

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

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
    PRINT(HistoryDealsTotal());

  BENCH(Bench(LastTimeMQL4))
  BENCH(Bench(LastTimeMQL5))  
}


将显示这样的刹车!

// Первый запуск
2020.08.28 22:01:12.941 HistoryDealsTotal() = 9435
2020.08.28 22:01:13.198 2046.04.30 00:13:20
2020.08.28 22:01:13.198 Time[Bench(LastTimeMQL4)] = 257277
2020.08.28 22:01:43.982 2046.04.30 00:13:20
2020.08.28 22:01:43.982 Time[Bench(LastTimeMQL5)] = 30783493

// Второй запуск
2020.08.28 22:03:31.474 HistoryDealsTotal() = 9435
2020.08.28 22:03:31.724 2046.04.30 00:13:20
2020.08.28 22:03:31.724 Time[Bench(LastTimeMQL4)] = 250491
2020.08.28 22:04:02.011 2046.04.30 00:13:20
2020.08.28 22:04:02.011 Time[Bench(LastTimeMQL5)] = 30286258

纯粹的MQL5比部分(只有HistorySelectByPosition)缓存要慢100倍。

 
该测试根本无法接受。

对于MQL5-风格,你已经专门在整个深度上测试了10 000个HistorySelect的 样本。而且你还增加了额外的周期。

没有明确的初始条件说明,解释他们明显的偏见,并给出令人震惊的数字--这是最纯粹的作弊和操纵。

对于这样的犯规,用狼牙棒罚单。
 
Renat Fatkhullin:
该测试完全不能接受。

对于MQL5风格,你已经在全深度上测试了10 000个HistorySelect的样本。而且你还增加了额外的周期。

没有明确的初始条件说明,解释他们明显的偏见,并给出令人震惊的数字--这是最纯粹的作弊和操纵。

对于这样的犯规,用狼牙棒罚单。

那么,你的认识是错误的。事实证明,缓存自己,使之没有胸腔运动是正确的。

如果我理解正确的话,在这个实施之后。

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

MT5和速度在行动

Renat Fatkhullin, 2020.08.27 22:58

我们已经优化了大量的采样操作,现在我们考虑的是缓存的最佳更新,而实际上99%的采样都是完全无用的,会在事实上被错过。

也就是说,除非你特别随机化采样限制,否则缓存将显示接近100%的点击率。

很可能下周就已经有了有效的解决方案。


这个例子的运行速度会快很多。


HH 该脚本计算交易历史中最后一个头寸的开仓/平仓时间。

 
fxsaber:

告诉你如何正确地缓存自己,这样你就不会被甩掉了。

如果你像这样 "缓存",它将是超级快 的。

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  static ulong PrevTicketIn = 0;  // Хранит тикет входа позиции с последнего вызова.
  static ulong PrevTicketOut = 0; // Хранит тикет выхода позиции с последнего вызова.
  
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
      
      if (Ticket == PrevTicketOut)            
      {
        OpenTime = (datetime)HistoryDealGetInteger(PrevTicketIn, DEAL_TIME);
        CloseTime = (datetime)HistoryDealGetInteger(PrevTicketOut, DEAL_TIME);        
        
        break;
      }
      else if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        PrevTicketOut = Ticket;
        
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
        {
          PrevTicketIn = HistoryDealGetTicket(0);
          OpenTime = (datetime)HistoryDealGetInteger(PrevTicketIn, DEAL_TIME);
        }
          
        break;
      }
    }
  }
}

谁会这样写?

 
fxsaber:

如果你像这样 "缓存",它是超级快的。

谁会这样写?

C语言程序员。