Ciclo operatore 'per' domande - pagina 4

 

Simon,

Ok, fammi provare ad aggiungere anche il livello di stop all'EA, giusto per sicurezza.

Ah-ha! Il livello di congelamento per USDJPY è 0 e il livello di stop è 30.

Presumo che 30 rappresenti 3 perché il broker è a 5 cifre. Ho provato a usare il MODE_SPREAD e ho ricevuto 20. Ovviamente lo spread su USDJPY non è 20 ma ;) 2.0. Si potrebbe anche dire che 2 pip equivalgono a 20 punti.

Grazie.

 

Un indizio per te. . . .

 

Simon,

Questo sembra essere ancora una volta un problema di selezione dell'ordine.

La funzione OrderClose() sta cercando di chiudere un ordine (non l'ordine USDJPY). Sta cercando di chiudere l'ordine sul grafico EURUSD.

La funzione OrderPrint() è stata precedentemente selezionata prima della sua esecuzione e assomiglia chiaramente al suo scopo come previsto.

Il colore rosso che circonda il prezzo non valido deve indicare SBAGLIATO.

Il colore verde che circonda il USDJPY deve indicare GIUSTO.

Quindi se tutto è vero devo concentrarmi sul cerchio rosso e selezionare l'ordine prima dell'esecuzione della funzione OrderClose().

Grazie.

 
WhooDoo22:


cosa sono Bid e Ask?

Ask è l'ultimo prezzo noto del venditore (prezzo di domanda) per il simbolo corrente.

Bid è l'ultimo prezzo d'acquisto conosciuto (prezzo d'offerta, prezzo d'offerta) del simbolo corrente.

Sai già il motivo per cui la chiusura è fallita. . . . . basta pensare attentamente per un minuto.


Guarda il tuo codice, che prezzo usi per chiudere l'ordine?

 

Simon,

Ask/Bid è l'ultimo prezzo conosciuto del venditore/compratore per il simbolo corrente.

Il prezzo a cui l'EA vuole chiudere l'ordine è il prezzo del simbolo EURUSD.

Perché l'EA dipende dall'essere posizionato su un grafico USDJPY per chiudere il suo ordine? La funzione OrderSelect() aveva lo scopo di selezionare il numero del ticket e una volta selezionato il numero del ticket, l'EA poteva poi selezionare

A quanto pare, l'EA deve essere sul grafico del simbolo USDJPY per chiudere gli ordini su quello


Cancella tutto quello che ho appena detto.

Questa è la soluzione. L'errore sta nel terzo parametro. Sto pensando di specificare il simbolo e poi mettere la variabile ask/bid nel suo parametro (posizione 3° parametro della funzione OrderClose()). Questo dovrebbe eliminare ogni oscurità di pensiero.

Grazie.

 
WhooDoo22:.

Questa è la soluzione. L'errore sta nel terzo parametro. Sto pensando di specificare il simbolo e poi mettere la variabile ask/bid all'interno del suo parametro (posizione 3° parametro della funzione OrderClose()). Questo dovrebbe eliminare ogni oscurità di pensiero.

Grazie.

Bid e Ask sono variabili predefinite e sono rilevanti SOLO per il grafico corrente su cui si trova l'EA. Se vuoi Bid o Ask per un simbolo diverso dal grafico su cui si trova l'EA non puoi usare le variabili predefinite Bid e Ask. Puoi però usare MarketInfo() ;-)
 

Simon,

L'errore sta nel terzo parametro della funzione OrderClose() perché ;) Ask/Bid è l'ultimo prezzo di vendita/acquisto conosciuto per il simbolo corrente. Se "per il simbolo corrente" significa il grafico corrente su cui è posizionato l'EA, allora questo può creare un po' di confusione. Dovrei ricordare che MQL4 è in giro da un po' e ha i suoi metodi unici di illustrazione e rappresentazione.

La soluzione è sostituire le variabili predefinite Ask/Bid con un'alternativa come...

// solution 1.

MarketInfo("USDJPY",MODE_BID);

// solution 2.

MarketInfo("USDJPY",MODE_ASK);

Cosa ne dite di questo?


Ho aggiunto una versione di questo EA che ha la capacità di stampare le informazioni dell'ordine USDJPY e di chiuderlo indipendentemente dal grafico su cui è posizionato. Non ho ancora confermato se ha modificato lo SL e il TP dell'ordine USDJPY, ma lo farò dopo la verifica. L'EA produce un errore finale che non dovrebbe essere difficile da risolvere. Sto lavorando su questo attualmente. ecco un'istantanea della lettura dell'errore:

errore biglietto non valido

Grazie.

 
WhooDoo22:

Simon,

L'errore si trova nel terzo parametro della funzione OrderClose() perché ;) Ask/Bid è l'ultimo prezzo conosciuto del venditore/compratore per il simbolo corrente. Se "per il simbolo corrente" significa il grafico corrente su cui è posizionato l'EA, allora questo può essere un po' confuso. Dovrei ricordare che MQL4 è in giro da un po' e ha i suoi metodi unici di illustrazione e rappresentazione.

La soluzione è sostituire le variabili predefinite Ask/Bid con un'alternativa come...

Cosa ne dici di questo?


Ho aggiunto una versione di questo EA che ha la capacità di stampare le informazioni dell'ordine USDJPY e di chiuderlo indipendentemente dal grafico su cui è posizionato. Non ho ancora confermato se ha modificato lo SL e il TP dell'ordine USDJPY, ma lo farò dopo la verifica. L'EA produce un errore finale che non dovrebbe essere difficile da risolvere. Ci sto lavorando al momento. Ecco un'istantanea della lettura dell'errore:


Grazie.

E ora vedi i limiti del tuo codice . . non hai più un ordine USDJPY, quindi il tuo while trova l'ordine in posizione 0 e non è USDJPY, poi trova il successivo in posizione 1 e non è USDJPY, poi guarda in posizione 2 e OrderSelect() fallisce, questo termina il while ma il resto del codice viene eseguito, questo dà un OrderModify() fallito, un OrderPrint() fallito, un OrderType() fallito e OrderClose() fallito. . cosa sta facendo GetLastError() tutto da solo?
 

Simon,

L'operatore del ciclo 'while' viene eseguito come tale: Se l'espressione è vera, l'operatore viene eseguito finché l'espressione non diventa falsa. Se l'espressione è falsa, il controllo viene dato all'operatore successivo.

Lo scopo del codice nel riquadro SRC qui sotto, è quello di fare quanto segue:

Mentre lavariabile 'i' (contenuta nella funzione OrderSelect() ) NON è il numero di posizione del biglietto USDJPY E il simbolo dell'ordine non è USDJPY, lavariabile 'i' viene aumentata finché la variabile 'i' è il numero di posizione del biglietto USDJPY E il simbolo dell'ordine è USDJPY. Una volta che il ciclo 'while' diventa falso, il controllo viene passato sotto, alla prossima linea di codice.

Ho fornito l'intestazione e il corpo del 'while' per un aiuto visivo.

while(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()!="USDJPY")

i++;

Credo che tu capisca come il ciclo 'while' localizza un biglietto sulla coppia di valute USDJPY anche senza che un biglietto sia attualmente sulla coppia di valute, ma ;) Temo di no.

Come può il ciclo 'while' individuare un biglietto sul grafico USDJPY se non c'è nessun ordine su un grafico USDJPY da individuare?

Credo che tu abbia scritto qualcosa sulla falsariga della localizzazione dell'ordine nella posizione 0. Puoi spiegare meglio questo o eventualmente fornire un link per lo studio?

Grazie.

 
WhooDoo22:


Credo che tu capisca come il ciclo 'while' localizzi un biglietto sulla coppia di valute USDJPY anche senza che un biglietto sia attualmente sulla coppia di valute ma ;) Temo di no.

Come può il ciclo 'while' individuare un biglietto sul grafico USDJPY se non c'è nessun ordine su un grafico USDJPY da individuare?

Credo che tu abbia scritto qualcosa sulla falsariga di localizzare l'ordine nella posizione 0. Puoi spiegare questo o eventualmente fornire un link per lo studio?

Se vuoi scrivere del codice da solo, allora devi svolgere il compito di 3 persone, forse anche 4. La persona che redige il documento dei requisiti, l'ingegnere del software e l'ingegnere dei test. Non basta conoscere la sintassi al contrario ed essere in grado di scrivere codice. . dovete capire il problema che state cercando di risolvere e come lo risolverete, e dovete anche sapere come testare il codice per assicurarvi che soddisfi i requisiti.

Ad un livello di base questo significa passare attraverso il tuo codice linea per linea e assicurarsi che faccia ciò che volevi che facesse, comunemente questo è con una gamma di valori per ogni variabile che va dal loro valore minimo, attraverso i valori tipici al valore massimo.


Facciamo questo con il vostro ciclo while . . .

Quando dichiarate una variabile int senza impostare il suo valore ha un valore iniziale di 0, quindi quando dichiarate i (perché non usare un nome di variabile che sia più descrittivo?) ha un valore di 0, quindi la prima volta nel ciclo whilei è 0, quindi la chiamataOrderSymbol() cerca di selezionare l'ordine in posizione 0, se questo funziona la chiamataOrderSymbol() restituirà il nome corretto del simbolo per l'ordine in posizione 0 e se non è "USDJPY" allora l'espressione(OrderSymbol() !="USDJPY" ) risulterà in un valore vero , se OrderSelect() è vero e il controllo del simbolo è vero,true e true =vero e la prossima linea di codice (questa è all'interno del ciclo while) viene eseguita.

Orai è 1, OrderSelect() seleziona l'ordine in posizione 1, quindi il risultato è il valore true, il controllo del simbolo non trova un simbolodi USDJPY quindi restituisce true, di nuovo true e true = true quindi i++ viene eseguito di nuovo

Orai
è 2, OrderSelect() cerca di selezionare l'ordine in posizione 2 ma non ci riesce. . ci sono solo 2 ordini aperti, nelle posizioni 0 e 1, quindi OrderSelect() restituisce false, cosa fa OrderSymbol()? non c'è nessun ordine valido selezionato. . ma anche se restituisce true per qualche strana ragione, la OrderSelect() ha già restituito false,false e true = false . .. il ciclo while è finito ei è impostato a 2

Ora lavorate attraverso il resto del codice tenendo presente chei ha un valore di 2. ..