Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 102

 
Alexey Navoykov:

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. C'è un sizeof per questo.

  • Dove hai visto una coda di messaggi?
  • Non ci sono conversioni di andata e ritorno. La stessa unione è usata come nell'esempio di @fxsaber
  • Non c'è nemmeno una convalida.
  • Naturalmente, si può usare sizeof(...), ma poiché si tratta di un'implementazione di un compito concreto e non universale, ho dovuto semplicemente scriverlo più breve come 3 cifre.

Forse hai guardato qualche altro codice.

HH l'unica cosa che non mi piace della mia versione: ho dovuto raddoppiare la dimensione della linea per bypassare gli zeri, perché lo zero è percepito come la fine della linea. Sento nella mia spina dorsale che c'è una soluzione più semplice, ma non l'ho trovata. Ma funziona ancora più velocemente.

 
Nikolai Semko:

  • Dove avete visto una coda di messaggi?

SetWindowText/GetWindowText non sono inviati tramite messaggi?


Non ci sono conversioni di andata e ritorno.

Certo che lo fa. Cos'è tutto questo trambusto?

for(int i=0; i<56; i++) if(U.a[i]==0) m[2*i+1]=2; else m[2*i]=U.a[i];
 
Alexey Navoykov:

SetWindowText/GetWindowText non sono inviati tramite messaggi?

E stai parlando dei messaggi di Windows... E allora? C'è un'alternativa più veloce per scambiare dati tra diversi programmi nel windos senza dll homebrew?

Capisco che vi siete sentiti offesi dalle mie parole, che la mia variante è veloce. Beh, in primo luogo, non l'ho affermato, l'ho solo suggerito. In secondo luogo, ho sostenuto la mia ipotesi con del codice di test, confrontandolo conMemory Mapping.
E se cercate di confutare anche le supposizioni, per favore non basate la vostra confutazione solo su affermazioni dichiarative. Vi sarò molto grato se potrete dissuadermi e indicarmi l'implementazione più veloce dello scambio di dati tra terminali senza alcuna dll autoscritta.

Non escludo che la variante tramite disco RAM sia molto più veloce. Ma questo è un argomento leggermente diverso, perché richiede l'installazione del disco RAM e la sua configurazione.

Alexey Navoykov:

Naturalmente. Ma cos'è questo ballare con i tamburelli?

for(int i=0; i<56; i++) if(U.a[i]==0) m[2*i+1]=2; else m[2*i]=U.a[i];

Alla faccia dei tamburelli. È una banalità. E questa banalità, tra l'altro, è realizzata in 50-60 ns, quando tutto il blocco di ricezione della struttura di tick è realizzato in 90 µs (90 000 ns.), cioè questi "diamanti" occupano solo lo 0,06 % del tempo di ricezione del blocco di dati. Inoltre, ho scritto che questo punto mi confonde solo in vista del raddoppio della memoria.

E così la mia variante sembra molto conveniente, semplice e intelligente per lo scambio di piccole strutture di dati.

 
Nikolai Semko:

  • L'unica cosa che non mi piace della mia versione: ho dovuto raddoppiare la dimensione della linea per bypassare gli zeri, perché lo zero è percepito come la fine della linea. Sento nella mia spina dorsale che c'è una soluzione più semplice, ma non l'ho trovata. Ma funziona comunque più velocemente.

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

Biblioteche: HistoryTicks

Automated-Trading, 2018.03.29 11:09

  • Ci sono funzioni multipiattaforma nei sorgenti( fileData_String.mqh) che permettono di mettere/estrarre qualsiasi dato da/a una stringa. Per esempio, permette di scambiare facilmente qualsiasi dato tra qualsiasi programma MQL utilizzando i parametri stringa (sparam)degli eventi utente;
#include <fxsaber\HistoryTicks\Data_String.mqh> // https://www.mql5.com/ru/code/20298

void OnStart()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
  {
    const string Str = DATA_STRING::ToString(Tick);
    
    MqlTick Ticks[1];
    
    Ticks[0] = DATA_STRING::FromString<MqlTick>(Str);
    ArrayPrint(Ticks);
  }
}
 
fxsaber:

Wow!
Non sapevo nemmeno di funzioni come CryptEncode eCryptDecode. Grazie!
Gli darò un'occhiata.
Ma mentre a prima vista sembra tutto high-tech, ma follemente lento, perché la funzione CryptEncode gira due ordini di grandezza più lentamente (microsecondi contro decine di nanosecondi) di quello che è stato chiamato qui come tamburello:

for(int i=0; i<56; i++) if(U.a[i]==0) m[2*i+1]=2; else m[2*i]=U.a[i];
 
Nikolai Semko:

Deduco che ti sei offeso quando ho detto che la mia versione era veloce. Beh, in primo luogo, non l'ho affermato, ho solo fatto una supposizione. In secondo luogo, ho sostenuto la mia ipotesi con del codice di test, confrontandolo conMemory Mapping.

Non parlavo di "rapidità" ma di"può essere più veloce di tutte le soluzioni esistenti", per cui ho fatto diverse osservazioni senza alcun attacco. E quelle osservazioni erano abbastanza giuste. Ma tu, per qualche motivo, prima ti ostini a negarlo ("forse devi averguardato qualche altro codice") e poi entri nel "e allora! Quindisepariamo le mosche dalle cotolette.

In secondo luogo, per quanto riguarda MemoryMapping (più precisamente, il suo MQL-wrapper per essere precisi), non ho mai detto nulla sul fatto che sia veloce. Inoltre, nel thread di discussione su questo progetto qui ho indicato i bug dell'autore che creano lag e come risolverli. Quindi, se avete intenzione di testare qualcosa, testatelo nella sua forma nativa, e non nella forma delle decisioni sbagliate di qualcun altro.

 
Nikolai Semko:

ZZY Ma mentre a prima vista è tutto high-tech, ma follemente lento, perché la funzione CryptEncode è due ordini di grandezza più lenta (microsecondi contro decine di nanosecondi) di quello che qui si chiama tamburello:

A cosa serve la velocità?

 
Alexey Navoykov:

Non sto parlando di "rapidità", ma di"può essere più veloce di tutte le soluzioni esistenti", quindi ho fatto alcune osservazioni senza alcun attacco. E queste osservazioni erano abbastanza giuste. Ma per qualche motivo tu prima neghi ostinatamente ("forse hai guardato qualche altro codice"), e poi ti metti nella posizione "e allora? Quindisepariamo le mosche dalle cotolette.

In primo luogo, il mio post è stato scritto prima che tu abbia citato il tuo codice di test. In secondo luogo, per quanto riguarda MemoryMapping (più precisamente, il suo MQL-wrapper menzionato), non ho mai affermato che funziona velocemente. Inoltre, nel thread di discussione su questo progetto qui ho indicato i bug dell'autore che creano lag e come risolverli. Quindi, se avete intenzione di testare qualcosa, testatelo in forma nativa, non nelle decisioni sbagliate di qualcuno.

Ok. D'accordo. Era troppo forte.

Volevo solo dire che forse usare user32.dll invece di kernel32.dll potrebbe rivelarsi più veloce quando si collegano due terminali tramite WinAPI, poiché tutte le implementazioni che ho incontrato hanno usato kernel32.dll.

 
fxsaber:

A cosa serve la velocità?

Mi dispiace, non ho capito la domanda.
Vi state chiedendo - perché avete bisogno della velocità del ponte tra i terminali?

 
Nikolai Semko:

Mi dispiace, non ho capito la domanda.
Vi state chiedendo - perché avete bisogno di velocità di scambio di dati a ponte tra i terminali?

Sì.

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

Peculiarità del linguaggio mql5, consigli e trucchi

Nikolai Semko, 2018.09.21 13:20

Ma finora, a prima vista, tutto questo, ovviamente, high-tech, ma follemente lento, perché la funzione CryptEncode viene eseguita due ordini di grandezza più lentamente(microsecondi contro decine di nanosecondi) di quello che viene chiamato qui tamburello:

Motivazione: