Características del lenguaje mql5, sutilezas y técnicas - página 101

 
fxsaber:

Resultado

Sí, no se tuvo en cuenta el trabajo interno del Sleep, que en mi ordenador tarda unos 4ms.

Una buena alternativa a Sleep (a quien le importa la precisión :)) es

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

No puedo garantizar la precisión de 0,995. Lo cogí para mi propio ordenador. Puede ser adecuado para todos.

Archivos adjuntos:
TestSleep.mq5  1 kb
 
fxsaber:

Sinceramente, no sé ni lo que significa ni en qué parte de MQL5 se puede encontrar.

Esto significa que los picos son posibles en cualquier situación, incluso en las funciones sincrónicas. Sólo tienes que ser consciente de ellos y no prestarles atención, ya que no puedes hacer nada al respecto.

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...
 

Además de los archivos y las variables globales, existe otra forma de transferir información entre programas

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Bibliotecas: 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:

Además de los archivos y las variables globales, existe otra forma de transferir información entre programas

Estamos hablando de programas dentro de un mismo terminal en funcionamiento, ¿no es así?

 
Nikolai Semko:

Estamos hablando de programas dentro de un mismo terminal en funcionamiento, ¿no es así?

Sí, por eso se mencionan las variables globales.

Y entre las terminales se empezó a utilizar esta vía.
 
fxsaber:

Sí, por eso se mencionan las variables globales.

Y entre las Terminales se empezó a utilizar esta vía.

Sí, es realmente genial.
Un hallazgo muy chulo usar discos RAM en lugar de SSD.

 
fxsaber:

Sí, por eso se mencionan las variables globales.

Empecé a utilizar esta forma entre terminales.

Llevo mucho tiempo utilizando un método semi-hacker tan fácil como el de user32.dll. Pero es imposible pasar arrays de ticks de esta manera.

Lo inventé hace mucho tiempo cuando dominaba el MQL4. Por supuesto, no es la solución más corta en términos de organización razonable del intercambio, pero es rápida y funciona bien (quizás más rápida que todas las soluciones existentes), por eso no me he devanado más los sesos.

Además, este método no requiere ninguna acción adicional.

El punto es que para todo Windows es una variable común de tipo cadena - nombre de la ventana principal de Windows. Todos pueden cambiarlo y todos pueden verlo.

Archivos adjuntos:
 
Nikolai Semko:

Llevo mucho tiempo utilizando un método semi-hacker tan fácil como este, utilizando user32.dll. Pero no se pueden transferir matrices de garrapatas de esta manera.

Si a través de dll, hay una solución universal para todos los tipos de datos.

 
Nikolai Semko:

Pero es rápido (probablemente más rápido que todas las soluciones existentes)

Bueno, estás yendo demasiado lejos ) En primer lugar, pasa por la cola de mensajes. En segundo lugar, hay que hacer algunas conversiones adicionales (de ida y vuelta). Además, hay una validación en marcha.

Por cierto, no debes especificar el tamaño de la estructura explícitamente. Para eso está sizeof.

 
fxsaber:

Si a través de dll, hay una solución universal para todos los tipos de datos.

No estoy discutiendo. Su solución es realmente más universal.
Pero personalmente sólo necesito un puente entre los terminales para transferir la corriente.

Mi variante es simplemente más fácil de entender debido a su primitivismo y funciona un poco más rápido. Lo he medido en comparación con el tuyo y es 1,5 - 2 veces más rápido. El tiempo de lectura de un tick es de 90 microsegundos frente a 160 microsegundos.

Archivos adjuntos: