Discussione sull’articolo "Ordini, Posizioni e Deal in MetaTrader 5"

 

Il nuovo articolo Ordini, Posizioni e Deal in MetaTrader 5 è stato pubblicato:

La creazione di un solido robot di trading non può essere eseguita senza una comprensione dei meccanismi del sistema di trading MetaTrader 5. Il client terminal riceve le informazioni su posizioni, ordini e deal dal server di trading. Per gestire correttamente questi dati utilizzando l'MQL5, è necessario avere una buona comprensione dell'interazione tra il programma MQL5 e il client terminal.

Autore: MetaQuotes

 

Dopo aver letto, non ho trovato la risposta migliore a questa domanda.

Come caricare nella cache, ad esempio, solo 1 ultimo ordine dalla cronologia (per complicare il compito, lasciare l'ultimo per simbolo).

Ad esempio, il consulente ha una frequenza di ordini diversa. Può effettuare 30 ordini al giorno e può rimanere "silenzioso" per diversi giorni o settimane.

Esistono varianti per cui, dopo aver inviato un ordine al server, è necessario ricordare il suo ticket da qualche parte e poi recuperare l'ordine per ticket: nessun problema. È possibile memorizzare sia in variabili globali che all'interno della logica dell'EA. Ma ecco il problema se, ad esempio, l'Expert Advisor si connette al conto da un altro terminale e non dispone del ticket dell'ultimo ordine.

Devo caricare la cronologia tramite HistorySelect. La data finale è più o meno chiara, ma come calcolare la data iniziale.

Perché anche in un piccolo intervallo può ottenere diversi ordini - non è un problema, ma non ottimale in termini di caricamento di dati inutili. Oppure uno di essi potrebbe non rientrare nell'intervallo.

Si può prendere un intervallo di date ancora più piccolo e fare un loop (spostare l'intervallo nella cronologia) per riempire la cache - non è ottimale in termini di logica di lavoro - loop extra, query al database della cronologia.

Proposta: organizzare il caricamento della quantità necessaria per ordini/contratti per strumento.

E ancora: se lo scopo dell'articolo era quello di mostrare gli algoritmi ottimali di accesso agli ordini/contratti/posizioni. Penso che: se andiamo oltre in termini di ottimizzazione, sarebbe bene avere una modalità di caricamento dei dati dalla cronologia nella cache per campi, ad esempio, sono necessari solo i biglietti e l'ora di invio dell'ordine al server, perché poi caricare tutti gli altri dati da questo intervallo a questi ordini (magick, commento e molto altro).

select * da HistiryOrder where a_date_send>@datestart e a_date_send<@dateend

Per chi sviluppa applicazioni DBMS, credo che una query di questo tipo non sarebbe approvata per l'uso in produzione. È vero, ci sono situazioni in cui tutti i dati sono ulteriormente coinvolti in alcune azioni, ma questa è un'eccezione piuttosto che una regola.


 
olyakish:

Dopo aver letto, non ho trovato la risposta migliore a questa domanda.

Come caricare nella cache, ad esempio, solo 1 ultimo ordine dalla cronologia (per complicare il compito, lasciare l'ultimo per simbolo).

Ad esempio, il consulente ha una frequenza di ordini diversa. Può effettuare 30 ordini al giorno e può rimanere "silenzioso" per diversi giorni o settimane.

Esistono varianti per cui, dopo aver inviato un ordine al server, è necessario ricordare il suo ticket da qualche parte e poi recuperare l'ordine per ticket: nessun problema. È possibile memorizzare sia in variabili globali che all'interno della logica dell'EA. Ma ecco il problema se, ad esempio, l'Expert Advisor si connette al conto da un altro terminale e non dispone del ticket dell'ultimo ordine.

Devo caricare la cronologia tramite HistorySelect. La data finale è più o meno chiara, ma come calcolare la data iniziale.

Perché anche in un piccolo intervallo può ottenere diversi ordini - non è un problema, ma non ottimale in termini di caricamento di dati inutili. Oppure uno di essi potrebbe non rientrare nell'intervallo.

Si può prendere un intervallo di date ancora più piccolo e fare un loop (spostare l'intervallo nella cronologia) per riempire la cache - non è ottimale in termini di logica di lavoro - loop extra, query al database della cronologia.

Proposta: organizzare il caricamento della quantità necessaria per ordini/contratti per strumento.

E ancora: se lo scopo dell'articolo era quello di mostrare gli algoritmi ottimali di accesso agli ordini/contratti/posizioni. Penso che: se andiamo oltre in termini di ottimizzazione, sarebbe bene avere una modalità di caricamento dei dati dalla cronologia nella cache per campi, ad esempio, sono necessari solo i biglietti e l'ora di invio dell'ordine al server, perché poi caricare tutti gli altri dati da questo intervallo a questi ordini (magick, commento e molto altro).

select * da HistiryOrder where a_date_send>@datestart e a_date_send<@dateend

Per chi sviluppa applicazioni DBMS, credo che una query di questo tipo non sarebbe approvata per l'uso in produzione. È vero, ci sono situazioni in cui tutti i dati sono ulteriormente coinvolti in alcune azioni, ma questa è un'eccezione piuttosto che una regola.


Il caricamento e l'elaborazione di una cronologia anche molto ampia non richiede molto tempo. Inoltre, se questo caricamento viene eseguito a ogni tick, è già un problema.

Anche una cronologia molto ampia verrà elaborata in pochi secondi. La prima conclusione è quindi quella di ridurre il numero di caricamenti completi.

Avviare il caricamento completo della cronologia in OnInit(). Ricordare le date necessarie. Poi si può far girare la storia "come una zingara con il sole" in OnTicket().

 
Urain:

Il caricamento e l'elaborazione di una cronologia anche molto ampia non richiederà molto tempo. Inoltre, se tale caricamento viene eseguito a ogni tick, è già un problema.

Anche una cronologia molto grande verrà elaborata in pochi secondi. La prima conclusione è quindi quella di ridurre il numero di caricamenti completi.

Avviare il caricamento completo della cronologia in OnInit(). Ricordare le date necessarie. Dopodiché si può far girare la storia "come una zingara con il sole" in OnTicket().

Per essere più precisi, la storia dovrebbe essere caricata completamente solo nel blocco di inizializzazione e nei fine settimana (nei fine settimana si dovrebbero anche ottimizzare i parametri).

 

Una cosa che mi ha confuso è che il testo contiene molti avvertimenti sulla necessità di caricare la cronologia nella cache in modo parsimonioso (ponderato), ma non c'è alcun esempio reale di come implementare questo compito. Questo francamente mi ha turbato:

//--- impostare il limite iniziale a 3 giorni fa
   datetime start=end-3*PeriodSeconds(PERIOD_D1);

Questo codice (approccio) sarà davvero utilizzato in un normale Expert Advisor? A meno che non si tratti di un compito specifico e semplice (per esempio, trovare gli ordini per diversi giorni), e allora - con riserva (in questo esempio, i fine settimana non sono presi in considerazione, quindi il codice non è adatto per elaborare diversi giorni di trading ), l'approccio non regge a nessuna critica.

Tuttavia, esistono tutti gli strumenti per implementare un caricamento economico. E, per quanto mi riguarda, un esempio di tale implementazione dovrebbe essere presente nell'articolo.

Ad esempio, utilizzando questo modello:

  1. OnInit() - caricamento dell'intero storico nella cache, ricerca dell'ultimo ordine significativo per l'Expert Advisor (ad esempio, per meijik o solo per strumento), salvataggio del tempo in una variabile.
  2. OnTrade() - aggiorna la cronologia caricata nella cache (a partire dal tempo memorizzato), aggiorna il tempo dell'ultimo ordine (se è apparso un nuovo ordine significativo).
  3. OnTick() - lavorare con la cache correntemente caricata o, se necessario, caricare la cache dall'ora memorizzata.

Questo approccio vanta già una certa stabilità e universalità. Inoltre, in termini di utilizzo delle risorse, potrebbe rivelarsi ancora più economico di "selezionare gli ultimi 3 giorni".


Comunque, grazie ancora per l'articolo. Queste "specifiche da parte degli sviluppatori" sono necessarie, altrimenti non ci sarà codice normale.

 

L'articolo fornisce un esempio di caricamento della storia del trading per un giorno (un codice ha un esempio di caricamento della storia per 3 giorni). Sì, questa è una limitazione e l'esempio non è universale. Ma se il lettore comprende questa particolarità durante la lettura dell'articolo, sarà in grado di decidere da solo per quale intervallo e da quale momento deve caricare la cronologia di trading nella cache.

Il lettore ha ricevuto gli esempi e gli algoritmi più semplici e può ora applicarli autonomamente nelle funzioni di elaborazione degli eventi necessarie. Può creare autonomamente la propria base di storia del trading, inizializzarla e sincronizzarla, e così via.

Il tentativo di fornire ricette e funzioni specifiche per un lavoro ottimale con la storia del trading in tutti i casi richiederà almeno un altro articolo. Più precisamente, non si tratta di esempi in sé, ma di approcci alla soluzione di determinati compiti. Questo articolo era finalizzato a capire come funzionano le funzioni di trading e a quali sfumature bisogna prestare attenzione per non sprecare il proprio tempo nella ricerca.

Sono sicuro che dopo aver letto questo articolo, tutto sarà più semplice.

 

Potete dirmi se esiste da qualche parte una descrizione del funzionamento del terminale in modalità OfLine? Il fatto è che non sono riuscito a caricare il terminale a causa del mancato aggiornamento dei dati del grafico. Volevo provarlo al lavoro (non c'è internet), ma non ci sono riuscito: i grafici sono in attesa di aggiornamento e non c'è un solo simbolo nel tester. L'articolo dice che dopo l'avvio del terminale viene eseguita la sincronizzazione dei dati con il server. Ma cosa succede se non c'è connessione (in realtà non è previsto). Forse ha senso dire esplicitamente al terminale che dovrebbe funzionare in OfLine e non far girare questa sfortunata ruota. Forse ci saranno meno fallimenti per il lavoro del tester. Per essere onesti, va detto che non ho avuto questo problema per molto tempo, ma la gente se ne lamenta sul forum. Forse ci sono alcuni trucchi (beh, c'è qualche file da rimuovere) per risolvere la situazione (ho provato - niente è servito finché non ho stabilito una connessione con il server a casa).

Документация по MQL5: Получение рыночной информации / SymbolIsSynchronized
Документация по MQL5: Получение рыночной информации / SymbolIsSynchronized
  • www.mql5.com
Получение рыночной информации / SymbolIsSynchronized - Документация по MQL5
 

Dopo il trasferimento del catalogo del terminale su una nuova apparecchiatura, una parte dei database di configurazione (simboli, impostazioni del conto, cronologia delle transazioni, ecc.) viene cancellata in modo particolare perché è criptata da chiavi cablate. La cronologia dei grafici non viene intaccata.

Ciò significa che dopo la migrazione è necessario connettersi a qualsiasi conto di trading almeno una volta per consentire al terminale di adattare l'ambiente di mercato. Dopodiché è possibile cancellare la password, disconnettersi da Internet e lavorare con il tester offline.

 
Renat:

Dopo il trasferimento del catalogo del terminale su una nuova apparecchiatura, una parte dei database di configurazione (simboli, impostazioni del conto, cronologia delle transazioni, ecc.) viene cancellata in modo particolare perché è criptata da chiavi cablate. La cronologia dei grafici non viene intaccata.

Ciò significa che dopo la migrazione è necessario connettersi a qualsiasi conto di trading almeno una volta per consentire al terminale di adattare l'ambiente di mercato. Dopodiché è possibile cancellare la password, disconnettersi da Internet e lavorare con il tester offline.


Non ho spostato o cambiato nulla. Sono venuto al lavoro con il mio portatile e ho voluto provare l'Expert Advisor. Ho un solo account e naturalmente ho provato ad accedere, ma il log dice che non c'è connessione con il server. Forse è stato solo un errore casuale, ma non ho potuto fare nulla.

 
Erm955:

Non ho spostato o modificato nulla. Sono venuto al lavoro con il mio portatile e ho voluto testare l'EA. Ho un account e naturalmente ho provato ad accedere, ma il log dice che non c'è connessione con il server. Forse è solo un errore casuale, ma non ho potuto fare nulla.

Si prega di fornire uno screenshot completo dell'intera finestra del terminale, comprese tutte le zone di Market Watch, del grafico e del tester.

Provare a connettersi al conto a casa, pompare completamente i dati ed eseguire almeno un test. Quindi scollegatevi da internet, riavviate il terminale e riprovate.

 
Renat:

Si prega di fornire uno screenshot completo dell'intera finestra del terminale, comprese tutte le zone di Market Watch, del grafico e del tester.

Provare a connettersi al conto a casa, scaricare completamente i dati ed eseguire almeno un test. Dopodiché scollegatevi da internet, riavviate il terminale e riprovate.

Questo non richiede nulla perché tutto funziona come prima. A quanto pare si è trattato di un guasto accidentale. Prima il terminale chiedeva l'autorizzazione, ora si avvia senza. Ho controllato circa 10 volte con e senza riavviare il computer. Tutto va bene, grazie.