Scambio di dati tra due EA in esecuzione su terminali diversi - pagina 2

 

Dal momento che l'EA gestisce l'evento su base tick-by-tick, ho scelto questa direzione.

La differenza di scrivere uno e leggere l'altro da un tick, in teoria al prossimo tick...

 

Mi è venuta un'idea: che ne dite di scambiare dati attraverso il registro? Creare una chiave, cancellare una chiave, tutte le API per questo sembrano essere lì. Non so quanto sia lento, ma sembra che la parte a cui accedono le applicazioni possa essere sempre nella RAM.

È mai passato per la mente a qualcuno? Funziona solo per i terminali sulla stessa macchina.

Scaverò in questa direzione :-).

 
Andres писал(а) >>

Mi è venuta un'idea: che ne dite di scambiare dati attraverso il registro? Creare una chiave, cancellare una chiave, tutte le API per questo sembrano essere lì. Non so quanto sia lento, ma sembra che la parte a cui accedono le applicazioni possa essere sempre nella RAM.

È mai passato per la mente a qualcuno? Funziona solo per i terminali sulla stessa macchina.

Scaverò in questa direzione :-).

Per favore datemi un link all'API per lavorare con il registro.

Finora sto considerando la variante basata sullo scambio di informazioni tramite file su disco. Entrambi i terminali funzionano ovviamente sullo stesso computer.

Ho fatto alcune prove e mi sembra che la velocità sia più che sufficiente per scambiare dati tra i terminali in meno di 1 secondo, il che è sufficiente per la gestione operativa di entrambi i conti (BUY e SELL).

Anche se ultimamente sono stato molto occupato al lavoro, quindi non ho affrontato questo problema per un paio di settimane.

Anche se ho chiesto ad un collega programmatore prima, ma mi ha messo in guardia dal dilettarmi con il registro per risolvere il problema. Mi ha fortemente consigliato di usare la condivisione dei file sul disco rigido.

Per ora mi sono fermato qui. Appena avrò abbastanza tempo libero, cercherò di realizzare questa variante con file.

 

http://yandex.ru/yandsearch?text=CreateFileMapping&stpar2=%2Fh0%2Ftm123%2Fs1&stpar4=%2Fs1

La comodità è che c'è un riferimento alla memoria condivisa nella dll.

Questo indirizzo può essere usato come indirizzo di struttura. inoltre, la vostra immaginazione è l'unico limite :)

 
solandr >> :

Per favore, datemi un link a un'API per lavorare con il registro.

Esempio di lettura dal registro.

 

Ho già scritto una piccola libreria, e i miei EA stanno già cambiando le informazioni attraverso il registro. Infatti, sono cambiati attraverso la RAM, nessuna lettura-scrittura su disco che io non osservi. In MSDN è scritto che è meglio non spingere i dati più di un paio di centinaia di Kb nel registro.

La libreria è configurata in modo tale che tutte le chiavi e i parametri sono creati nell'area temporanea del registro e non sono scritti nel registro permanente. Dopo il riavvio questi tasti sono spariti.

Un MA, la libreria funziona solo con parametri stringa, non più lunghi di 255 caratteri (limitazione in MQL). Ma questo è abbastanza. In generale i parametri nel registro possono essere di diversi tipi, non solo stringhe, ma per ora altri tipi non sono necessari secondo me. In questo momento ho due EA scambiati attraverso il registro, ma potrebbero essercene altri :-). Un'altra buona cosa è che in Win API è possibile connettersi al registro di rete. Se qualcuno ha bisogno di scambiare informazioni tra EA in esecuzione su diversi computer nella stessa rete, può guardare in questa direzione. A mio parere, è veloce, semplice e affidabile, e senza dll e file. Se metti una stringa, ottieni una stringa.

#include "RegLib.mqh"

int hKey;

int init()
{
   // инициализируем дефайны
   InitRegDefines();

   // создаём тестовый ключ
   hKey = CreateKey( HKEY_CURRENT_USER, "!MT4TestKey" );

   // создаём поля по умолчанию
   SetStringValue( hKey, "Bid", "0.0" );
   SetStringValue( hKey, "Ask", "0.0" );

   return( 0 );
}

int start()
{
   // записываем цены в реестр
   SetStringValue( hKey, "Bid", DoubleToStr( Bid, Digits ) );
   SetStringValue( hKey, "Ask", DoubleToStr( Ask, Digits ) );

   // получаем цены в виде строк из реестра
   string BidStr = GetStringValue( hKey, "Bid" );
   string AskStr = GetStringValue( hKey, "Ask" );

   // выводим цены из реестра
   Print( "Bid = ", BidStr, " ", "Ask = ", AskStr );
}

int deinit()
{
   // закрываем ключ
   CloseKey( hKey );
   
   return( 0 );
}
File:
reglib.zip  4 kb
 
Andres писал(а) >>

Mi è venuta un'idea: che ne dite di scambiare dati attraverso il registro? Creare una chiave, cancellare una chiave, tutte le API per questo sembrano essere lì. Non so quanto sia lento, ma sembra che la parte a cui accedono le applicazioni possa essere sempre nella RAM.

È mai passato per la mente a qualcuno? Funziona solo per i terminali sulla stessa macchina.

Scaverò in questa direzione :-).

Puoi anche provare a piantare un chiodo con una lampadina. Funziona per alcune persone.

 
Integer >> :

Potresti anche provare a piantare un chiodo con una lampadina. Alcune persone possono farlo.

Ma è bellissimo, non credi? Potreste anche provare a usare le variabili del sistema operativo.

 
granit77 писал(а) >>

Ma è bellissimo, non sei d'accordo? Potreste anche provare a usare le variabili del sistema operativo.

Potresti anche provare a impostare l'ora del sistema.

 
:))))))))))))))