MT5和速度在行动 - 页 56

 
Renat Akhtyamov:
绅士们的进步...
首先阅读计算机中的内存分配,然后是如何和通过什么方式进行分配,然后是如何清理和读出和读入,并不困难。至少可以向开发商提出更合理的建议

你在MT4上不知道吗?
你自己使用预定义的Ask Bid?
在mt5的整个MqlTick结构 中,由于某种原因,它们被丢失了。
调用函数,填充结构,然后才得到值。
还是立即得到价值,有什么区别吗?

或者它不是在我的方向?
你至少应该说明你是写给谁的))。

 
Roman:

预先定义的变量,对于当前的勾股,可能会更好。

开发商以前曾解释过,直接进入有一个基本限制

void f()
{
        MqlTick t1 = _Tick;
        MqlTick t2 = _Tick;
}

而且一般来说,t1不等于t2。此外,t1和t2中的字段值最终可能指的是不同的ticks。

 
A100:

开发商以前曾解释过,直接进入有一个基本限制

而一般来说,t1不等于t2。此外,t1和t2里面的字段值可以指向不同的tick,尽管它们是链接字段(它们应该指向同一个tick)。

Brr,基本限制是什么?
你的例子中的结构是不必要的,它不需要被填充。

一个值来自套接字,并根据结构被写入变量_Ask, _Bid等。
_Ask != _Ask according to you?
如果你填充结构,就会出现限制,这需要一些时间。
你不需要填写,而是直接给出_Ask、_Bid等

 
Roman:

Brr,原则限制是什么?
你的例子中的结构在这里是不必要的,它不需要被填入。

void f()
{
        double ask1 = _Ask;
        double ask2 = _Ask;
}

你可以在没有结构的情况下重写它。在一般情况下,ask1不等于ask2

 
A100:

你也可以在没有结构的情况下重写它。在一般情况下,ask1不等于ask2

也就是说,这些是对非同步环境的请求,而响应是由环境的当前状态接收的?而OnTick是抓取当前的tick并制定EA,但同时通过tick结构要求EA在制定时可以从下一个tick中得到答案?

 
A100:

你也可以在没有结构的情况下重写它。一般来说,ask1不等于ask2

所以你不必使用100500位数字,其中实数的最后一位数字相差0.0000000000000000000001
对于每个变量都有不同的数字,对于价格双倍最大8。

 
Renat Fatkhullin:

发布了第2652号测试版,具有重要意义。

  • 改进了编译中断(22%)。
  • 大大加快了SymbolInfoTick的访问速度。

22%良好。

SymbolInfoTick- 在我的家用机器上,我用眼睛注意到它没有发出警报。然而,在日志中对这些警报进行了过滤,看到比24小时前同一时期发出的2650个警报要多很多。

将两份日志都发给了PM。

 
Valeriy Yastremskiy:

也就是说,这些是对非同步环境的请求,而响应是基于环境的当前状态?而OnTick是捕捉当前的tick并制定EA,但EA在制定时由tick结构提出的请求可以从下一个tick中得到答案?

是的。

 
Renat Fatkhullin:

对于大规模的勾股工作,要放入更多的内存。

在2020年,当涉及到分析和研究时,4gb(价格为20欧元)远远不够好。

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

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

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


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


这里有一个专家顾问,显示了这个问题。

// Демонстрация 10-ти секундного удержания в памяти ненужных данных CopyTicks.
#define  PRINT(A) Print(#A + " = " + (string)(A))

input datetime inFrom = D'2020.06.01'; // С какой даты анализировать историю

int OnInit()
{
  MqlTick Ticks[];
  
  Print("Before CopyTicks:");
  PRINT(MQLInfoInteger(MQL_MEMORY_USED));     
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
  
  PRINT(CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, (long)inFrom * 1000));
  ArrayFree(Ticks);
  
  Print("After CopyTicks:");
  
  for (int i = 0; i < 10; i++)
  {
    PRINT(i);
    PRINT(MQLInfoInteger(MQL_MEMORY_USED));    
    PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
    
    Sleep(1000);
  }
  
  return(INIT_FAILED);
}


结果。

2020.10.14 08:49:24.016 Before CopyTicks:
2020.10.14 08:49:24.016 MQLInfoInteger(MQL_MEMORY_USED) = 0
2020.10.14 08:49:24.031 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 864
2020.10.14 08:49:25.399 CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 14372119
2020.10.14 08:49:25.465 After CopyTicks:
2020.10.14 08:49:25.465 i = 0
2020.10.14 08:49:25.465 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:25.499 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:26.594 i = 1
2020.10.14 08:49:26.594 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:26.630 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:27.729 i = 2
2020.10.14 08:49:27.729 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:27.762 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:28.852 i = 3
2020.10.14 08:49:28.852 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:28.884 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:29.977 i = 4
2020.10.14 08:49:29.977 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:30.009 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:31.102 i = 5
2020.10.14 08:49:31.102 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:31.136 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:32.224 i = 6
2020.10.14 08:49:32.225 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:32.257 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:33.348 i = 7
2020.10.14 08:49:33.348 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:33.381 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:34.468 i = 8
2020.10.14 08:49:34.468 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:34.501 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:35.593 i = 9
2020.10.14 08:49:35.593 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:35.605 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 860
 
fxsaber:

22% - 很好。

SymbolInfoTick - 在家用机上,我用眼睛注意到没有警报。然而,在日志中对这些警报进行了过滤,看到比24小时前同一时期发出的2650个警报要多很多。

将两份日志都发给了PM。

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

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