Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 101

 
fxsaber:

Risultato

Sì, non ho tenuto conto del funzionamento interno di Sleep, che sul mio computer richiede circa 4ms.

Una buona alternativa a Sleep (chi si preoccupa della precisione :)) è

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

Non posso garantire la precisione di 0,995. L'ho preso per il mio computer. Può essere adatto a tutti.

File:
TestSleep.mq5  1 kb
 
fxsaber:

Onestamente, non so nemmeno cosa significa e dove si può incontrare in MQL5.

Ciò significa che i picchi sono possibili in qualsiasi situazione, anche nelle funzioni sincrone. Dovete solo esserne consapevoli e non farci caso, perché non c'è niente che possiate fare.

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

Oltre ai file e alle variabili globali, c'è un altro modo per trasferire informazioni tra i programmi

Forum sul trading, sistemi di trading automatico e test di strategia

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

Oltre ai file e alle variabili globali, c'è un altro modo di trasferire informazioni tra i programmi

Stiamo parlando di programmi all'interno di un singolo terminale in esecuzione, vero?

 
Nikolai Semko:

Stiamo parlando di programmi all'interno di un singolo terminale in esecuzione, vero?

Sì, è per questo che si parla di variabili globali.

E tra i terminali ha iniziato a usare questo modo.
 
fxsaber:

Sì, è per questo che si parla di variabili globali.

E tra i terminali ha iniziato a usare questo modo.

Sì, è davvero forte!
Una scoperta molto bella usando dischi RAM invece di SSD.

 
fxsaber:

Sì, è per questo che si parla di variabili globali.

Ho iniziato a usare questo modo tra i terminali.

Ho usato un metodo semi-hacker così facile usando user32.dll per molto tempo. Ma è impossibile passare array di tick in questo modo.

L'ho inventato molto tempo fa quando stavo padroneggiando MQL4. Certo, non è la soluzione più breve in termini di organizzazione ragionevole dello scambio, ma è veloce e funziona bene (forse più veloce di tutte le soluzioni esistenti), ecco perché non mi sono più scervellato.

Inoltre, questo metodo non richiede alcuna azione aggiuntiva.

Il punto è che per tutto Windows è una variabile comune di tipo stringa - nome della finestra principale di Windows. Tutti possono cambiarlo e tutti possono vederlo.

 
Nikolai Semko:

Ho usato un metodo semi-hacker così facile per molto tempo, usando user32.dll. Ma non si possono trasferire gli array di tick in questo modo.

Se tramite dll, c'è una soluzione universale per tutti i tipi di dati.

 
Nikolai Semko:

Ma è veloce (probabilmente più veloce di tutte le soluzioni esistenti)

Beh, stai andando troppo lontano ) Prima di tutto, passa attraverso la coda dei messaggi. In secondo luogo, devi fare alcune conversioni aggiuntive (avanti e indietro). Inoltre c'è una convalida in corso.

A proposito, non dovreste specificare esplicitamente la dimensione della struttura. Ecco a cosa serve la sizeof.

 
fxsaber:

Se tramite dll, c'è una soluzione universale per tutti i tipi di dati.

Non sto discutendo. La tua soluzione è davvero più universale.
Ma personalmente ho solo bisogno di un ponte tra i terminali per trasferire i tick di corrente.

La mia variante è solo più facile da capire a causa della sua primitività e funziona un po' più velocemente. L'ho misurato in confronto al tuo ed è 1,5 - 2 volte più veloce. Il tempo di lettura di un tick è di 90 microsecondi contro 160 microsecondi.

Motivazione: