![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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
Per tutte le barre l'indicatore è calcolato una volta sola - cioè può essere un po' lento all'avvio sulla storia agromadica.
Successivamente una coppia di valori viene ricalcolata - tutto deve funzionare :)
Non dimenticate che i programmatori sono persone a cui piace saltare manualmente nel loro tempo libero dalla programmazione. E ogni nuovo timeframe è un'altra deinizializzazione e inizializzazione dell'anatomia dell'indicatore, tutti i calcoli saranno eseguiti di nuovo. Perciò, ArrayInitialize() sarà attivata ogni volta, quando si salta da un TF all'altro. Se l'indicatore è complesso con diversi buffer che hanno bisogno di essere reinizializzati, i ritardi si accumulano, e non parlo nemmeno di overflow di memoria, che viene allocata automaticamente.
Come sono ingenuo! Mi trovo sempre fiducioso, che l'inizializzazione in OnInit() sia sufficiente, e posso perdere tempo in questa fase, affondando la testa in compiti più pressanti in OnCalculate(). Ma no, non è così. A proposito, la scrittura più o meno riuscita di indicatori complessi non mi ha fatto capire perché ArrayInitialize() deve essere contenuta esattamente in OnCalculate(), controllandola ad ogni tick, invece della primaria e unica inizializzazione in OnInit(). Attraverso la mia esperienza, ho trovato solo casi in cui il rifiuto di questa variante ha immediatamente causato problemi, ma di questo parlerò più avanti. Per ora vorrei notare che dal punto di vista della semplice e ovvia logica umana (piuttosto che logica del codice) ArrayInitialize() in OnCalculate() sembra molto riprovevole, tenendo conto che non ho mai incontrato casi in cui
La prima volta il programma verrebbe attivato più di una volta - all'avvio iniziale. Cioè, appaiono nuovi frattali e la condizione è silenziosa. Quindi cosa diavolo sta facendo in OnCalculate()?Sono ancora più ingenuo nel credere che
Si suppone che io sia obbligato a ereditare automaticamente gli array di pulizia e l'effetto dell'algoritmo economico da Fractals.mq5 originale, che è anche lì, ma in una forma leggermente diversa. Ma - ancora e ancora no!!! Ho dovuto pensarci due volte e creare il mio codice copiando dall'indicatore, di cui uso il manico. Ricordo come ho analizzato il codice degli indicatori per la prima volta e sono stato preso alla sprovvista confrontando Fractals.mq5 e l'esempio di iFractals dalla Guida, e mi sono reso conto che il secondo codice era più grande del primo (anche dopo averlo abbreviato molto). Non lo so. Tira tutti i miei cappelli, ma i programmatori in realtà si aspettano di inserire qualcosa nel loro codice in una riga riferendosi a un'intera libreria, classe o qualcos'altro di voluminoso lì, ma qui...
Ora rivelerò l'essenza del problema che ho menzionato prima. Allego il codice dell'indicatore iFractals semplificato ai frattali superiori. Nell'esempio iniziale, il buffer è riempito per tutta la storia. Cambiamo la situazione copiando solo una parte della storia. Commentiamo l'assegnazione dei valori copiati per il primo calcolo e impostiamo il nostro valore più piccolo:
values_to_copy=100; // то же, что amount
Ora saltiamo sui timeframe e inorridiamo di fronte agli artefatti frattali che sono apparsi. Non riuscivo a pensare a niente di meglio che copiare automaticamente il blocco di codice non ereditato clean up arrays da Fractals.mq5 per pulire quella parte di storia dove i frattali non sono necessari: Ora tutto(con un sacco di ridondanza!!!) è pulito perfettamente, e allo stesso tempo Print() mostra quando e quante volte la reinizializzazione funzionerà, oltre a visualizzare la dimensione del buffer. Possiamo vedere che non sono 100, ma molto di più. Se devo togliere la polvere da un tavolo, pulisco la polvere dal tavolo invece di pulire tutto l'appartamento. O il trucco è rassicurarmi a tutti i costi che i superamenti di memoria e di tempo non sono niente, si può trovare un modo per risolvere il problema indirettamente e ignorare il palese divoramento di risorse al di fuori del mio controllo?Un fx, alcune dimensioni dovranno essere impostate... Perché fare un ciclo curvo con limiti diversi, quando si può fare un ciclo diretto con gli stessi limiti)
Altrimenti, l'indicatore sarà basato sulle stampelle.
Onestamente, non volevo essere un peso, ma ho capito in anticipo che i simpatizzanti avrebbero scavato tutto il codice. È come nell'aneddoto su Chapay e Petka, quando Vasily Ivanovich tornò, chiese una pala - risultò rotta - il cavallo fu sepolto - il villaggio fu attaccato dai bianchi mentre Chapay era via. Rendendomi conto che chi vuole entrare nei dettagli del codice altrui molto probabilmente non apparirà, posso solo fare riferimento all'output dell'indicatore, che (a parte i freni e altre mancanze) alla fine sarà: https://www.mql5.com/ru/forum/1111/page577#comment_119227. E ora pensateci e dite: è ragionevole pensare che tutto sia semplice lì e suggerire soluzioni apparentemente ovvie?
Non per niente semplifico e limito il codice prima di chiedere qualcosa in qualsiasi parte particolare. Per questo ti chiedo di limitarti solo a questo, e di non riesumare tutto il cavallo, a meno che non ci sia un dilettante...
In realtà, il quarto - speciale - buffer è più lungo in linea di principio dei primi tre (uguale in lunghezza), e grazie a SetIndexBuffer() si estende per tutta la storia! Se espandiamo i limiti del ciclo al quarto buffer e allo stesso tempo ridimensioniamo i primi tre array ad esso, allora almeno il numero di elementi nel ciclo aumenterà, il che aumenterà il tempo stimato di lettura del segmento di elementi del buffer completamente lasciato. Questa è solo la punta di un iceberg di problemi che emergeranno con tale variante di algoritmo. Inoltre, ci vorrà più tempo per reinizializzare gli altri buffer perché la loro dimensione è diventata più grande. La quarta matrice speciale non può essere riempita esplicitamente con EMPTY_VALUE in else, poiché l'indicatore ha una grave trasposizione di frattali da altri timeframe secondo un certo algoritmo, dove non c'è corrispondenza tra gli indici dei primi tre buffer e il quarto buffer...
//e i valori EMPTY_VALUE sono assegnati agli elementi 0 e 1 degli array, mm... e sulle ultime tre barre)
Come mai? Perché non tutti? Questo non lo capisco. Puoi spiegare? In realtà, non mi riferisco all'assegnazione dei soli valori reali (effettivi), ma alla perlustrazione inevitabile dell'intero buffer. ArrayInitialize(), così come molte altre funzioni di array, sono basate su un ciclo che è implicito per i programmatori finali di MQL.
La domanda su superamento della memoria rimane valida, e gli sviluppatori dovrebbero pensare di introdurre un parametro aggiuntivo inArrayInitialize() che specifichi il numero e meglio ancora i limiti della reinizializzazione del buffer.
P.S.: mi sembra di indovinare perché ArrayInitialize() in OnInit() non è efficiente qui. I buffer sono dinamici, cambiano dimensione, e in OnInit() si inizializzano con valori solo una volta e per la lunghezza corrente, non conoscendo ancora le dimensioni reali dei buffer in OnCalculate().
L'indicatore nel visualizzatore non funziona:
Nel terminale in linea, funziona bene:
Inserisco le seguenti linee nel codice dell'Expert Advisor
Metto questi tre indicatori su un grafico pulito e salvo il modello come Expert Advisor. La foto è online nel mio post precedente.
Sto eseguendo l'Expert Advisor nel visualizzatore.
1. Mostra il modello salvato
2. Provate a eseguire la visualizzazione senza il modello (cioè cancellate prima il relativo file tpl). Nell'ultima build 555, gli indicatori personalizzati aggiunti automaticamente dovrebbero essere visualizzati correttamente.
Tutto funziona. Grazie.
Rimosso il modello. In esperto in OnInit() prescritto:
Inviare il file *.tpl
Ora provato di nuovo con il modello - non funziona. Rimuovendo il template - funziona.
x100intraday:
Ora pensateci e ditemi, vale la pena credere che tutto lì sia semplice e suggerire soluzioni apparentemente ovvie?
tutti i geni sono semplici.
Non ho potuto fare il resto. L'aneddoto sulla domanda sul forum, come rimuovere le tonsille mi ricorda :)
Non sono sicuro di come farlo... Non sono sicuro di come farlo.
tutti i geni sono semplici.
Non ho potuto fare il resto. L'aneddoto sulla domanda sul forum, come rimuovere le tonsille mi ricorda :)
L'esempio di frattali indicatore ortodosso imho limitato. forse aiuterà...
Prossimo codice:
Uscite:
2011.12.05 22:01:28 RectLabel (EURUSD,H1) pos = {12, 176314750}
2011.12.05 22:01:28 RectLabel (EURUSD,H1) altro = {123, 456}
Quindi, la lista di inizializzazione non ha funzionato, c'è della spazzatura nella struttura. È un bug o no?
Ho scollegato due agenti dal cloud e continuano a connettersi ai server del cloud ogni 30 secondi.
MO 0 Rete 00:00:17 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
LK 0 Rete 00:00:47 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
RG 0 Rete 00:01:17 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
NS 0 Network 00:01:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
RO 0 Rete 00:02:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
OK 0 Rete 00:02:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
MG 0 Rete 00:03:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
DR 0 Rete 00:03:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
DN 0 Rete 00:04:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
EJ 0 Network 00:04:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
GF 0 Rete 00:05:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
RR 0 Rete 00:05:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
NN 0 Rete 00:06:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
KJ 0 Rete 00:06:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
QF 0 Rete 00:07:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
HQ 0 Rete 00:07:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
PM 0 Rete 00:08:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
QI 0 Rete 00:08:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
KE 0 Rete 00:09:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
NQ 0 Rete 00:09:51 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
OM 0 Rete 00:10:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
RI 0 Rete 00:10:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
LE 0 Rete 00:11:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
EP 0 Rete 00:11:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
IL 0 Network 00:12:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
HH 0 Network 00:12:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
FD 0 Rete 00:13:18 connesso a 2.agents.mql5.com (attraverso un server proxy
Ho scollegato due agenti dal cloud e continuano a connettersi ai server del cloud ogni 30 secondi.
Andiamo da Servicedesk.
Per favore, chiarisci come esattamente ti sei disconnesso? Avete cancellato (congelato) i servizi? Si prega di allegare i log degli agenti problematici.
Le impostazioni proxy nei tuoi log sono un po' strane. Hai scritto le impostazioni del proxy nelle configurazioni del tuo agente? Allegate common.ini del vostro agent manager alla domanda.