Tela vs Etichette - pagina 6

 

Perché dovrei voler testare i disegni grafici in uno strategy tester (specialmente in una versione specializzata di visual pending), quando è meglio farlo direttamente in un grafico di lavoro?

E complimenti a coloro che non pensano a disabilitare la tracciatura grafica nei loro robot nel tester non visivo.

 

Nikolay ha ragione - la modifica delle proprietà delle etichette non ha niente a che fare con il rendering delle etichette.

L'etichetta, come qualsiasi altro oggetto sul grafico, è disegnata in un thread completamente diverso e indipendentemente dal lavoro del programma MQL5. Il robot può solo chiedere al grafico di essere reso forzatamente di nuovo, ma non può misurare il tempo di rendering. Il disegno dei grafici con gli oggetti è completamente asincrono.

Ma il rendering canvas è facile da misurare poiché viene fatto direttamente nel flusso del robot e poi durante il rendering indipendente del grafico rimane da fare un BitBlit nativo della bitmap pronta nel contesto della finestra. Questa operazione è elementare ed è ben accelerata dalla scheda video.

Nelle etichette di testo SetFont/TextOut nei font TTF è abbastanza costoso.
 
Mihail Matkovskij:

Risulta essere 321 volte, se si deve credere a questa misurazione.

Questa figura mostra che non ci si può fidare di questa misurazione.
Questo è ovvio per un programmatore esperto.
Pensate davvero che ci sia un altro modo di visualizzare i caratteri su uno schermo grafico se non la loro formazione pixel per pixel? I giorni dell'ECock sono passati da un pezzo.
 
Renat Fatkhullin:

Perché dovrei voler testare i disegni grafici in uno strategy tester (specialmente in una versione specializzata di visual pending), quando è meglio farlo direttamente in un grafico di lavoro?

Allo stesso tempo, congratulazioni a coloro che non hanno pensato di disabilitare la tracciatura grafica nei loro robot di trading nel tester non visivo.

Avrei potuto controllare anche sul grafico. Tuttavia, ho pensato che sarebbe stato più facile farlo nello Strategy Tester. Inoltre, ho avuto una situazione, che ho descritto sopra, quando la visualizzazione era basata su CCanvas e ha seriamente rallentato l'Expert Advisor nel tester. Soprattutto si mostrava sulle zecche. Per dimostrarlo nel grafico, l'uscita del testo dovrebbe essere fatta in loop. Cioè, per fare un grande tasso di aggiornamento, come è fatto nel mio Expert Advisor con ottimizzazione offline su cui sto lavorando ora. E ho deciso di fare una visualizzazione basata su etichette, perché Canvas l'avrebbe rallentato. Perché, come hai notato, l'etichetta è resa in un thread diverso, quindi, non rallenterà l'ottimizzazione autonoma dell'EA, che ho in esecuzione in un ciclo.

Risulta che, come hai detto tu, ci vuole più tempo per disegnare il testo nelle etichette che per disegnare OBJ_BITMAP_LABEL. Quindi, per renderlo più veloce, deve anche essere renderizzato in un thread separato. Ma come? Se questo non può essere fatto, allora dal punto di vista diun'applicazioneche usaOBJ_LABEL, è più veloce di OBJ_BITMAP_LABEL...

 
Nikolai Semko:
Questo è ovvio per un programmatore esperto.

È ovvio per un programmatore esperto che ha studiato in dettaglio o conosce a fondo il terminale! E poiché non sono uno sviluppatore del terminale, ma scrivo solo applicazioni per esso, potrei non sapere, come la maggior parte dei programmatori, ciò che non è nella documentazione MQL.

 
Mihail Matkovskij:

Questo è ovvio per un programmatore esperto che ha studiato in dettaglio o conosce a fondo il funzionamento del terminale! E poiché non sono uno sviluppatore del terminale, ma scrivo solo applicazioni per esso, potrei non sapere, come la maggior parte dei programmatori, ciò che non è nella documentazione MQL.

Eppure state cercando di discutere non solo con uno sviluppatore, ma con il direttore di MQ.

 
Alexey Viktorov:

Eppure state cercando di discutere non solo con uno sviluppatore, ma con il direttore di MQ.

Non sto cercando di discutere, ma di scoprire se OBJ_BITMAP_LABEL può essere reso meno costoso di OBJ_LABEL dal punto di vista dell'applicazione che lo usa!

 
Mihail Matkovskij:

E ho deciso di fare un display basato su etichette, dato che Kanvas avrebbe rallentato le cose.

