Il problema del trasferimento da MT4 a MT5. O, più precisamente, l'impossibilità di eseguire alcuni algoritmi in MT5 senza 'err. - pagina 4

 
Eugeni Neumoin:

Non c'è nessun problema con OnCalculate(). L'intera GUI funziona attraverso OnChartEvent() . Ci sono più di 400 pulsanti nella GUI. Alcuni dei pulsanti non interagiscono in alcun modo con la serie temporale. Le funzioni OnCalculate() e OnTrade() possono aspettare fino al prossimo tick. Questo non si nota psicologicamente. Ed è più complicato con OnChartEvent(). Qui è coinvolta la psicologia umana. L'utente del programma preme il pulsante GUI. E non ottiene la risposta che vuole. Qual è la sua reazione? Una delle reazioni è che lui/lei preme lo stesso pulsante una seconda volta. Ho fatto in modo che una seconda pressione su molti dei pulsanti disabiliti la funzionalità collegata a quel pulsante. Anticipo il tuo suggerimento di rendere l'azione del pulsante disattivabile in qualche altro modo. Ma c'è lo stesso programma per MT4. Lì funziona normalmente. Si scoprirà che MT4 ha un algoritmo di interazione con l'interfaccia grafica mentre MT5 ne ha uno diverso. Tale comportamento dello stesso programma causerà solo il rifiuto.

Ho fatto qualcosa di simile quando ho tradotto in MT5 - ho abilitato l'uscita da OnChartEvent(). Non voglio mentire, è per questo che la GUI stava morendo.

E nel mio caso il riferimento alla serie temporale in OnTimer() avviene dopo 5 minuti. Lo farò dopo 2 minuti. Controllerò cosa succederà.

Artem, i tuoi suggerimenti sono stati utili in passato.

No, non ci saranno certamente suggerimenti per cambiare la logica di lavoro con la grafica - il codice multipiattaforma dovrebbe funzionare allo stesso modo.

  1. L'applicazione alle serie temporali dovrebbe essere fatta almeno una volta ogni due minuti - solo in questo caso sarà garantito che sia sempre aggiornata. Cioè, in multi... indicatori, questa parte del codice deve essere di default.
  2. In MQL5, a differenza di MQL4, il grafico deve essere aggiornato utilizzando CartRedraw() per visualizzare le modifiche del grafico dopo tutte le manipolazioni necessarie con tutti gli oggetti grafici che possono essere aggiornati in una sola volta - non è necessario aggiornare il grafico dopo ogni modifica di un elemento. Non so se sono stato chiaro. Per esempio, se un utente ha cliccato un pulsante e qualcosa deve essere disegnato ulteriormente, per esempio un oggetto tabella composto da diversi elementi, allora tutti gli elementi dovrebbero essere disegnati e solo allora il grafico dovrebbe essere aggiornato una volta. Non aggiornare dopo ogni elemento disegnato di un singolo oggetto.
    Può essere che quando l'utente ha cliccato il pulsante ma non vede nulla, tutto è effettivamente lì, solo che il grafico non è ancora aggiornato (si aggiornerà solo con l'arrivo del tick)
 
Artyom Trishkin:

No, non ci sarà certamente alcun suggerimento per cambiare la logica grafica - il codice multipiattaforma dovrebbe funzionare allo stesso modo.

L'unica cosa che posso suggerire per migliorare i pulsanti è che in ogni caso, quando la serie temporale richiesta non è ancora disponibile, non è ancora possibile costruire un grafico sui suoi dati. In questo caso dobbiamo aspettare il momento in cui i dati diventano disponibili e rendere i pulsanti inattivi durante l'attesa - per esempio renderli simili alle interfacce di Windows: se nessuna azione è disponibile sul pulsante, allora il pulsante è grigio. Questa logica può essere presente per entrambe le piattaforme, in modo che non ci sia alcuna differenza nel codice.

 

Ho ChartRedraw() attivato all'uscita di grandi blocchi, per esempio OnChartEvent() e altri. Quindi non c'è niente di sbagliato in questa funzione.

Riguardo ai tooltip. Sono come degli indicatori che quando si clicca su un numero o un simbolo tutto funziona.

Se si clicca sul numero e sul simbolo, deve scattare uno degli elementi OnChartEvent() - CHARTEVENT_OBJECT_CLICK . Non si attiva se il tooltip non appare. Vorrei sapere perché succede.CHARTEVENT_OBJECT_CLICK non funziona .

E terrò d'occhio l'accesso alle serie temporali.

 
Eugeni Neumoin:

Ho ChartRedraw() attivato all'uscita di grandi blocchi, come OnChartEvent() e altri. Quindi non c'è niente di sbagliato in questa funzione.

Riguardo ai tooltip. Sono come degli indicatori che quando si clicca su un numero o un simbolo tutto funziona.

Se si clicca sul numero e sul simbolo, deve scattare uno degli elementi OnChartEvent() - CHARTEVENT_OBJECT_CLICK . Non si attiva se il tooltip non appare. Vorrei sapere perché succede.CHARTEVENT_OBJECT_CLICK non funziona .

E terrò d'occhio l'accesso alle serie temporali.

All'inizio del gestore di eventi del grafico, registra il parametro sparam - poi ogni azione sarà registrata. Poi inizia a limitare l'output - se c'è un evento click dell'oggetto (id==CHARTEVENT_OBJECT_CLICK), allora l'output sparam al log. Ed è così che si arriva alla causa.

 
Artyom Trishkin:

All'inizio del gestore di eventi del grafico, registra il parametro sparam - poi ogni azione sarà registrata. Poi inizia a limitare l'output - se c'è un evento click dell'oggetto (id== CHARTEVENT_OBJECT_CLICK), allora l'output sparam al log. E così si arriva lentamente alla causa.

Questo è esattamente il modo in cui ho debuggato tutto. E nel codice i bit per il debug in OnChartEvent() sono sempre presenti nella forma commentata. Ma, grazie. Lo farò in questo modo. Cercherò la causa.
 

Per evitare problemi con il legame di numeri e simboli, è necessario aumentare la priorità dei numeri e dei simboli con OBJPROP_ZORDER.

Funziona in MT4 senza di esso. Tuttavia, ho aumentato la priorità in MT4 per sicurezza. Inoltre, la priorità dei simboli d'onda era superiore a quella dei numeri.

Ho risolto il problema.

Sto cercando di cambiare tutte le serie temporali dopo 2 minuti - sto selezionando diverse varianti per la prestazione più fluida di questo compito.

Il processo è iniziato...

 
Eugeni Neumoin:

Per evitare problemi con il binding di numeri e simboli, è necessario aumentare la priorità di numeri e simboli con OBJPROP_ZORDER.

Funziona in MT4 senza di esso. Tuttavia, ho aumentato la priorità in MT4 per sicurezza. Inoltre, la priorità dei simboli d'onda era superiore a quella dei numeri.

Ho risolto il problema.

Sto cercando di cambiare tutte le serie temporali dopo 2 minuti - sto selezionando diverse varianti per le prestazioni più fluide di questo compito.

Il processo è iniziato...

La scorrevolezza non c'entra niente :)
Basta accedere a tutti i tf funzionanti almeno una volta ogni due minuti. Di solito accedo ogni 90 secondi. Potete distribuire il tempo di accesso per i diversi commercianti, in modo da non tirarli tutti insieme. Ma ognuno di essi dovrebbe essere consultato almeno una volta ogni due minuti.
 
Artyom Trishkin:
La scorrevolezza non è un'opzione qui :)
Basta accedere a tutti i cf funzionanti almeno una volta ogni due minuti. Di solito chiamo ogni 90 secondi. Puoi distribuire i tempi di accesso per i diversi traffici in modo da non doverli tirare tutti insieme. Ma ognuno di essi dovrebbe essere consultato almeno una volta ogni due minuti.

Ci sono dei freni.

Ma dobbiamo sopportare quello che abbiamo.

È impossibile abbracciare l'immensità).

 
Artyom Trishkin:
La scorrevolezza non è un'opzione qui :)
Basta accedere a tutti i cf funzionanti almeno una volta ogni due minuti. Di solito chiamo ogni 90 secondi. Puoi distribuire i tempi di accesso per i diversi traffici in modo da non doverli tirare tutti insieme. Ma ognuno di essi dovrebbe essere consultato almeno una volta ogni due minuti.

È impossibile da separare. Se almeno un trade non viene aggiornato, l'indicatore può fare alcune costruzioni grafiche non corrette.

D'altra parte, ho controllato la disponibilità delle serie temporali prima di OnCalculate e OnChartEvent. Come suggerito.

L'aggiornamento delle serie temporali e il controllo della disponibilità delle serie temporali causano gravi ritardi.

Ottiene ancora interruzioni di accesso alle serie temporali. Come ho detto quando ho creato il ramo in uno dei primi post. Questo conferma che dobbiamo aggiornare la serie temporale programmaticamente.

Questo è il primo.

Secondo. Perché ogni sviluppatore deve preoccuparsi di organizzare l'accesso alle serie temporali?

Perché non c'è qualche "meccanismo" aggiuntivo che elimina questo fastidio?

Se qualcuno ha bisogno di questo fastidio, nessuno vieta l'uso di ciò che è ora disponibile. E per coloro che pensano che l'accesso alternativo universale alle serie temporali vada bene, è meglio che tale accesso sia fatto dagli sviluppatori.

Ho avuto diverse persone che mi hanno chiesto di tradurre un programma da MT4 a MT5. L'ho fatto. Non sono soddisfatto della traduzione. Ma finché ho scaricato il programma, non ho lamentele. Forse ne sono soddisfatti. Anche se ne dubito.

Vorrei aggiungere qualcosa da parte mia. Ho smesso di sperimentare l'ottimizzazione dell'accesso alle serie temporali. Questo è un uso improduttivo del tempo. Ci sono cose più interessanti da fare. Lasciate che coloro che sono interessati lavorino con MT5. L'unica cosa che può essere masticata da MT5 è la cronologia delle quotazioni. Per l'uso nell'insegnamento di NS.

 
Eugeni Neumoin:

D'altra parte, ha fatto dei controlli sulla disponibilità delle serie temporali prima delle funzioni OnCalculate e OnChartEvent. Come suggerito.

L'aggiornamento delle serie temporali e il controllo della disponibilità delle serie temporali causano gravi rallentamenti.

È stato suggerito di farlo con un timer ogni minuto e mezzo. Non prima di ogni tick, e certamente non su un evento del grafico.

L'accesso alle serie temporali in MT5 non è davvero l'ideale. Ma se hai bisogno di risolvere un problema piuttosto che trovare una scusa, è possibile.

Motivazione: