Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1688

 
Ok, uomini di scienza, allora spiegate perché l'incremento magico si ferma a 2 mentre quello unico no. Nel codice sorgente apriamo 10 ordini e ad ognuno di essi dovrebbe essere assegnata una magia unica tramite incremento iniquo e la loro unicità dovrebbe essere controllata tramite confronto (!=) in loop annidati: su una magia di incremento c'è un passaggio con confronto di tutte le magie degli ordini, se non c'è corrispondenza, allora unica sarà uguale al numero di quelle miscele e se è uguale o maggiore del numero di ordini allora la magia è unica e verrà assegnata all'ordine.

Non so se questo è troppo complicato, ma penso che sia più facile da capire se guardiamo il codice.
File:
 
pribludilsa #:
Il fatto è che il modulo è conveniente in quanto, dandogli un numero di elementi, può riempire qualche array. Tutto andrà in crash se viene inserito 0, perché ArrayResize è legato al numero di posizioni. Per questo motivo ho una condizione aggiuntiva se il numero di posizioni è superiore a 0, allora questo ciclo. Anch'io faccio sempre confusione, ora l'ho ricontrollato. Il consiglio è corretto, perché altrimenti il modulo non riempirà l'elemento zero dell'array, che è ciò a cui serve il modulo.

Sì, ho problemi costanti a causa di questo. Spero che questa chiarezza riduca il numero di ore passate a correggere i bug.

 
Nerd Trader #:
Ok, uomini di scienza, spiegate allora perché l'incremento magico si ferma a 2 mentre quello unico no. Nel codice sorgente apriamo 10 ordini e ad ognuno di essi dovrebbe essere assegnata una magia unica tramite incremento iniquo, la loro unicità è controllata dal confronto (!=) in loop annidati: su una magia di incremento c'è un passaggio con confronto di tutte le magie degli ordini, se non c'è corrispondenza, allora unica sarà uguale al numero di quelle non abbinate e se è uguale al numero di ordini allora la magia è unica e sarà assegnata ad un ordine.

Non so se è troppo complicato, ma penso che sia più facile da capire se guardiamo il codice.

Se hai bisogno del ciclo per creare 10 ordini con diversi maghi, è quello che dovresti fare.

    for(int i = 0; i < 10; i ++)
    { 
    int order_send = OrderSend(Symbol(), OP_BUY, 0.01, Bid, 10,
    0, 0, "", i, 0, CLR_NONE);
    if(order_send == -1) ResetLastError();
    }

In questo caso ho il ruolo non solo di controllare il ciclo, ma anche il mago dell'ordine.


Ma nel tuo esempio, ci sono molti errori che hanno creato una specie di puzzle. Poche persone indagheranno a fondo su quale sia la ragione...

Beh, come minimo, il ciclo dell'ordine è sbagliato... E la variabile magica è locale e si azzera di continuo... (non si accumula)

 
Nikolay Ivanov #:

Se hai bisogno del ciclo per creare 10 ordini con diversi maghi, è quello che dovresti fare.

In questo caso i ha il ruolo non solo di controllare il ciclo, ma anche il mago dell'ordine.


Ma nel tuo esempio, ci sono molti errori che hanno creato una specie di puzzle. Poche persone indagheranno a fondo su quale sia la ragione...

Beh, come minimo, il ciclo dell'ordine è sbagliato... E la variabile magica è locale e si azzera di continuo... (non si accumula)

Questo codice è per il test e l'EA non creerà ordini in un tale ciclo; c'è una logica che non dovrebbe essere inclusa nel test. Perché il ciclo degli ordini è sbagliato? La magia dovrebbe essere cancellata, non c'è motivo che si accumuli. E non c'è niente da capire qui, ci sono solo due loop annidati con un paio di righe di codice all'interno.

 
Nerd Trader #:

Sì, ho problemi costanti a causa di questo. Spero che questo chiarimento riduca molte volte il numero di ore spese per risolvere i bug.

Anche io ci ho messo un po' a capirlo. L'ironia è che ho iniziato a capirlo nello stesso momento in cui altri utenti hanno postato la stessa cosa qui. Avevo solo il giusto copia-incolla, poi l'ho sistemato e l'ho scritto male, perché ho controllato solo l'input del ciclo e ho dimenticato l'output. Controllate il codice con la stampante forzando i valori di controllo.
 
Nerd Trader #:

Questo è codice per i test, l'EA non creerà ordini in un tale ciclo, c'è una logica per questo che non dovremmo aggiungere ai test. Perché il ciclo dell'ordine è sbagliato? La magia dovrebbe essere azzerata, non c'è motivo che si accumuli.

Non c'è nessun -1.

for(int i = OrdersTotal()-1; i >= 0 ; i --)

Se la magia è progettata in quel modo, allora si scopre che c'è un errore nella logica (nel disegno complessivo) e dobbiamo risolvere un puzzle per trovarlo...

 
Nikolay Ivanov #:

no -1

Se la magia è progettata in quel modo, allora c'è un errore di logica (nel disegno complessivo), bisogna risolvere il puzzle per trovarlo...

A meno che non sia questo. Ma -1 non risolve nulla neanche lì. Perché c'è un errore? La magia sarà data quando la magia è uguale o superiore al numero di ordini. Se la magia deve essere azzerata, altrimenti se chiudiamo diversi ordini con magia 5 e 6, i nuovi saranno più alti della magia dell'ultimo ordine, cioè 11-12 e così via. E in questo modo quando un ordine viene azzerato, viene confrontato e iterato a partire da zero, il che dà come risultato dei nuovi ordini con le maggiorazioni di quelli chiusi, cioè 5 e 6...

 
pribludilsa #:
Anche a me ci è voluto molto tempo per capirlo. L'ironia è che ho iniziato a capirlo nello stesso momento dei post di altri utenti sulla stessa cosa qui. Avevo solo il giusto copia-incolla, poi l'ho sistemato e l'ho scritto male, perché ho controllato solo l'input del ciclo e ho dimenticato l'output. Controllare il codice con una stampante, forzando i valori di controllo.
È così fastidioso che mql4 non abbia un debugger decente. Anche su dati reali nella fonte di cui sopra, il debugger non entra in loop. Devo accontentarmi della stampa, ma non è grave.
 

Fondamentalmente è semplice, il tuo unico riassume tutti gli ordini spaiati tra diversi maghi...

Per esempio ci sono 3 ordini

La prima iterazione di magic=1 unico=0, alla fine dell'iterazione unico sarà=2.

La seconda iterazione magik=2unico=2, alla fine dell'iterazioneunico sarà=3

Poiché 3>=numero di tutti gli ordini, il ciclo while si interrompe... E la magia =3 non è mai stata controllata... Quindi magia =2 di nuovo e così via con tutti...

 
pribludilsa #:
Oh, giusto, grazie. Ma si scopre che è una stampella. Proprio come l'intera faccenda di mql .

Puntate apiù- TUTTI i linguaggi di programmazione.

È semplice: nei linguaggi di programmazione, il conteggio inizia da zero. La prima cella di una matrice avrà un indice di 0. Pertanto, dovete fare un ciclo inverso PRIMA di zero INCLUDENDOLO. Cioè >=0

OrdersTotal() produce, per esempio, 10. E iniziate un ciclo da 10, mentre l'ultimo indice dell'array è 9 (ricordate, stiamo partendo da zero?). E cosa succede quando si accede a una cella di un array inesistente? Proprio così - il programma andrà in crash per un errore critico, perché siete andati in un'area di memoria non allocata, oltre i limiti dell'array.

Queste sono stampelle solide di sicuro. Leggete, imparate e tutto verrà da voi.