Sono abbastanza sicuro del perché il tuo canvas stava rallentando.
Perché stavi cercando di stipare più fotogrammi in un fotogramma di 30 millisecondi.
Il fatto è che i frame non ridisegnano (ChartRedraw) più spesso di circa 30 frame al secondo comunque.

Come ho detto qui, la differenza tra kanvas text e Label è che il riempimento dell'array di pixel nel caso delle etichette è asincrono e non controllato da voi, quindi il riempimento dell'array di pixel nel caso delle etichette non avviene più spesso di una volta ogni circa 30 millisecondi.
Ma può succedere con canvas perché non è asincrono (riempimento bitmap). Potete riempire la bitmap dieci volte in 30 millisecondi, ma sarà visualizzata solo una volta, e 9 volte sarà inattiva.
Quindi, come discusso inCanvas is cool!, il programmatore deve controllare il tempo di avvio della BitMap.
Un modello di comportamento potrebbe essere:

  • c'è una funzione che forma la bitmap
  • l'input di questa funzione memorizza l'ora di inizio in una variabile statica in millisecondi.
  • La prossima volta che entrate in questa funzione dovreste controllare se sono passati meno di 30 millisecondi dall'ultima generazione di bitmap. Se sì, allora esci e restituisci false, se no - inizia il riempimento e l'output di una nuova Bitmap.
È più conveniente, naturalmente, introdurre una variabile bool nella classe, permettendo o negando la formazione della tela.
 
Nikolai Semko:

Sono abbastanza sicuro del perché il tuo kanvas stava rallentando.
Perché stavi cercando di stipare più fotogrammi in un fotogramma di 30 millisecondi.
Il fatto è che i frame non ridisegnano (ChartRedraw) più spesso di circa 30 frame al secondo comunque.

Come ho detto qui, la differenza tra kanvas text e Label è che il riempimento dell'array di pixel nel caso delle etichette è asincrono e non controllato da voi, quindi il riempimento dell'array di pixel nel caso delle etichette non avviene più spesso di una volta ogni circa 30 millisecondi.
Ma può succedere con canvas perché non è asincrono (riempimento bitmap). Potete riempire la bitmap dieci volte in 30 millisecondi, ma sarà visualizzata solo una volta, e 9 volte sarà inattiva.
Quindi, come discusso inCanvas is cool!, il programmatore deve controllare il tempo di riempimento della BitMap.
Un modello di comportamento potrebbe essere il seguente:

  • c'è una funzione che forma la bitmap
  • l'input di questa funzione memorizza il tempo di inizio della generazione dell'immagine in una variabile statica in millisecondi.
  • La prossima volta che entrate in questa funzione dovreste controllare se sono passati meno di 30 millisecondi dall'ultima generazione di bitmap. Se sì, allora uscire e restituire false, se no - procedere al riempimento e all'output di una nuova Bitmap.
Sarebbe meglio, forse, introdurre una variabile in una classe che permette di creare una tela.

C'è qualche informazione disponibile da qualche parte dove si può leggere di più? Anche se tutto è chiaro per me, ma comunque l'argomento è abbastanza interessante! Ora rimane da fare la variante di controllo dell'aggiornamento della bitmap e testarla. Sarei sorpreso se la bitmap risultasse più veloce delle etichette.

 

Ecco un esempio che mostra di cosa sto parlando. La base dello script è presa dalla documentazione qui .
Inizia con un array casuale che emette 100 volte 100 linee e genera 100 etichette.
Vengono emessi i primi 100 fotogrammi con etichetta.
Dopo di che emetterà 100 fotogrammi con stringhe di tela.
La tela è la stessa.
In un ciclo Il sonno è documentato. Se il ciclo contiene Sleep(0), la situazione sarà molto diversa. Si può sperimentare un po'.
Tutti i fotogrammi e le linee sono numerati per il controllo.
Ho registrato un video e l'ho rallentato 30 volte. Potete vedere che solo due fotogrammi su 100 sono stati effettivamente resi per le etichette, inoltre, nel secondo fotogramma potete vedere che le etichette provengono da fotogrammi diversi, cioè potete vedere l'asincronia che funziona.

quindi questi valori per l'etichetta sono falsi:

Kanvas, d'altra parte, produce circa 60-70 fotogrammi su 100. Questo è successo perché il frame è formato un po' più velocemente di 30 millisecondi e quindi non tutti i frame hanno il tempo di essere emessi, anche se tutti i frame sono formati.
Sperimentate i due parametri superiori

e il ritardo del ciclo.


Se aumentate il numero di linee da emettere, potreste incorrere nell'errore 4001. Questo è un bug in MQ quando ci sono troppe uscite.

File:
Motivazione: