Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1423
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
Hai provato a rendere le variabili globali?
Volevamo controllare le condizioni per trovare un ingresso EA non ogni tick, ma solo quando un altro ordine viene aperto o chiuso da un altro EA o manualmente (in modo che il processore non sia sovraccaricato). Per questo dobbiamo controllare se il numero di ordini corrisponde ad ogni tick.
Possiamo usare una variabile statica ? Il programma funzionerà in tale forma?
In alternativa, la condizione più semplice e più facile
OnTrade() è un analogo per mt4 con mt5
Grazie per la vostra risposta. Ho capito tutto quello che hai scritto. Ma non ho capito il senso di quello che hai scritto in termini del mio problema.
Per array bidimensionale orizzontale nel mio codice intendo quando ci sono 2 righe sotto l'indice 0 o 1 e colonne sotto gli indici da 0 a 30. La prima dimensione è indicata come[0][0],[0][1],[0][2], ...[0][30] La seconda dimensione è indicata come[1][0],[1][1],[1][2], ...[1][30]
Per array bidimensionale verticale nel mio codice intendo quando ci sono 31 righe indicizzate da 0 a 30 e 2 colonne indicizzate 0 e 1. La prima dimensione è indicata come[0][0],[1[0],[2][0], ...[30][0] La seconda dimensione è indicata come[0][1],[1][1],[2][1], ...[30][1]
Se eseguite il mio codice, l'array si riempirà verticalmente. E la funzione ArraySort() ordinerà l'array come dovrebbe.
DOMANDA Perché la funzione ArrayFill() non funziona in questo caso ? Dopo tutto, gli ho chiesto di riempire la prima dimensione dell'array (31 elementi) con gli stessi valori 0,5555.
Grazie per l'aiuto.
MQL4 può lavorare con non più di 4 matrici dimensionali. Quindi, arr[31][31] è un errore. Un array non può essere più grande di arr[][4]. E la prima dimensione è limitata non da MQL, ma da cosa, non so esattamente. Forse qualcuno può spiegare.
La funzione ArrayFill() funzionerà, ma dobbiamo capire che il numero di elementi nell'array arr[3][2] sarà 6, e dobbiamo scrivere 6 in questa funzione, non 3 per la dimensione della prima dimensione.
Dimensione quadridimensionale: arr[][][][][] o arr[,,,].
Le dimensioni delle ultime tre dimensioni devono essere specificate nella dichiarazione e fissate. La prima dimensione può essere lasciata non specificata e può essere modificata in seguito:
Nell'esempio di una matrice bidimensionale, i dati nella matrice sono disposti come segue:
Ordina sposta l'intero orizzontale ordinando per la prima dimensione,
e ArrayFill() riempie da un elemento all'altro, per esempio da 3 a 8. Questo si traduce in un pasticcio.
Se volete riempire alcuni valori in orizzontale dalla prima dimensione, dovete controllare l'inizio e la fine del riempimento, sapendo come sono disposti i dati.
Per esempio, l'intero righello dell'elemento zero della prima dimensione:
Se solo un elemento zero, allora sì:
Se molti elementi zero, allora con il looping e l'assegnazione semplice.
Non devo essermi spiegato molto bene... Usa la stampante, stampa tutto nel ciclo, di qua e di là, e ci prenderai la mano. Imparerai più velocemente in questo modo.
printf è mio amico!
MQL4 non può gestire più di 4 matrici dimensionali. Quindi, arr[31][31] è un errore. Un array non può essere più grande di arr[][4]. E la prima dimensione è limitata non da MQL, ma da cosa, non so esattamente. Forse qualcuno può spiegare.
E la prima dimensione (cioè il numero di stringhe) di quanti è limitata? Non più di quante righe in un array multidimensionale permette MQL4?
Credo che tutte e quattro le dimensioni abbiano un limite:INT_MAX
Sulla struttura.
bidimensionale:
Per struttura, rappresenta un array unidimensionale in cui gli elementi sono disposti come segue: prima la prima riga, poi la seconda, poi la terza.
tridimensionale:
Anche in tridimensionale. È un array unidimensionale, dove le prime righe sono una dopo l'altra, poi la seconda,.....
Perché unidimensionale? Perché diverse celle in una riga sono allocate per l'array nella memoria del computer, quindi scrivono tutto in ordine: row00+row01+row02+row10+row11....
Ed è anche possibile aggiungere una quarta dimensione: pile di fogli di matrice tridimensionale.
Solo il numero di righe può essere cambiato nel corso del programma. Tutte le righe, colonne, fogli e pile sono solo una convenzione per capire la struttura. Le dimensioni non sono effettivamente nel nostro spazio, sono solo misure.
Come dice Alexei:
... colonna ... è ... orizzontalmente perché lo sto guardando sdraiato sul divano.........
Avete notatola seguente nota
L'arraymultidimensionale quando viene elaborato con ArrayFill() vienerappresentato come unidimensionale, per esempio, array[2][4] viene elaborato come array[8], quindi quando si lavora con questo array è accettabile specificare l'indice dell'elemento iniziale uguale a 5. Quindi, chiamare ArrayFill(array, 5, 2, 3.14) per array[2][4] riempirà gli elementi array[1][1] e array[1][2] con il valore 3.14.
Ho capito tutto tranne ArrayFill().
1. Quando dichiaro un array doppio LoY[31][31]; sto essenzialmente creando una tabella di 31 righe per 31 colonne. Ho creato un array bidimensionale (invece che quadridimensionale), ma non l'ho ancora riempito.
2. Poi nel codice riempio ogni singolo elemento dell'array con un valore Bid. Posso riempirlo con 2 opzioni
a) LoY[31][0]=Bid; - riempio la riga 31 e la prima colonna dell'array con i valori Bid. E la seconda dimensione (colonna sotto l'indice 1, è riempita con 0 per default, perché non la riempio. Così in questa variante ho laprima dimensione con 31 elementi riempiti e la seconda dimensione con 1.
b) LoY[0][31]=Bid - Riempio la colonna 31 e la prima riga dell'array con i valori Bid . E la seconda dimensione (linea sotto l'indice 1, è riempita con 0 per default, perché non la riempio. Così, in questa variante, la seconda dimensione consiste di 31 elementi riempiti, la seconda dimensione consiste di 1.
ArraySort() ordina l'array bidimensionale solo per la prima dimensione. Perciò ordinerà l'opzione a) in cui la prima dimensione ha 31 righe e non ordinerà l'opzione b), in cui la prima dimensione ha solo 1 riga, perché 1 riga non può essere ordinata.
OraArrayFill() Tira l'array bidimensionale in una sola riga prima di assegnare i valori richiesti agli elementi dell'array bidimensionale. Cioè, dovrà tirare il mio array LoY[31][31] in una sola linea di dimensione 961 elementi. È una stringa molto lunga e la maggior parte degli elementi saranno inutili.
Quindi facciamo un array LoY[31][2] (variante a))o LoY[2][31] (variante b))
È chiaro comeArrayFill() disegnerà in 1 linea nella variante b). La seconda linea si unirà semplicemente alla prima e dopo l'ultimo elemento della prima linea LoY[0][31] la prima linea dell'array in ArrayFill() continuerà conLoY[0][32] e finirà conLoY[0][62] E i valori degli elementi dell'array in ArrayFill() andranno nel seguente ordine dall'indice 0 a 31 gli elementi dell'array saranno riempiti con valori di prezzo e dall'indice 32 alla fine saranno riempiti con 0 .
DOMANDA: come faArrayFill() a disegnare l'opzione a) in 1 linea? Dopo tutto, ci sono 28 righe in questa variante. E se sarà una riga, in quale ordine conterrà i valori degli elementi dell'array? E posso usare Print() per stampare gli elementi del mio array bidimensionale dopo che ArrayFill() li converte in un array unidimensionale? Questa stessa funzione non restituisce alcun valore e quindi Print() non lo stampa se viene inserito.
Grazie per l'aiuto.
Ho fatto un po' di confusione qui... mi vergogno di me stesso.
elemento dell'array con un valore Bid. Posso riempirlo con 2 opzioni
a) LoY[31][0]=Bid; - riempio la riga 31 e la prima colonna dell'array con i valori Bid. E la seconda dimensione (colonna sotto l'indice 1, è riempita con 0 per default, perché non la riempio. Così in questa variante ho laprima dimensione con 31 elementi riempiti e la seconda dimensione con 1.
b) LoY[0][31]=Bid - Riempio la colonna 31 e la prima riga dell'array con i valori Bid . E la seconda dimensione (linea sotto l'indice 1, è riempita con 0 per default, perché non la riempio. Così, in questa variante, la seconda dimensione consiste di 31 elementi riempiti, la seconda dimensione consiste di 1.
ArraySort() ordina l'array bidimensionale solo per la prima dimensione. Perciò ordinerà l'opzione a) in cui la prima dimensione ha 31 righe e non ordinerà l'opzione b), in cui la prima dimensione ha solo 1 riga, perché 1 riga non può essere ordinata.
OraArrayFill() Tira l'array bidimensionale in una sola riga prima di assegnare i valori richiesti agli elementi dell'array bidimensionale. Cioè, dovrà tirare il mio array LoY[31][31] in una sola linea di dimensione 961 elementi. È una stringa molto lunga e la maggior parte degli elementi saranno inutili.
Quindi facciamo un array LoY[31][2] (variante a))o LoY[2][31] (variante b))
È chiaro comeArrayFill() disegnerà in 1 linea nella variante b). La seconda linea si unirà semplicemente alla prima e dopo l'ultimo elemento della prima linea LoY[0][31] la prima linea dell'array in ArrayFill() continuerà conLoY[0][32] e finirà conLoY[0][62] E i valori degli elementi dell'array in ArrayFill() andranno nel seguente ordine dall'indice 0 a 31 gli elementi dell'array saranno riempiti con valori di prezzo e dall'indice 32 alla fine saranno riempiti con 0 .
DOMANDA: come faArrayFill() a disegnare l'opzione a) in 1 linea? Dopo tutto, ci sono 28 righe in questa variante. E se sarà una riga, in quale ordine conterrà i valori degli elementi dell'array? E posso usare Print() per stampare gli elementi del mio array bidimensionale dopo che ArrayFill() li converte in un array unidimensionale? Questa funzione in sé non restituisce alcun valore, quindi Print() non lo stamperà se viene inserito.
Grazie per il vostro aiuto.
Ho difficoltà a capirti. Forse è per questo che non riesco a capire bene. Ripetete la domanda con la matrice LoY[5][3], cioè 5 righe e 3 colonne.
ArrayFill non converte l'array iniziale in alcun modo. Elabora solo l'array come se fosse un array unidimensionale. La funzione esegue le azioni necessarie sull'array e rientra senza influenzare la dimensionalità.
Secondo la documentazione, la funzioneArrayFill(LoY, 3, 6, 12) riempirà solo le righe con indice 1 e 2 nell'array LoY con il valore 12.
LoY[1][0] sarà riempito con 12.
LoY[1][1] avrà il valore 12.
LoY[1][2] avrà il valore 12.
LoY[2][0] avrà il valore 12.
LoY[2][1] avrà il valore 12 .
LoY[2][2] sarà impostato su 12 .
Tutti gli altri saranno lasciati intatti.
Sperimentate con una piccola matrice e con numeri facili da capire. Per esempio 12 e 8 si noterà facilmente quale è più grande. E 1.123654 e 1.123583 è più complicato
ArrayFill non converte l'array originale in alcun modo. Elabora solo l'array come se fosse un array unidimensionale. La funzione esegue le azioni necessarie sull'array e lo scarica senza disturbare la dimensionalità.
Questo ha ridotto di molto la mia incomprensione e ha aumentato la mia comprensione. Ora rianalizzerò tutto quello che ho scritto tenendo conto delle nuove circostanze scoperte ....
Secondo la documentazione, la funzioneArrayFill(LoY, 3, 6, 12) riempirà solo l'array LoY con le righe 1 e 2 con 12.
LoY[1][0] avrà un valore di 12.
LoY[1][1] avrà il valore 12.
LoY[1][2] avrà il valore 12.
LoY[2][0] avrà il valore 12.
LoY[2][1] avrà un valore di 12 .
LoY[2][2] sarà impostato su 12 .
DOMANDA
Come e quali valori dovrei inserire inArrayFill() se ho bisogno di riempire gli elementi gialli dello stesso array con il valore 12?
OPZIONE N 1
OPZIONE N 2