MT5和速度在行动 - 页 54

 
Roman:

好吧,让我重新表述一下。在mql之内大致是可以的,这取决于处理器的时钟频率。
那PWM呢?-一个恒定频率和可变占空比的脉冲信号。
它不是设置了一个常数吗?

首先,阅读什么是WinAPI睡眠 函数,以及它的实际作用

PS Windows不是一个实时系统

 
Slava:

首先,阅读一下什么是WinAPI睡眠函数以及它的实际作用

PS Windows不是一个实时系统

咳,WinAPI睡眠与此有什么关系?
当我们谈论微秒级的滑移
,对于你的处理器来说,你可以确定定时器的频率并计算出重复的次数。
所以,你可以在mql中写你自己的MicrosecondCount,但是有什么意义呢?标准的就够了。

MT5 и скорость в боевом исполнении
MT5 и скорость в боевом исполнении
  • 2020.10.10
  • www.mql5.com
MT5 - шустрая платформа. Но есть узкие горлышки, которые сводят на нет все старания быстрой торговли...
 
Roman:

咳咳,我不好意思问,WinAPI睡眠与此有什么关系?
当我们在谈论微秒级的滑移
,单独来说,对于你的处理器,你可以定义定时器的频率并计算出重复次数。
所以,你可以在mql中写你自己的MicrosecondCount,但是有什么意义呢?标准的就够了。

在没有上下文切换的情况下,你自己的待办事项将100%地吃掉你的核心。

这是一种令人毛骨悚然的编程方法。上帝不允许这样的代码泄露到市场中。

 
Renat Fatkhullin:

在没有上下文切换的情况下,你的等待滑移将100%地吃掉你的核心。

这是一种可怕的编程方法。上帝不允许这样的代码泄露到市场中。

也没有人否认这个硬骨头 ))
如果你展示一个上下文切换的例子,也许你可以改进?

这是µsSLEEP(µsRange)的CPU负载,在VirtualBox上,只有2个核心,4个线程。
矿工做的比这更糟糕 ))

cp

 

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

图书馆: 序列

fxsaber, 2020.10.13 12:54

一个将杀死大多数VPS的EA的例子。
#include <fxsaber\Sequence.mqh> // https://www.mql5.com/ru/code/31446

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

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

void OnInit()
{
  SEQUENCE Sequence; // Последовательный запуск расчетов
  
//  if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.
  {
    MqlTick Ticks[];
    
    PRINT(CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, (long)inFrom * 1000));
    PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
    
    Sleep(10000); // Ждем освобождения CopyTicks-данных.
  }
}


我正在几个不同符号的图表上运行它。我使用这个脚本inAmount = 5 来自动完成这个动作。


结果。

2020.10.13 13:26:53.199 Test9 (AUDCAD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5406953
2020.10.13 13:26:53.326 Test9 (AUDCAD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 2838
2020.10.13 13:26:53.528 Test9 (EURCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 3430958
2020.10.13 13:26:53.807 Test9 (EURCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3144
2020.10.13 13:26:53.924 Test9 (EURUSD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4244747
2020.10.13 13:26:54.214 Test9 (EURUSD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3464
2020.10.13 13:26:54.344 Test9 (AUDCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4327679
2020.10.13 13:26:54.702 Test9 (AUDCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3797
2020.10.13 13:26:54.864 Test9 (GBPCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5340006
2020.10.13 13:26:55.457 Test9 (GBPCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 4308
2020.10.13 13:26:55.666 Test9 (EURAUD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 7730155
2020.10.13 13:26:55.756 Test9 (EURAUD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 4316

终端需要超过4Gb的内存来运行这六个专家顾问系统。请注意,它只需要用于初始化,而不是用于这些EA的操作。想象一下,你启动终端时,Expert Advisors在其中晃来晃去。如果你没有诚实的4Gb的可用内存--这几乎是一场灾难。


现在让我们删除源代码中这一行的注释。

  if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.

因此,我们已经启用了专家顾问的顺序初始化。


让我们看一下结果(重新编译后)。

2020.10.13 13:27:24.002 Test9 (AUDCAD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5406980
2020.10.13 13:27:24.021 Test9 (AUDCAD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1234
2020.10.13 13:27:35.407 Test9 (EURUSD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4244772
2020.10.13 13:27:35.422 Test9 (EURUSD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1095
2020.10.13 13:27:46.886 Test9 (GBPCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5340072
2020.10.13 13:27:46.905 Test9 (GBPCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1224
2020.10.13 13:27:58.293 Test9 (AUDCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4327724
2020.10.13 13:27:58.310 Test9 (AUDCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1114
2020.10.13 13:28:09.683 Test9 (EURCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 3430999
2020.10.13 13:28:09.696 Test9 (EURCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1015
2020.10.13 13:28:21.339 Test9 (EURAUD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 7730313
2020.10.13 13:28:21.363 Test9 (EURAUD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1519


在启动专家顾问系统时,我们已经设法将终端内存消耗减少了2.5Gb以上。VPS崩溃的概率(和薄弱的家庭电脑)已经大大降低。


这就是这两个运行的动态变化情况。

顺序启动拉长了整体初始化的时间,但设法使终端不消耗大量的RAM。


上图和下图清楚地显示了并行的初始化过程(左边的高峰)和六个连续的初始化过程(中间的六个高峰)


SZY 在实验过程中,发现了一个与 "睡眠 "有关的令人不快的细微差别--见源代码。


我要求在使用CopyTicks后以某种方式允许强制释放内存。而不是制造这样的睡眠拐杖。

 
请推荐一种最便宜的消耗内存的方式来查询给定时间间隔内的tick历史。
 
fxsaber:
请推荐最便宜的方式来要求在给定的时间间隔内的蜱虫历史。

在我听来,你不是在寻找一个便宜的,而是一个快速释放内存的方法。

作为一个选项来检查。

- 将动态数组MqlTick Ticks[]包裹在类中,用new创建对象(即也是动态对象),当你不需要它时,就删除它

- 相同的,但有结构,但在本地范围内(或函数或本地块{ } - 或循环与一个迭代?),结构不像类那样好用--我重写了大部分的EA代码,远离了类,用数据结构代替了它们,优化速度明显提高--也许这是一种主观效果--也许新的构建更快。

- 试着在析构器中加入ArrayFree()。

 
Igor Makanu:

我认为你不是在寻找一个便宜的,而是一个快速释放内存的方法。

终端不会释放内存。MQL变量与此毫无关系。

 
fxsaber:

终端没有释放内存。MQL变量与此毫无关系。

如果你强制大小=1呢?

如果你做了什么^

MqlTick  Tick[];
MqlTick  ZeroTick[1] = {0};
.....
ArrayResize(Tick,1);
ArrayCopy(Tick,ZeroTick)
 
Igor Makanu:

而如果

调用CopyTicks后,终端在内存中保留所有数据几秒钟。以防有人想重读一段蜱虫的历史

也就是说,终端如此消耗的内存量不取决于MQL变量的大小。


任务是迫使终端机释放内存。