Bug MQL5 quando si lavora con accesso alle serie temporali iClose/iOpen, ecc. - pagina 4

 
Renat Fatkhullin:

Subito sul codice e sul lavoro:

  1. La funzione CopyXXX negli indicatori non aspetta il download sincrono completo dei dati, ma dà quello che è disponibile. Altrimenti gli indicatori rallenterebbero molto.

  2. Sembra esserci un problema con il follow-up, se tutti i dati non sono stati sincronizzati la prima volta.
    È necessario passare a una modalità delicata "aspetterò attentamente che il download abbia successo". Per esempio, OnCalculate non viene chiamato.

  3. La cosa negativa è che un'inizializzazione globale con il massimo carico è posta in OnInit dove l'indicatore conta e aspetta per un tempo molto lungo.
    In questo caso l'aggiornamento dei grafici di questo simbolo è bloccato e molti altri partecipanti devono aspettare e non ricevere dati freschi. L'indicatore non dovrebbe prendere risorse per molto tempo. È meglio allungare la lunga inizializzazione passo dopo passo/inizializzazione del simbolo in OnCalculate, contando passo dopo passo.

  4. Ho fatto pompare a questo indicatore circa 800 MB di dati storici sulla rete per la sincronizzazione

  5. L'indicatore ha 512 linee di disegno per le quali viene assegnata esplicitamente della memoria. Questo è estremamente costoso. Si usano solo 100 linee.

  6. Il codice è poco leggibile

1. sì, è per questo che devo chiamarli più volte con una pausa, o riavviare l'indicatore manualmente più volte, ma anche questo non sempre aiuta e l'indicatore smette di calcolare dopo qualche tempo

2. Ammetto che la versione attuale non è ottimale; ho provato diverse varianti, compresa la funzione consigliata nella documentazione (sezione "organizzare l'accesso ai dati"); nell'ultima versione l'ho semplificata un po', e probabilmente non è ottimale nemmeno chiamare molte volte le funzioni iBarShift, ma d'altra parte se le rifiutate, dovete creare una funzione speciale per preparare i dati sincronizzati che non posso ancora scrivere, è molto macchinoso, e non esiste una funzione standard, inoltre se il linguaggio ha una funzione standard per richiedere il tempo n

3. OnInit definisce solo le combinazioni di portafoglio e assegna i buffer, nessuna richiesta in OnInit. Opzionalmente ho provato ad aprire i grafici di tutti gli strumenti M1 in background per evitare la scomparsa della cache, e sembra aiutare, naturalmente al massimo carico è tutto terribile, 28 grafici... La prima richiesta di dati è in OpsCalculate dove chiamo CopyClose in loop con pausa (funzione RequestData) per i dati da memorizzare nella cache e serie per tutti gli strumenti da raccogliere e poi viene la chiamata (SetupIntervals, CalculateEquity e altri) e ho pensato che in questo modo, tutti i dati saranno pronti e tutte le chiamate di iBarShift e iClose e altre funzioni utili restituiranno dati memorizzati nella cache, ma in qualche modo non funziona sempre

4. devono essere 800 mb di dati di tick...? Ma non so come altro potrei formare un gruppo di portafogli con 28 strumenti, dovrebbero essere richiesti comunque, in mt4 non c'è stato alcun problema (probabilmente perché tutti i timeframe esistono separatamente in mt4)

5. Il fatto è che l'indicatore presuppone che ci siano molte combinazioni di portafoglio, ora c'è una combinazione preimpostata con 420 linee + linee di servizio (tutti i tipi di bacchette, canali, ecc.), teoricamente l'utente può richiedere tutte le 512 linee, il numero di buffer non può essere limitato in anticipo usando #property indicators_buffers, perché non si sa quante saranno richieste dall'utente, in mt4 è in ritardo al massimo carico, ma funziona

6. Lo commenterò se necessario.


P.S. Ho pensato che forse avete scaricato la versione sbagliata, perché ho fatto un errore la prima volta e ho postato una versione diversa, poi ho corretto l'allegato.

P.P.S. Voglio approfittare dell'occasione per chiarire la funzionalità dei grafici sintetici, questa funzionalità sarà in qualche modo sviluppata? Per esempio voglio fare non solo la formula indici, ma simulare la posizione di acquisto/vendita di un gruppo di strumenti, ora è difficile da fare perché devo scrivere una formula ingombrante per il valore del punto e la dimensione del contratto, e il valore del punto non cambia sulla storia ...

 

Renat Fatkhullin:

L'indicatore non dovrebbe occupare risorse per molto tempo. È meglio allungare uniformemente la lunga inizializzazione a un'inizializzazione passo dopo passo/carattere in OnCalculate, calcolando a pezzi.

È chiaro, per non rallentare gli altri programmi nel terminale, ma c'è una contraddizione: quando calcola il modello del portafoglio, l'indicatore ha bisogno di tutte le righe di dati in una volta, perché il patrimonio netto del portafoglio è calcolato da loro, cioè non può calcolare nulla senza i dati pronti, e il portafoglio ha bisogno di tutti i componenti in una volta, e se ci sono diversi portafogli e se il confronto o la somma dei portafogli è fatto, allora ha bisogno di tutti i portafogli in una volta, e poi non è molto allungato - non è una finestra scorrevole che può essere calcolato in parti, qui il calcolo è fatto prima - Ecco perché ho sollevato la questione di una funzione standard universale che prepari correttamente un array di dati sincronizzati per il calcolo.

 
Vladimir Karputov:

Scaricato da

Ora è 18.10 e tutto funziona.


Mi congratulo con te, sei stato fortunato e non hai la CPU, la memoria, il sistema operativo o altro...ma questo non rende il bug non reale.

È reale e non sta succedendo solo a me.

 
transcendreamer:

Questo è comprensibile, per non rallentare altri programmi nel terminale, ma c'è una contraddizione: quando si calcola il modello di portafoglio, l'indicatore avrà bisogno di tutte le righe di dati in una volta sola, perché l'equità del portafoglio è calcolata usando loro, cioè, senza dati pronti è impossibile calcolare qualcosa, e il portafoglio ha bisogno di tutti i componenti in una volta sola, e se ci sono diversi portafogli e se c'è un confronto o una somma tra portafogli, allora per diversi portafogli, e poi non può allungarsi, perché non è una finestra scorrevole che può essere calcolata in parti, qui prima si fa il calcolo - Ecco perché ho fatto la domanda su una funzione standard universale che prepari correttamente un array di dati sincronizzati per il calcolo.

Questo è il difetto chiave. Ho lo stesso problema.

Il calcolo e la visualizzazione funzionano istantaneamente in mt4, ma non ci sono problemi con gli indicatori in mt5, mentre tutti i grafici da cui ho bisogno di ottenere i prezzi sono sempre aperti. Si è scoperto che posso scrivere solo indicatori semplici, come le MA a singolo buffer (

 

C'è sicuramente un bug:

1) Server 2012 (build 9200) su Hyper-V x64, IE 10, RDP, UAC, Intel Xeon E5-2687W v2 @ 3.40GHz, Memoria: 3033 / 3839 Mb, Disco: 96 / 107 Gb, GMT-5

2) Windows Server 2012 R2 (build 9600) x64, IE 11, RDP, UAC, QEMU versione virtuale (cpu64-rhel6), Memoria: 1340 / 2047 Mb, Disco: 15 / 28 Gb, GMT+2


 
Stanislav Dray:

C'è sicuramente un bug:

1) Server 2012 (build 9200) su Hyper-V x64, IE 10, RDP, UAC, Intel Xeon E5-2687W v2 @ 3.40GHz, Memoria: 3033 / 3839 Mb, Disco: 96 / 107 Gb, GMT-5

2) Windows Server 2012 R2 (build 9600) x64, IE 11, RDP, UAC, QEMU versione virtuale (cpu64-rhel6), Memoria: 1340 / 2047 Mb, Disco: 15 / 28 Gb, GMT+2

Ho:

Windows 7 Service Pack 1 (build 7601) x64, IE 11, Intel Core i5-2400 @ 3.10GHz, Memoria: 469 / 8182 Mb, Disco: 96 / 148 Gb, GMT+2

 
transcendreamer:

Questo è comprensibile, per non rallentare altri programmi nel terminale, ma c'è una contraddizione: quando si calcola il modello di portafoglio, l'indicatore avrà bisogno di tutte le righe di dati in una volta sola, perché l'equità del portafoglio è calcolata usando loro, cioè, senza dati pronti è impossibile calcolare qualcosa, e il portafoglio ha bisogno di tutti i componenti in una volta sola, e se ci sono diversi portafogli e se c'è un confronto o una somma tra portafogli, allora per diversi portafogli, e poi non può allungarsi, perché non è una finestra scorrevole che può essere calcolata in parti, qui prima si fa il calcolo - Ecco perché ho fatto la domanda su una funzione standard universale che preparerebbe correttamente un array di dati sincronizzati per il calcolo.

Dovreste scrivere l'indicatore con la chiara comprensione che non otterrete tutto in una volta.

In OnInit dovreste stimolare il caricamento della storia degli strumenti richiesti da singole chiamate di CopyXXX, ma dovete aspettare l'inizializzazione completa in OnCalculate.

La vostra fase di inizializzazione sembra avere un errore - aspettate erroneamente i dati e vi bloccate.

 
Renat Fatkhullin:

Mettete il codice al lavoro. Finora tutto bene.

File senza corpo, comunque.

In 2 ore tutto è a posto, il timer ticchetta nei commenti con la data giusta.
 
Vitaly Muzichenko:

Questo è il difetto chiave. Ho lo stesso problema.

In mt4 il calcolo e la visualizzazione funzionano istantaneamente, ma in mt5 c'è un problema completo con gli indicatori, anche se tutti i grafici da cui si desidera ottenere i prezzi sono sempre aperti. Si è scoperto che posso scrivere solo indicatori semplici, come le MA a singolo buffer (

Capisco che tutto è fatto per velocizzare il terminale e i programmi in esso contenuti.

 
Vitaly Muzichenko:

Questo è il difetto chiave. Ho lo stesso problema.

In mt4 il calcolo e la visualizzazione funzionano istantaneamente, ma in mt5 c'è un problema completo con gli indicatori, anche se tutti i grafici da cui vuoi ricevere i prezzi sono sempre aperti. Si scopre che posso solo scrivere indicatori semplici, come le MA a singolo buffer (

Devo guardare il codice.

Qui nel codice sopra c'è chiaramente un mucchio di problemi logici e di risorse.

Motivazione: