MT5和速度在行动 - 页 57

 
Renat Fatkhullin:

在大规模并行访问的情况下,速度提高了10倍。

对于其他情况,只有处理器、内存和操作系统的升级。

在PM中,来自同一台机器的比较性日志。

 
fxsaber:

这是对CopyTicks的一次性调用。这样做是为了在OnInit中对这些点位进行虚拟回测,然后在实时中继续进行,只提供新的点位。

作为一个折中方案,我建议在OnInit中调用CopyTicks后立即释放终端的内存。那么我们就不必为CopyTicks引入强制冷却功能。

现在,睡眠版的冷却是非常拐弯抹角的。但我在上面展示了这个拐杖是如何节省内存的。


现在事实证明,20个专家顾问即使在慢速VPS上也能快速运行。但启动它们是一个严重的问题。

不久前,你自己一直在进行压力测试,并要求在每一次打勾 时即时发出深层打勾。

也就是说,你和其他100%的开发者都应用了并将应用待定的全面缓存请求策略。每一次都有越来越多代价高昂、头破血流的专家被写入。

这就是为什么我们不会以任何方式废除缓存,而是建议将16-32GB的内存放在一起,并忘记问题和延迟。

在VPS上的行为和经济性(保持在512 mb-1 gb),我们完全不关心。

 
Renat Fatkhullin:

你自己不久前还在进行压力测试,事实上你要求在每一次打勾 要即时深打勾。

也就是说,你和其他100%的开发者都应用了并将应用待定的全面缓存请求策略。每一次都有越来越多代价高昂、头破血流的专家被写入。

这就是为什么我们不会以任何方式废除缓存,而是建议将16-32GB的内存放在一起,并忘记问题和延迟。

在VPS上的行为和经济性(以适应512 mb-1gb)我们完全不在乎。

上面用代码补充了我的帖子。这是关于OnInit的问题,而不是其他问题。热CopyTicks是非常需要的,但不是在OnInit中。

 
fxsaber:

作为一种妥协,我建议在OnInit中调用CopyTicks后,应立即在终端释放内存。

在任何情况下都不可能!
如果我在OnInit中提高缓存,以便在工作中不出现延迟呢?

最好是引入一个函数来卸载终端缓存。
不仅对ticks,而且对时间序列和指标也是必要的(尝试为5个工具和5个TF写一个5K)。

@雷纳特?

 
Andrey Khatimlianskii:

不可能!
如果我在OnInit中提高缓存,这样我就可以毫不迟疑地使用它了。

勾选缓存的寿命只有10秒。

 

如果你拿五个月的报价,嘀嗒历史 脚本筛选器(唯一在终端运行的软件)会吃掉6GB。

机器和互联网越快,内存负荷越大。也就是说,终端的内部缓存在10秒内积累到几个字符。

 
快速的机器,九个顾问。
2020.10.19 22:32:06.965         Bench_Stack = 3, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 1229 mcs.
2020.10.19 22:33:23.727         Bench_Stack = 3, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 1250 mcs.
2020.10.19 22:34:29.802         Bench_Stack = 3, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 1281 mcs.
2020.10.19 22:35:58.747         Bench_Stack = 2, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 1164 mcs.
2020.10.19 22:37:20.196         Bench_Stack = 3, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 1045 mcs.
2020.10.19 22:38:24.920         Bench_Stack = 3, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 1907 mcs.
2020.10.19 22:39:48.359         Bench_Stack = 3, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 1387 mcs.
2020.10.19 22:40:03.623         Bench_Stack = 3, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 1302 mcs.
2020.10.19 22:40:44.569         Bench_Stack = 3, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 1271 mcs.
2020.10.19 22:41:09.393         Bench_Stack = 3, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 1482 mcs.
2020.10.19 22:41:19.831         Bench_Stack = 3, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 1024 mcs.
2020.10.19 22:41:19.975         Alert: Bench_Stack = 3, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 8026 mcs.
2020.10.19 22:41:50.137         Bench_Stack = 2, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 1040 mcs.
2020.10.19 22:42:05.876         Bench_Stack = 2, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 1346 mcs.
2020.10.19 22:43:21.478         Bench_Stack = 3, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 1523 mcs.
2020.10.19 22:43:21.557         Bench_Stack = 3, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 1245 mcs.
2020.10.19 22:43:21.843         Alert: Bench_Stack = 3, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 4675 mcs.
2020.10.19 22:43:21.854         Alert: Bench_Stack = 3, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 7567 mcs.
2020.10.19 22:44:01.181         Bench_Stack = 3, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 1052 mcs.
2020.10.19 22:44:33.124         Bench_Stack = 3, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 2714 mcs.
2020.10.19 22:44:54.967         Alert: Bench_Stack = 3, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 13626 mcs.
2020.10.19 22:45:07.561         Bench_Stack = 3, 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: ::SymbolInfoTick(_Symbol,Tick)] = 2800 mcs.
我不知道如何克服这种滞后。我想不出有什么其他方法可以在OnTick运行时知道是否有一个新的tick。
 
fxsaber:
我想不出有什么其他方法可以在OnTick运行时知道有一个新的tick

三个选项。

// Идентификация нового тика
bool IsNewTick_CopyRates()
{
  static MqlRates PrevRates = {0};
  MqlRates Rates[1];
    
  const bool Res = (::CopyRates(_Symbol, PERIOD_CURRENT, 0, 1, Rates) == 1) &&
//                   (_R(PrevRates) != Rates[0]); // TypeToBytes.mqh
                   ((Rates[0].time != PrevRates.time) ||
                    (Rates[0].tick_volume > PrevRates.tick_volume) ||
                    (Rates[0].close != PrevRates.close)); // Лишнее условие, но на всякий случай.
                   
  if (Res)
    PrevRates = Rates[0];
    
  return(Res);
}

// Идентификация нового тика
bool IsNewTick_SymbolInfoTick()
{
  static MqlTick PrevTick = {0};
  MqlTick Tick;
  
  const bool Res = ::SymbolInfoTick(_Symbol, Tick) &&
//                   (_R(PrevTick) != Tick); // TypeToBytes.mqh
                   ((PrevTick.time_msc != Tick.time_msc) ||
                    (PrevTick.bid != Tick.bid) ||
                    (PrevTick.ask != Tick.ask));
                   
  if (Res)
    PrevTick = Tick;
    
  return(Res);
}

// Идентификация нового тика
bool IsNewTick_CopyTicks()
{
  static MqlTick PrevTick = {0};
  MqlTick Tick[1];
  
  const bool Res = (::CopyTicks(_Symbol, Tick, COPY_TICKS_ALL, 0, 1) == 1) &&
//                   (_R(PrevTick) != Tick[0]); // TypeToBytes.mqh
                   ((PrevTick.time_msc != Tick[0].time_msc) ||
                    (PrevTick.bid != Tick[0].bid) ||
                    (PrevTick.ask != Tick[0].ask));
                   
  if (Res)
    PrevTick = Tick[0];
    
  return(Res);
}

#define  PRINT(A)            \
  if (!A)                   \
    Print(#A + " = false");


void OnTick()
{
  PRINT(IsNewTick_CopyTicks());      // true
  PRINT(IsNewTick_SymbolInfoTick()); // true
  PRINT(IsNewTick_CopyRates())       // false
}

最好不要通过条形图来确定一个新的勾股。

 
它变得很清楚,CopyTicks可以滞后于SymbolInfoTick多久。
// Замер длительности синхронизации CopyTicks и SymbolInfoTick.

#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

bool IsSynch()
{
  MqlTick Tick;
  MqlTick Ticks[1];
  
  return(SymbolInfoTick(_Symbol, Tick) && (CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, 0, 1) == 1) && (_R(Tick) == Ticks[0]));
}

ulong WaitSynch( int &Count )
{
  while (!IsStopped() && IsSynch())
    Sleep(0);
    
  const ulong StartTime = GetMicrosecondCount();
  Count = 0;
  
  while (!IsStopped() && !IsSynch())
    Count++;
    
  return(GetMicrosecondCount() - StartTime);
}

void OnTick()
{
  int Count;
  const uint StartTime = GetTickCount();

  while (GetTickCount() - StartTime < 10000)
    Print("Cинхронизация CopyTicks и SymbolInfoTick длилась " + (string)(WaitSynch(Count) / 1000)  + " ms., число проверок = " + (string)Count);
}


结果(inAmount = 15)。

2020.10.20 00:32:46.316 Test9 (GBPAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 163 ms., число попыток = 391432
2020.10.20 00:32:46.894 Test9 (GBPAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 221 ms., число попыток = 526533
2020.10.20 00:32:50.839 Test9 (GBPAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 69 ms., число попыток = 112339
2020.10.20 00:32:50.839 Test9 (EURAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 385 ms., число попыток = 837204
2020.10.20 00:32:51.958 Test9 (EURAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 74 ms., число попыток = 166407
2020.10.20 00:32:52.044 Test9 (EURAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 80 ms., число попыток = 180256
2020.10.20 00:32:52.797 Test9 (EURAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 737 ms., число попыток = 1469883
2020.10.20 00:33:04.229 Test9 (EURAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 8550 ms., число попыток = 14608891
2020.10.20 00:33:04.319 Test9 (GBPAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 159 ms., число попыток = 150630
2020.10.20 00:33:04.324 Test9 (AUDCHF,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 85 ms., число попыток = 78591
2020.10.20 00:33:07.340 Test9 (EURAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 2947 ms., число попыток = 4899320
2020.10.20 00:33:08.076 Test9 (EURAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 727 ms., число попыток = 1209371
2020.10.20 00:33:08.138 Test9 (EURAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 55 ms., число попыток = 73155
2020.10.20 00:33:14.233 Test9 (EURCAD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 107 ms., число попыток = 149697
2020.10.20 00:33:15.985 Test9 (EURCAD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 190 ms., число попыток = 230501
2020.10.20 00:33:16.114 Test9 (GBPJPY,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 208 ms., число попыток = 275639
2020.10.20 00:33:41.328 Test9 (GBPJPY,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 9457 ms., число попыток = 14426849
2020.10.20 00:33:46.000 Test9 (GBPCHF,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 53622 ms., число попыток = 109127013
2020.10.20 00:33:47.936 Test9 (GBPJPY,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 1302 ms., число попыток = 3104323
2020.10.20 00:33:55.715 Test9 (GBPAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 59 ms., число попыток = 87263
2020.10.20 00:33:55.776 Test9 (GBPJPY,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 88 ms., число попыток = 125641
2020.10.20 00:33:55.869 Test9 (GBPJPY,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 86 ms., число попыток = 140282
2020.10.20 00:33:55.974 Test9 (GBPJPY,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 95 ms., число попыток = 91802
2020.10.20 00:33:56.004 Test9 (GBPAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 125 ms., число попыток = 127590
2020.10.20 00:33:56.202 Test9 (GBPJPY,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 214 ms., число попыток = 311277
2020.10.20 00:34:40.522 Test9 (GBPAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 31 ms., число попыток = 48189
2020.10.20 00:34:40.672 Test9 (GBPAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 69 ms., число попыток = 99619
2020.10.20 00:34:41.094 Test9 (GBPAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 412 ms., число попыток = 613382
2020.10.20 00:34:41.864 Test9 (GBPAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 768 ms., число попыток = 1136798
2020.10.20 00:34:46.035 Test9 (GBPAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 2012 ms., число попыток = 2955715
2020.10.20 00:34:46.124 Test9 (GBPAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 79 ms., число попыток = 109796
2020.10.20 00:34:46.239 Test9 (GBPAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 98 ms., число попыток = 152433
2020.10.20 00:34:47.261 Test9 (GBPAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 1009 ms., число попыток = 1300923
2020.10.20 00:34:47.337 Test9 (GBPAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 73 ms., число попыток = 66414
2020.10.20 00:34:47.850 Test9 (AUDCHF,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 885 ms., число попыток = 832072
2020.10.20 00:34:48.383 Test9 (GBPAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 1040 ms., число попыток = 1239140
2020.10.20 00:34:49.093 Test9 (EURCAD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 46 ms., число попыток = 43232
2020.10.20 00:34:49.839 Test9 (GBPAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 1445 ms., число попыток = 2065046
2020.10.20 00:34:51.474 Test9 (GBPCHF,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 55801 ms., число попыток = 119517920
2020.10.20 00:34:51.755 Test9 (GBPAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 1498 ms., число попыток = 1625714
2020.10.20 00:34:52.269 Test9 (GBPJPY,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 403 ms., число попыток = 693015
2020.10.20 00:34:59.175 Test9 (AUDCAD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 9413 ms., число попыток = 16211601
2020.10.20 00:35:00.398 Test9 (EURAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 6302 ms., число попыток = 11626079
2020.10.20 00:35:05.587 Test9 (AUDCHF,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 3645 ms., число попыток = 8637511
2020.10.20 00:35:07.247 Test9 (EURAUD,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 133 ms., число попыток = 205326
2020.10.20 00:35:09.033 Test9 (AUDCHF,H1)       Cинхронизация CopyTicks и SymbolInfoTick длилась 3427 ms., число попыток = 8060967

解除同步化可持续一分钟。某处有一个错误。

 

SymbolInfoTick刹车的原因似乎是平行处理。

// Демонстрация тормозов SymbolInfoTick
#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

void OnTick()
{
  const uint StartTime = GetTickCount();

  while (!IsStopped() && (GetTickCount() - StartTime < 10000))
  {
    _B(SymbolInfoInteger(_Symbol, SYMBOL_TIME_MSC), 100000);
    
//    Sleep(0); // Специально убрал.
  }
}


结果(inAmount = 15)。

2020.10.20 01:01:30.517 Test9 (EURAUD,H1)       Alert: Bench_Stack = 0, 100000 <= Time[Test9.mq5 97 in OnTick: SymbolInfoInteger(_Symbol,SYMBOL_TIME_MSC)] = 105941 mcs.
2020.10.20 01:01:37.596 Test9 (USDCAD,H1)       Alert: Bench_Stack = 0, 100000 <= Time[Test9.mq5 97 in OnTick: SymbolInfoInteger(_Symbol,SYMBOL_TIME_MSC)] = 103045 mcs.
2020.10.20 01:01:38.968 Test9 (EURCHF,H1)       Alert: Bench_Stack = 0, 100000 <= Time[Test9.mq5 97 in OnTick: SymbolInfoInteger(_Symbol,SYMBOL_TIME_MSC)] = 103305 mcs.
2020.10.20 01:01:41.307 Test9 (EURUSD,H1)       Alert: Bench_Stack = 0, 100000 <= Time[Test9.mq5 97 in OnTick: SymbolInfoInteger(_Symbol,SYMBOL_TIME_MSC)] = 106121 mcs.
2020.10.20 01:01:42.573 Test9 (USDCAD,H1)       Alert: Bench_Stack = 0, 100000 <= Time[Test9.mq5 97 in OnTick: SymbolInfoInteger(_Symbol,SYMBOL_TIME_MSC)] = 128241 mcs.
2020.10.20 01:01:45.175 Test9 (GBPCHF,H1)       Alert: Bench_Stack = 0, 100000 <= Time[Test9.mq5 97 in OnTick: SymbolInfoInteger(_Symbol,SYMBOL_TIME_MSC)] = 120367 mcs.
2020.10.20 01:01:46.394 Test9 (EURCHF,H1)       Alert: Bench_Stack = 0, 100000 <= Time[Test9.mq5 97 in OnTick: SymbolInfoInteger(_Symbol,SYMBOL_TIME_MSC)] = 104458 mcs.
2020.10.20 01:01:57.832 Test9 (GBPCHF,H1)       Alert: Bench_Stack = 0, 100000 <= Time[Test9.mq5 97 in OnTick: SymbolInfoInteger(_Symbol,SYMBOL_TIME_MSC)] = 125348 mcs.

> 对于SymbolInfoTick的执行,大于100ms。很明显,代码是自拍的。但它显示了在通常的EA中速度变慢的原因。