Versione beta del libro online sulla programmazione MQL4 - di Sergey Kovalev (SK.) - pagina 10
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
Sì, il manuale è davvero bello, ma tornando alla mia richiesta precedente - ha bisogno di essere a portata di mano per essere in grado di guardare prontamente.
Idealmente, dovrebbe sostituire l'aiuto standard nelle nuove versioni di MT.
a SK
doppio my_search_and_etc()
{ double summ[]; //array all'interno della funzione
//.........
i=ArrayMinimum(summ,iter,0); // tracciante: <incorporato posizione iniziale 0 per la funzione ArrayMinimum>
//seconda variante di errore
statico doppio summ[]; //
//.........
i=ArrayMinimum(summ,iter,0); // tracciante: <incorporato posizione iniziale 0 per la funzione ArrayMinimum>
//cioè errore di indirizzamento dinamico dell'elemento iniziale dell'array nel secondo tick
//.......................
//........................
//tempo giusto
double summ[1000]; //specificare la dimensione esplicita implica il tipo static
//.........
i=ArrayMinimum(summ,iter,0); // O.k.
//destra due
static double summ[1000]; //riassicurazione alla dimensione esplicita
//.........
i=ArrayMinimum(summ,iter,0); // O.k.
}
a SK
Non sono sicuro di quale sia la tua domanda. L'insieme di stringhe che hai fornito è un codice completo (allora perché l'inizializzazione è ripetuta?) o stringhe di scarto (allora perché ci sono le parentesi graffe?). Inviate il codice finito e formulate la domanda. Usa il pulsante MQL (nella riga superiore della finestra di modifica) per pubblicare il codice.
Congratulazioni a Sergei Kovalev!
Il rilascio del MQL4 Tutorial è previsto per il 1 febbraio, ed è già stato integrato nel sito web MQL4.community. La traduzione in inglese è ben avviata.
Grazie per le tue congratulazioni, Renat.
Vorrei cogliere l'occasione per dirvi ancora una volta che è un grande onore per me pubblicare il tutorial MQL4 sul sito MetaQuotes Software Corp. Vi ringrazio sinceramente per la vostra fiducia, sostegno e incoraggiamento. Ringrazio anche Stanislav Starikov e Rashid Umarov di MetaQuotes Software Corp. per i loro preziosi consigli e l'aiuto nella preparazione del libro di testo.
L'articolo mostra 4 varianti di inizializzazione dell'array con una stessa chiamata diArrayMinimum();
Si dimostra che inizializzare un array in un sottoprogramma senza specificare la dimensione dell'array [] porta all'errore "RunTime
- prime due varianti, l'errore è citato, nella traduzione: "INDIRIZZO errato dell'inizio dell'array".
-secondo due varianti funzionanti, si dimostra che specificare una dimensionalità di [1000] rende automaticamente l'array statico.
Conclusioni:
1) Gli array MQL4 non sono sempre statici,
2) la definizione di static a[], cioè senza dimensionalità esplicita, non funzionerà, ma non ci sarà alcun messaggio di errore. L'errore viene visualizzato in fase di esecuzione al secondo tick e successivi nella finestra di Expert Advisor.
3) Gli errori descritti di statica/dinamica appaiono se l'array è definito nella sub/func, e sono colti solo da chi guarda nella finestra "Expert Advisors",
e solo quando arriva la seconda spunta. Per esempio, l'errore non viene rilevato quando si esegue il debug dell'indicatore durante il fine settimana senza utilizzare lo strategy tester.
4) La linea da manuale "Gli array MQL4 sono sempre statici" può essere legata a build precedenti.
Mi piacerebbe avere una serie di tutorial video oltre a quelli di testo. Avere una serie di video tutorial. Manca soprattutto una primissima lezione: come scaricare, installare il programma e fare il primo acquisto o il primo scambio di Shell.
a SK
L'articolo mostra 4 versioni di inizializzazione di un array con una stessa chiamata diArrayMinimum();
Si dimostra che inizializzare un array in un sottoprogramma senza specificare la dimensione dell'array [] porta all'errore "RunTime
- prime due varianti, l'errore è citato, nella traduzione: "INDIRIZZO errato dell'inizio dell'array".
-secondo due varianti funzionanti, si dimostra che specificare una dimensionalità di [1000] rende automaticamente l'array statico.
Conclusioni:
1) Gli array MQL4 non sono sempre statici,
2) la definizione di static a[], cioè senza dimensionalità esplicita, non funzionerà, ma non ci sarà alcun messaggio di errore. L'errore viene visualizzato in fase di esecuzione al secondo tick e successivi nella finestra di Expert Advisor.
3) Gli errori descritti di statica/dinamica appaiono se l'array è definito nella sub/func, e sono colti solo da chi guarda nella finestra "Expert Advisors",
e solo quando arriva la seconda spunta. Per esempio, l'errore non viene rilevato quando si esegue il debug dell'indicatore durante il fine settimana senza utilizzare lo strategy tester.
4) La linea da manuale "gli array MQL4 sono sempre statici" può essere legata alle build precedenti.
Il tuo ragionamento non è molto chiaro. Si dichiara una matrice senza dimensioni (in effetti, il programma ha solo il nome della matrice, i cui elementi non sono definiti e per i quali non viene allocata memoria), e si cerca, utilizzando la funzione ArrayMinimum(), di trovare il valore minimo tra gli elementi che non esistono. Naturalmente, l'errore si verificherà indipendentemente dal fatto che l'array sia dichiarato come statico o meno, e dovreste trattare l'errore di esecuzione come un'indicazione della proprietà dell'array di essere statico o meno.
Le matrici in MQL4 sono statiche per definizione. Significa (a meno che, ovviamente, non ci sia almeno un elemento nell'array) che gli elementi dell'array sono memorizzati dall'ultima volta che la funzione (che ha dichiarato l'array) è stata terminata fino alla prossima volta che viene chiamata, indipendentemente dal fatto che l'identificatore dell'array abbia o meno la parola chiave static davanti ad essa.
Che mi importa, abbiamo usato questi trucchi di allocazione della memoria per molto tempo.
Ho scritto non sul contenuto dell'array, ma sul suo indirizzamento, su nessun errore di compilazione, nessun errore di collegamento e nessun errore casuale di ADDRESS.
Cioè, il compilatore mi ha permesso di definire un array [] in una subroutine per farlo crescere in seguito, - questo è buono (!),
è l'allocazione dinamica della memoria per array.
Tuttavia, tutti i puntatori a questo array sono collegati come puntatori diretti (ma non puntatori a puntatori),
che porta a una mancata corrispondenza tra gli indirizzi statici collegati e l'indirizzo dell'array appena allocato quando segue l'allocazione dinamica della memoria.
Cioè, il riferimento all'array (puntatore) in MQL4 è ora statico, e funziona correttamente solo quando l'array è davvero statico.
Il compilatore non capisce che l'array sarà spostato in futuro senza la dimensione esplicita all'interno della subroutine.
Il programmatore mette statico e pensa che tutto sia corretto, ma se non specifica una dimensione esplicita - nessun array statico, e l'array risulterà effettivamente dinamico (nessun errore di compilazione/caricamento).
Il problema non è così grande, di solito tutti tengono gli array a livello globale.
Ma è auspicabile scrivere nel tutorial non che presumibilmente tutti gli array sono già statici, ma che si dovrebbero scrivere array locali statici con una dimensione esplicita.
a SK
Il programmatore mette statico e pensa che tutto sia corretto, ma se non specifica una dimensione esplicita - nessun array statico, e l'array risulterà effettivamente dinamico (nessun errore di compilazione/caricamento).
Un programmatore che sa che tutti gli array in MQL4 sono statici non metterà static, semplicemente perché non è necessario.
Forse avete confuso i concetti. In questo caso, "statico" significa la proprietà di memorizzare i valori degli elementi dell'array nell'intervallo tra le esecuzioni della funzione in cui è dichiarato. Gli array conservano sempre i loro valori durante questo tempo, indipendentemente dal fatto che abbiano static davanti al nome (questo non è vero per le variabili locali, però; esse devono essere esplicitamente dichiarate come static).
È possibile, tuttavia, ridimensionare un array nella prima dimensione con ArrayResize().