Características da linguagem mql5, subtilezas e técnicas - página 101

 
fxsaber:

Resultado

Sim, não levou em conta o funcionamento interno do Sleep, que no meu computador leva cerca de 4ms.

Uma boa alternativa ao sono (quem se preocupa com a precisão :)) é

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

Não posso garantir a precisão de 0,995. Apanhei-o para o meu próprio computador. Pode ser adequado para todos.

Arquivos anexados:
TestSleep.mq5  1 kb
 
fxsaber:

Sinceramente, nem sei o que significa e onde na MQL5 se pode encontrá-lo.

Isso significa que os picos são possíveis em qualquer situação, mesmo em funções síncronas. Você só precisa estar ciente deles e não prestar atenção a eles, pois não há nada que você possa fazer a respeito.

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

Além de arquivos e variáveis globais, há outra forma de transferir informações entre programas

Fórum sobre negociação, sistemas de negociação automatizados e testes estratégicos

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:

Além de arquivos e variáveis globais, há outra forma de transferir informações entre programas

Estamos a falar de programas dentro de um único terminal em funcionamento, não estamos?

 
Nikolai Semko:

Estamos a falar de programas dentro de um único terminal em funcionamento, não estamos?

Sim. É por isso que as variáveis globais são mencionadas.

E entre Terminais começou a ser usado desta forma.
 
fxsaber:

Sim. É por isso que as variáveis globais são mencionadas.

E entre Terminais começou a usar desta maneira.

Sim, é muito fixe!
Achado muito legal usando discos RAM em vez de SSDs.

 
fxsaber:

Sim. É por isso que as variáveis globais são mencionadas.

Comecei a usar este caminho entre terminais.

Eu tenho usado um método tão fácil de semi-hacker usando o user32.dll por um longo tempo. Mas é impossível passar conjuntos de carraças desta maneira.

Inventei-o há muito tempo quando estava a dominar a MQL4. É claro que não é a solução mais curta em termos de organização razoável da troca, mas é rápida e funciona bem (talvez mais rápida do que todas as soluções existentes), por isso é que não tenho mais a cabeça rachada.

Além disso, este método não requer nenhuma ação adicional.

A questão é que para todo o Windows é uma variável comum de tipo string - nome da janela principal do Windows. Todos podem mudá-lo e todos podem vê-lo.

Arquivos anexados:
 
Nikolai Semko:

Eu venho usando um método semi-hacker tão fácil há muito tempo, usando o user32.dll. Mas não se pode transferir carreiras desta maneira.

Se via dll, existe uma solução universal para todos os tipos de dados.

 
Nikolai Semko:

Mas é rápido (provavelmente mais rápido do que todas as soluções existentes)

Bem, estás a ir longe demais ) Em primeiro lugar, passa pela fila de mensagens. Em segundo lugar, você tem que fazer algumas conversões adicionais (para frente e para trás). Além disso, há alguma validação em curso.

A propósito, não se deve especificar explicitamente o tamanho da estrutura. É para isso que serve o tamanho de um.

 
fxsaber:

Se via dll, existe uma solução universal para todos os tipos de dados.

Eu não estou a discutir. A sua solução é realmente mais universal.
Mas pessoalmente eu só preciso de uma ponte entre terminais para transferir a corrente.

A minha variante é apenas mais fácil de entender devido à sua primitividade e funciona um pouco mais rápido. Medi-o em comparação com o seu e é 1,5 - 2 vezes mais rápido. O tempo de leitura de um tick é de 90 microssegundos contra 160 microssegundos.

Arquivos anexados: