mql5语言的特点、微妙之处以及技巧 - 页 101

 
fxsaber:

结果

是的,没有考虑到睡眠的 内部运作,在我的电脑上,睡眠 需要大约4ms。

睡眠的一个很好的替代方案(谁在乎准确度呢:)是

void sleep(int m)
  {
   if(m>0) Sleep(int(0.995*m+0.5)-1);
  }

我不能保证0.995的准确性。我为我自己的电脑挑选了它。它可能适合所有人。

附加的文件:
TestSleep.mq5  1 kb
 
fxsaber:

老实说,我甚至不知道它是什么意思,也不知道在MQL5中哪里可以遇到它。

这意味着在任何情况下都有可能出现尖峰,甚至在同步功能中。你只需要意识到它们,不要注意它们,因为你对此无能为力。

https://en.wikipedia.org/wiki/Interrupt
Interrupt - Wikipedia
Interrupt - Wikipedia
  • en.wikipedia.org
This article is about computer interrupts. For the study of the effect of disruptions on job performance, see Interruption science. For other uses, see Interruption. In system programming, an interrupt is a signal to the processor emitted by hardware or software indicating an event that needs immediate attention. An interrupt alerts the...
 

除了文件和全局变量之外,还有一种在程序之间传输信息 的方式

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

图书馆:TradeTransactions

fxsaber, 2018.09.20 16:23

// Пример хранения/обмена данными через Ресурсы внутри Терминала
#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/code/22166

void OnStart()
{  
  const RESOURCEDATA<int> ResourceINT("::int"); // Ресурс для обмена int-ами. const - как доказательство, что ничего не пишется в объект класса
  
  int ArrayINT[] = {1, 2, 3};
  int Num = 5;
  
  ResourceINT = ArrayINT;  // Ресурс хранит массив.
  ResourceINT += Num;      // Добавили в ресурс еще значение.
  ResourceINT += ArrayINT; // Добавили массив.
  
  int ArrayINT2[];  
  ResourceINT.Get(ArrayINT2); // Считали данные из ресурса.
  ArrayPrint(ArrayINT2);      // Вывели: 1 2 3 5 1 2 3

  ResourceINT.Free();                // Удалили данные из ресурса
  Print(ResourceINT.Get(ArrayINT2)); // Убедились, что данных нет: 0

  const RESOURCEDATA<MqlTick> ResourceTicks("::Ticks"); // Ресурс для обмена тиками. const - как доказательство, что ничего не пишется в объект класса
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
    for (int i = 0; i < 3; i++)
      ResourceTicks += Tick; // Добавили в ресурс тики

  MqlTick Ticks[];
  ResourceTicks.Get(Ticks); // Считали данные из ресурса.
  ArrayPrint(Ticks);        // Вывели.
  
  // Это полное имя ресурса для обращения из другой программы
  const string NameOut = StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_PATH)) + 5) + "::Ticks";  
  Print(NameOut); // Вывели полное имя ресурса.
  
  const RESOURCEDATA<MqlTick> Resource(NameOut); // Ресурс для доступа к данным (read-only) из другой программы
  
  MqlTick TicksOut[];
  Resource.Get(TicksOut); // Считали данные из ресурса.
  ArrayPrint(TicksOut);   // Вывели.
  
  Resource.Free();   // Не получится повлиять на данные read-only-ресурса.
  Print(_LastError); // ERR_INVALID_PARAMETER - Ошибочный параметр при вызове системной функции.
}
 
fxsaber:

除了文件和全局变量外,还有一种在程序之间传输信息 的方式

我们谈论的是单个运行终端内的程序,不是吗?

 
尼古拉-森科

我们谈论的是单一运行终端内的程序,不是吗?

是的,这就是提到全局变量 的原因。

而终端之间开始使用这种方式
 
fxsaber:

是的,这就是提到全局变量 的原因。

而终端之间开始使用这种方式

是的,这真的很酷!
非常酷的发现,使用RAM磁盘而不是SSD。

 
fxsaber:

是的,这就是提到全局变量 的原因。

我开始在终端之间使用这种 方式。

我一直在使用这样一种简单的半黑客方法,使用user32.dll已经很长时间了。但是,不可能以这种方式传递刻度线的数组。

很久以前,我在掌握MQL4时发明了它。当然,就合理组织交流而言,这不是最短的解决方案,但它速度快,效果好(也许比所有现有的解决方案都快),这就是我没有再绞尽脑汁的原因。

此外,这种方法不需要任何额外的行动。

问题是,对于整个Windows来说,有一个字符串类型的共同变量--主Windows窗口的名称。所有人都能改变它,每个人都能看到它。

附加的文件:
 
尼古拉-森科

我一直在使用这样一种简单的半黑客方法,使用user32.dll,已经很久了。但你不能以这种方式转移打勾数组。

如果通过dll,对所有数据类型都有一个通用的解决方案

 
尼古拉-森科

但它的速度很快(可能比所有现有的解决方案都快)。

好吧,你说得太远了 ) 首先,它要经过消息队列。第二,你必须做一些额外的转换(来回)。另外,还有一些验证工作正在进行。

顺便说一下,你不应该明确指定结构的大小。这就是sizeof的作用。

 
fxsaber:

如果通过dll,对所有数据类型都有一个通用的解决方案

我不是在争论。你的解决方案确实比较普遍。
但就我个人而言,我只需要在终端之间进行桥接来传输电流。

我的变体只是由于其原始性而更容易理解,而且工作起来更快一点。我测量了它与你的对比,它的速度是你的1.5-2倍。一个tick的读取时间是90微秒,而160微秒。

附加的文件: