MT5和速度在行动 - 页 62

 
Rorschach:
实时内核会有什么帮助吗?

投入更多的核心,不要把情况推到100%的单核心负荷。

不要相信童话故事,处理器和线程调度器并不像你想象的那样工作。

 
Anton:

在最新的版本中,即使在理论上,蜱流接收也没有任何影响。实际上SymbolInfoTick已经可以使用缓存,但个别市民一直在寻找一只黑猫。

而且在测试中甚至没有80%。它有6个代理在4个核心上运行,即100%保证。

唯一的问题是他的系统的任务调度器是如何处理这种情况的。同时,有些人声称是终端的实施造成的。

也就是说,当一台电脑超载时,会人为地制造出一种情况,这时电脑上的一切都会变慢,然后以 "哦,看,为什么终端有时会滞后 "的形式提出一些主张。

让我们闭上眼睛,即使在这样的条件下,它也是 "大约0.01%" - 让细节见鬼去吧!只要说 "没有人关心医院的平均温度","交易时滞后会造成问题 "和 "我们想要HFT "就够了。

此外,我们当然希望HFT 在20个专家的旧办公室桌面或一个死的虚拟机上。

PS PositionSelectByTicket()在其实现中当然可以访问一个具有访问同步性的共享资源。而如果你不在每次看涨时选择仓位,你就会读到旧的价格。通过SymbolInfoDouble做一个 "快照 "更容易。

谢谢

我得到了我的问题,因为六个月前,我正在优化我的代码,测试系统函数的速度,六个月前,SymbolInfoDouble比SymbolInfoTick慢

也许你说的是真的,我今天在网上搜了几篇关于多核缓存的文章(我已经很久没有对这些信息感兴趣了)。

这里有一篇短文https://i2hard.ru/publications/25666/

问题是,数据只从L1缓存中进入ALU,而L1缓存非常小,如果你全速加载处理器,那么真的--测试将变成对操作系统的测试+对处理器缓存 速度的测试(加载,预测L1+L3数据),而不是测试代码(应用)性能。

 

fxsaber ,如果你在任务管理器中为代理设置一个低优先级,为MT5设置一个高优先级,会怎么样?

我找不到一个能阻止所有程序/操作系统线程被分配到特定CPU线程的工具,否则MT5就有可能保留一个线程,并自动阻止它被其他程序使用,这在理论上可以减少滞后。

 
Anton:

在最新的版本中,即使在理论上,蜱流接收也没有任何影响。实际上,SymbolInfoTick已经可以使用缓存,但某些公民一直在寻找一只黑猫。

一位市民 从他宽大的裤子上复制了 MQL代码,这表明在相同的条件下,拐杖的工作速度比普通函数快。

但你辩称,你的功能是好的,只是在使用条件上有限制。

而且在测试中甚至没有80%。有6个代理在4个核心上运行,即100%保证。

唯一的问题是他的系统的任务调度器是如何处理这种情况的。同时,有些人声称是终端的实施造成的。

也就是说,人为地制造了一种情况,当一台电脑超载到极限,一切都变慢了,然后以 "哦,看,为什么终端有时会滞后 "的形式提出一些主张。

6/8 - 没有什么是滞后的。浏览器、编译、调试等都是并行运行,没有任何滞后的迹象。

但现在我故意把所有的东西都关了,只留下4/8个代理。这种情况并没有因为你的功能制动而改变。

当然,更重要的是,我们希望HFT 在20个专家的旧办公室桌面或一个死的虚拟机上。

使用了一台快速机。而只有6个图表已经在给刹车了。

PS PositionSelectByTicket()在其实现中当然可以访问一个具有访问同步性的共享资源。而如果你不选择每一次看涨的位置,你就会读到旧的价格。通过SymbolInfoDouble来 "快照 "更容易。

我也用这个。

// Снепшот SymbolInfoTick для текущего символа.
bool SymbolInfoTick( MqlTick &Tick )
{
  static MqlTick PrevTick = {0};
  static ulong PrevTime = 0;
  
  const ulong NewTime = GetMicrosecondCount();
  const bool Res = (NewTime - PrevTime < 1000) || (::SymbolInfoTick(_Symbol, PrevTick) && (bool)(PrevTime = NewTime));
  
  Tick = PrevTick;
  
  return(Res);
}
 

当终端出现问题时,我们能谈及什么样的战斗性能速度。

专家顾问扫描所有的金融工具并搜索一个特定的模式。

它绊倒在一个符号上,并紧紧地挂着!!!。

代码来自帮助,我只写了步骤、有问题的金融工具和计时器。

