Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
non si chiama chiusura del record, ma chiusura e cancellazione del file.
ed è per questo che
per cui si sta cercando di aprire qualcosa che non esiste più.Guardando il codice della libreria ho visto che il file viene cancellato non solo quando viene chiamata direttamente la funzione Close() della classe CMemMapFile, ma anche quando viene cancellato il puntatore all'oggetto di questa classe, perché questa funzione viene chiamata nel distruttore della classe. Sono un po' perplesso. Risulta che il metodo dinamico di creazione degli oggetti della classe non può essere utilizzato se la scrittura e la lettura di un file sono utilizzate in contesti di chiamata (scope) diversi. Ad esempio, un diagramma del terminale scrive dati in un file, il secondo legge i dati e cancella questo file. Si scopre che la variabile oggetto deve essere sempre mantenuta a livello globale, in modo che il file non venga cancellato forzatamente. Inoltre, non è chiaro se sia possibile fare a meno di specificare la dimensione dei dati letti. In altre parole, conosciamo la dimensione dei dati quando li scriviamo, ma quando li leggiamo su un'altra tabella potremmo non conoscere in anticipo la dimensione dei dati, come ad esempio nel caso dei valori delle stringhe. Probabilmente ho capito male qualcosa o c'è qualcos'altro da modificare nella libreria.
Errore mio. Ho ricontrollato senza usare il puntatore e quindi senza usare delete. In questo caso, quando si esce dall'ambito (da una funzione), la variabile locale dell'oggetto di classe viene distrutta senza una chiamata esplicita al distruttore.
C'è ancora un problema con la dimensione dei dati ricevuti dal lato del ricevitore.
Grazie all'autore per la libreria!
Ho creato delle funzioni per trasferire qualsiasi dato. Lo script qui sotto mostra il loro lavoro sull'esempio delle zecche
Risultato
Super! Per analogia con il vostro codice ho semplificato l'uso della libreria.
Forum sul trading, sui sistemi di trading automatizzati e sul test delle strategie di trading
NamedPipes per metatrader 4
fxsaber, 2017.11.30 14:18
Exchange_Data.mqh
PriceGiver.mq4
PriceTaker.mq4
Eseguire PriceGiver.ex4 e PriceTaker.ex4.
Risultato
La libreria presenta un piccolo errore nel metodo CMemMapFile::Open. Dovrebbe restituire l'handle del file (tipo HANDLE64), ma invece restituisce 0 o un codice di errore.
Inoltre, i metodi di lettura e scrittura CMemMapApi::Write e CMemMapApi::Read, per qualche motivo, ricopiano due volte i dati (e i byte vengono passati in loop!), e inoltre il file viene sovrascritto/letto nella sua interezza, anche se è richiesta solo una parte specifica.
In generale, li ho resi normali, le cose non necessarie sono commentate:
Per rendere la prima funzione compilabile, è necessario impostare const per gli array nelle funzioni memcpyX e memcpy, cosa che l'autore non si è preoccupato di impostare.Errore durante la copia di grandi dimensioni, dovuto al passaggio di zero in dwMaximumSizeHigh
Ho risolto il problema in questo modo:
Questa dimensione - 6 mb - viene trasferita senza problemi:
Correggetelo in questo modo:
Passare correttamente i 4 byte superiori della dimensione di 8 byte.
Ok, ora abbiamo tutti i raites nel programma C# e possiamo analizzare tutto ciò che ci serve usando LINQ.
Ma c'è un problema: come organizzare il meccanismo dei comandi tra il terminale e l'applicazione.
Dal terminale: nuova candela, nuovo raites - prendere il file
Dall'applicazione: calcolo completato, prendere il risultato (disegnare sul grafico, aprire un'operazione).
Qualcuno ha esperienza di questa implementazione dell'interazione tra terminale e codice?
Ok, ora abbiamo tutti i raites in un programma C# e possiamo usare LINQ per analizzare tutto alla perfezione.
Ma c'è una domanda: come organizzare il meccanismo dei comandi tra il terminale e l'applicazione?
Dal terminale: nuova candela, nuove tariffe - ottenere il file
Dall'applicazione: calcolo completato, prendere il risultato (disegnarlo sul grafico, aprire una transazione).
Qualcuno ha esperienza di questa implementazione dell'interazione tra terminale e codice?
Si prega di consigliare cosa fare in questa situazione.
1. Ho aperto un nuovo file in memoria con 100 byte.
2. Ho scritto 100 byte al suo interno.
3. Ho letto 100 byte in un altro Expert Advisor. Tutto va bene.
4. Ora come scrivere 50 o 200 byte nello stesso file?