//+------------------------------------------------------------------+ 
//|                                              TestLoadHistory.mq5 | 
//|                        Copyright 2009, MetaQuotes Software Corp. | 
//|                                              https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "2009, MetaQuotes Software Corp." 
#property link      "https://www.mql5.com" 
#property version   "1.02" 
#property script_show_inputs 
//--- input parameters 
input string          InpLoadedSymbol="RTSCHH1";   // Symbol to be load 
input ENUM_TIMEFRAMES InpLoadedPeriod=PERIOD_H1;  // Period to be load 
input datetime        InpStartDate=D'2006.01.01'; // Start date 
//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
   Print("Start load",InpLoadedSymbol+","+GetPeriodName(InpLoadedPeriod),"from",InpStartDate); 
//--- 
   int res=CheckLoadHistory(InpLoadedSymbol,InpLoadedPeriod,InpStartDate); 
   switch(res) 
     { 
      case -1 : Print("Unknown symbol ",InpLoadedSymbol);             break; 
      case -2 : Print("Requested bars more than max bars in chart "); break; 
      case -3 : Print("Program was stopped ");                        break; 
      case -4 : Print("Indicator shouldn't load its own data ");      break; 
      case -5 : Print("Load failed ");                                break; 
      case  0 : Print("Loaded OK ");                                  break; 
      case  1 : Print("Loaded previously ");                          break; 
      case  2 : Print("Loaded previously and built ");                break; 
      default : Print("Unknown result "); 
     } 
//--- 
   datetime first_date; 
   SeriesInfoInteger(InpLoadedSymbol,InpLoadedPeriod,SERIES_FIRSTDATE,first_date); 
   int bars=Bars(InpLoadedSymbol,InpLoadedPeriod); 
   Print("First date ",first_date," - ",bars," bars"); 
//--- 
  } 
//+------------------------------------------------------------------+ 
//|                                                                  | 
//+------------------------------------------------------------------+ 
int CheckLoadHistory(string symbol,ENUM_TIMEFRAMES period,datetime start_date) 
  { 
  Print(" === 1 === ");
   datetime first_date=0; 
   datetime times[100]; 
//--- check symbol & period 
   if(symbol==NULL || symbol=="") symbol=Symbol(); 
   if(period==PERIOD_CURRENT)     period=Period(); 
//--- check if symbol is selected in the MarketWatch 
   if(!SymbolInfoInteger(symbol,SYMBOL_SELECT)) 
     { 
      if(GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL) return(-1); 
      SymbolSelect(symbol,true); 
     } 
     
     ulong time = GetMicrosecondCount();
     Print(" === 2 === ",first_date);
//--- check if data is present 
  bool date = SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date); 
   
   Print(" === 2.1 === ",(time - GetMicrosecondCount()));
   
   if(first_date>0 && first_date<=start_date) return(1); 
//--- don't ask for load of its own data if it is an indicator 

Print(" === 2.2 === ");
   if(MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR && Period()==period && Symbol()==symbol) 
      return(-4); 
//--- second attempt 
Print(" === 2.3 === ");
   if(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_TERMINAL_FIRSTDATE,first_date)) 
     { 
      //--- there is loaded data to build timeseries 
      Print(" === 2.4 === ");
      if(first_date>0) 
        { 
         //--- force timeseries build 
         CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times); 
         //--- check date 
         Print(" === 2.5 === ");
         if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date)) 
            if(first_date>0 && first_date<=start_date) return(2); 
        } 
     } 
     
     Print(" === 3 === ");
     
//--- max bars in chart from terminal options 
   int max_bars=TerminalInfoInteger(TERMINAL_MAXBARS); 
//--- load symbol history info 
   datetime first_server_date=0; 
   while(!SeriesInfoInteger(symbol,PERIOD_M1,SERIES_SERVER_FIRSTDATE,first_server_date) && !IsStopped()) 
      Sleep(5); 
//--- fix start date for loading 

Print(" === 4 === ");


   if(first_server_date>start_date) start_date=first_server_date; 
   if(first_date>0 && first_date<first_server_date) 
      Print("Warning: first server date ",first_server_date," for ",symbol, 
            " does not match to first series date ",first_date); 
//--- load data step by step 

Print(" === 5 === ");

   int fail_cnt=0; 
   while(!IsStopped()) 
     { 
      //--- wait for timeseries build 
      while(!SeriesInfoInteger(symbol,period,SERIES_SYNCHRONIZED) && !IsStopped()) 
         Sleep(5); 
      //--- ask for built bars 
      int bars=Bars(symbol,period); 
      if(bars>0) 
        { 
         if(bars>=max_bars) return(-2); 
         //--- ask for first date 
         if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date)) 
            if(first_date>0 && first_date<=start_date) return(0); 
        } 
      //--- copying of next part forces data loading 
      int copied=CopyTime(symbol,period,bars,100,times); 
      if(copied>0) 
        { 
         //--- check for data 
         if(times[0]<=start_date)  return(0); 
         if(bars+copied>=max_bars) return(-2); 
         fail_cnt=0; 
        } 
      else 
        { 
         //--- no more than 100 failed attempts 
         fail_cnt++; 
         if(fail_cnt>=100) return(-5); 
         Sleep(10); 
        } 
     } 
     
     Print(" === 6 === ");
//--- stopped 
   return(-3); 
  } 
//+------------------------------------------------------------------+ 
//| Возвращает строкое значение периода                              | 
//+------------------------------------------------------------------+ 
string GetPeriodName(ENUM_TIMEFRAMES period) 
  { 
   if(period==PERIOD_CURRENT) period=Period(); 
//--- 
   switch(period) 
     { 
      case PERIOD_M1:  return("M1"); 
      case PERIOD_M2:  return("M2"); 
      case PERIOD_M3:  return("M3"); 
      case PERIOD_M4:  return("M4"); 
      case PERIOD_M5:  return("M5"); 
      case PERIOD_M6:  return("M6"); 
      case PERIOD_M10: return("M10"); 
      case PERIOD_M12: return("M12"); 
      case PERIOD_M15: return("M15"); 
      case PERIOD_M20: return("M20"); 
      case PERIOD_M30: return("M30"); 
      case PERIOD_H1:  return("H1"); 
      case PERIOD_H2:  return("H2"); 
      case PERIOD_H3:  return("H3"); 
      case PERIOD_H4:  return("H4"); 
      case PERIOD_H6:  return("H6"); 
      case PERIOD_H8:  return("H8"); 
      case PERIOD_H12: return("H12"); 
      case PERIOD_D1:  return("Daily"); 
      case PERIOD_W1:  return("Weekly"); 
      case PERIOD_MN1: return("Monthly"); 
     } 
//--- 
   return("unknown period"); 
  }

工作的结果。

2020.10.28 11:18:08.067 Test (FUTBRNJAN21,M1)   Start loadRTSCHH1,H1from2006.01.01 00:00:00
2020.10.28 11:18:08.067 Test (FUTBRNJAN21,M1)    === 1 === 
2020.10.28 11:18:08.067 Test (FUTBRNJAN21,M1)    === 2 === 1970.01.01 00:00:00
2020.10.28 11:22:01.741 Test (FUTBRNJAN21,M1)    === 2.1 === 18446744073475877138    Время выполнения SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date); 
2020.10.28 11:22:01.741 Test (FUTBRNJAN21,M1)    === 2.2 === 
2020.10.28 11:22:01.741 Test (FUTBRNJAN21,M1)    === 2.3 === 
2020.10.28 11:22:01.741 Test (FUTBRNJAN21,M1)    === 3 === 

我从来没有等过脚本运行完毕。

只要终端有这样的bug,没有战斗的执行是不可能的!!。

预计当一个证券进入市场审查时,至少它的所有属性和历史的开始日期会被拉出来。如果服务器上没有历史记录,那么

SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date)

应该立即返回NULL,为什么执行时间是18446744073475877138?


也许我不知道什么,CopyXXX功能也挂起了16-29秒!!!。

一个经纪人拥有3000-6000种金融工具是不正常的。

 
Vladimir Pastushak:

也许我不知道是什么,CopyXXX功能也挂了16-29秒!!。

一个经纪人拥有3000-6000种金融工具是不正常的。

酒吧是邪恶的。因此,请在另一个主题中发表关于他们的文章。

 
fxsaber:

酒吧是邪恶的。因此,请在另一个主题中发表关于他们的文章。

也许你知道如何以编程方式选择一个金融工具,而不至于被挂掉好长时间?

 
Vladimir Pastushak:

也许你知道如何以编程方式选择一个金融工具,而不至于被挂掉好长时间?

我还没有遇到过这样的任务。

 
Aleksey Vyazmikin:

fxsaber ,如果你在任务管理器中为代理设置一个低优先级,为MT5设置一个高优先级,会怎么样?

我找不到一个可以阻止向所有程序/操作系统线程分配特定CPU线程的工具,否则就有可能为MT5保留一个线程,并自动阻止其他程序占用它,这在理论上可以减少滞后。

将所有代理设置为最低优先级。

它不起作用。


ZZZ 运行的EA的数量会影响到结果。

 

尊敬的开发人员,请您告诉我MQL_MEMORY_USED是如何计算的?

我对所有EA变量所占用的内存进行了计算。

MQL_MEMORY_USED = 60 MB, Virtual = 3.40 MB ( 5.7%)

它不到10%。如果我理解正确的话,MQL_MEMORY_USED包括历史缓存和CopyTicks缓存。但还是少得多。

同时,并行专家顾问的消耗量要少几倍。但原则是一样的。

一般来说,这个数值包括什么?


我保存了一个带有专家顾问的模板,并通过导致重载将其应用于同一图表。我见过这样的情况。

MQL_MEMORY_USED = 7 MB, Virtual = 3.40 MB ( 48.6%)

内存使用量几乎改变了一个数量级。目前很难解释这意味着什么。