Ciclo operatore 'per' domande - pagina 10

 
WhooDoo22:

Ho risolto l'errore "biglietto non valido" per l'esercizio di codifica che mi hai consigliato. Ho allegato una copia dell'expert advisor per la tua visione personale.

La sezione della funzione OrderClose() di questo esercizio credo sia completa.

La sezione della funzione Print() di questo esercizio credo sia completa.

Credo che rimanga solo la terza sezione, la funzione OrderModify().

Grazie.

Non hai risolto il problema, l'hai aggirato, questo è tipico quando il problema non è compreso. Come ho già detto, risolvi la causa non il sintomo.

Non stai ancora stampando il numero del biglietto USDJPY, controlla il requisito originale.

Le tue chiamate a MarketInfo() sono sbagliate anche se funzionano . . .

 

Simon,

La funzione OrderModify() viene eseguita senza errori.

La funzione OrderPrint() viene eseguita senza errori.

La funzione OrderClose() viene eseguita senza errori.

Per favore, pubblica la tua risposta.

Grazie.

 
WhooDoo22:


Per favore, pubblica la tua risposta.


RaptorUK:

Non hai risolto il problema, lo hai aggirato, questo è tipico quando il problema non è compreso. Come ho già detto, risolvi la causa non il sintomo.

Non stai ancora stampando il numero del biglietto USDJPY, controlla il requisito originale.

Le tue chiamate a MarketInfo() sono sbagliate anche se funzionano . . .

E inoltre . . .

se hai la stessa situazione di prima, dove non c'è un ordine USDJPY, avrai delle chiamate fallite a OrderStopLoss(), OrderTakeProfit(), OrderSelect() e OrderType()

Cosa dovrebbe fare questo? Cosa si aspetta da questa linea di codice? Per favore, risponda senza consultare la documentazione.

GetLastError();

Nell'ultimo blocco di codice, perché volete eseguire questa linea di codice. . . .

   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}

solo se . . .

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       

ma tu eseguirai sempre questa linea di codice, e tutto il codice che la segue, indipendentemente dal TP e SL ?

   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);} 

Le tue chiamate a MarketInfo() sono ancora sbagliate . . . guarda la documentazione per scoprire perché.

 

Simon,


Non hai risolto il problema, l'hai aggirato...

Quale problema credi che non abbia ancora risolto?


Non stai ancora stampando il numero del biglietto USDJPY...

Numero del biglietto d'ordine.



Le tue chiamate a MarketInfo() sono sbagliate anche se funzionano . . .

Esempio di funzione MarketInfo() del dizionario MetaEditor:

Esempio:

// MarketInfo() function example;

   double bid   =MarketInfo("EURUSD",MODE_BID);
   double ask   =MarketInfo("EURUSD",MODE_ASK);
   double point =MarketInfo("EURUSD",MODE_POINT);
   int    digits=MarketInfo("EURUSD",MODE_DIGITS);
   int    spread=MarketInfo("EURUSD",MODE_SPREAD);

Ecco un esempio del mio blocco di codice della funzione OrderClose():

// OrderClose() function code block example;

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
      GetLastError();
     }

Cosa credi che ci sia di sbagliato nel formato del mio esempio di codice della funzione OrderClose()? Sembra quasi identico al campione 'MarketInfo()' fornito dal dizionario MetaEditor.


E inoltre . . .


Che cosa dovrebbe fare? Che cosa si aspetta da questa linea di codice? Per favore, risponda senza consultare la sua documentazione.

GetLastError();

La funzione GetLastError() stampa un errore nella pagina 'Experts' durante l'esecuzione dei test. Se la funzione non trova errori, viene stampato lo zero (0). Notate lo zero stampato nell'istantanea che ho fornito sopra.


Nel blocco di codice finale, perché si vuole eseguire questa linea di codice . . . .

if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}

solo se...

if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))

ma tu eseguirai sempre questa linea di codice, e tutto il codice che la segue, indipendentemente dal TP e SL?

if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}


Sì, sono contento che tu abbia sollevato la questione perché sto per spiegare il mio ragionamento per fare questo.

Se tutti gli altri blocchi di codice vengono omessi dall'esecuzione del programma utilizzando i commenti multiriga "/* - */" e gli unici due blocchi di codice rimasti all'interno delle funzioni Start() e Return(0) sono...

   int i;
   double bid_ask,
          OM_Param_3,
          OM_Param_4;

// code block 1;   

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

// code block 2;

   if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))   
     {
      Print(OrderTicket());     
      GetLastError();
     }

sotto il blocco di codice due è la chiamata di funzione:

     {
      Print(OrderTicket());     
      GetLastError();
     }

La funzione Print() continua a stampare il numero nel pannello degli esperti all'infinito e continua a stampare. Ho creduto che se avessi aggiunto...

if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))

la funzione Print() sarebbe stata eseguita solo una volta perché una volta eseguita la funzione OrderModify() direttamente sotto questa, lo SL e il TP non sarebbero più stati zero e avrebbero causato l'arresto della funzione Print().

Ora mi rendo conto che questo non è il caso a causa di come viene eseguito un programma. Ho capito che un programma viene eseguito dall'alto verso il basso, quindi quando il programma ha finito il suo intero ciclo la prima volta cercherebbe di eseguire nuovamente dall'alto verso il basso e non riuscirebbe a stampare il biglietto nel pannello 'Esperti' perché non c'è un ordine sulla coppia di valute USDJPY.


Grazie.

 
WhooDoo22:

Simon,


Non hai risolto il problema, l'hai aggirato...

Quale problema credi che non abbia ancora risolto?

Il problema di fondo che è causato dal modo in cui hai codificato il tuo ciclo while . . . il problema che stava causando Invalid ticket per la funzione OrderClose eUnknown ticket 2 per OrderModify non l'hai risolto perché hai affrontato il sintomo.

WhooDoo22:

Le tue chiamate a MarketInfo() sono sbagliate anche se funzionano . . .

Esempio di funzione MarketInfo() del dizionario MetaEditor:


Scusa, errore mio, hai risolto il problema... sai qual era il problema a cui mi riferivo?

WhooDoo22:

Simon,

cosa dovrebbe fare? Cosa ti aspetti da questa linea di codice? Per favore, rispondi senza consultare la documentazione.

La funzione GetLastError() stampa un errore nella pagina 'Experts' durante l'esecuzione dei test. Se la funzione non trova errori, viene stampato lo zero (0). Notate lo zero stampato nell'istantanea che ho fornito sopra.


No, GetLastError() non stampa nel log. La funzione restituisce l'ultimo errore verificatosi, quindi il valore della variabile speciale last_error dove è memorizzato l'ultimo codice di errore verrà azzerato. Quindi, la prossima chiamata per GetLastError() restituirà 0".

Lo 0 nella tua immagine è probabilmente da . . .

Print(OrderCloseTime());

. . . ed è un errore in quanto l'ordine non è più selezionato in quanto non è più nel pool Ordine in quanto ora è stato chiuso quindi è nel pool Storia. per fare quello che stai cercando di fare avresti bisogno di qualcosa come questo . . .

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      int ClosedTicketNum = OrderTicket();   //  <---- add this line
      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      
      OrderSelect(ClosedTicketNum, SELECT_BY_TICKET);   //  <---- add this line

      Print(OrderCloseTime());
      GetLastError();
     }

. . . . . aggiungi queste due righe e prova.

WhooDoo22:

La funzione Print() continua a stampare il numero nel pannello degli esperti all'infinito e continua a stampare. Credevo che se avessi aggiunto ...

if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))

la funzione Print() sarebbe stata eseguita solo una volta perché una volta eseguita la funzione OrderModify() direttamente sotto questa, lo SL e il TP non sarebbero più stati zero e avrebbero causato l'arresto della funzione Print().

Ora mi rendo conto che questo non è il caso a causa di come viene eseguito un programma. Capisco che un programma viene eseguito dall'alto verso il basso, quindi quando il programma ha finito il suo intero ciclo la prima volta cercherebbe di eseguire nuovamente dall'alto verso il basso e non riuscirebbe a stampare il biglietto nel pannello 'Esperti' perché non c'è un ordine sulla coppia di valute USDJPY.

Credo che ti sfugga il mio punto di vista... se aggiungo delle parentesi graffe forse sarà più chiaro. . . hai fatto questo . . .

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
      {
      if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
      }

   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
      GetLastError();
     }

. . . intendevi fare questo?

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
      {
      if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
      if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
         {
         OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
         Print(OrderCloseTime());
         GetLastError();
         }
      )
 
WhooDoo22:

Simon,

Non stai ancora stampando il numero del biglietto USDJPY...


Il requisito era . . . "stampare il numero di biglietto sul registro nella forma "Numero di biglietto per USDJPY = " "

 

Simon,


Il problema di fondo che è causato dal modo in cui hai codificato il tuo ciclo while . . . il problema che stava causando Invalid ticket per la funzione OrderClose e Unknown ticket 2 per OrderModify non l'hai risolto perché hai affrontato il sintomo.

Desidero discutere con voi di questo problema in dettaglio da solo, permettendomi di concentrare i miei pensieri sulla risoluzione del problema senza distrazioni da altri punti.


Scusa, errore mio, hai risolto il problema... sai qual era il problema a cui mi riferivo?

Sì, grazie per averlo segnalato!


"La funzione restituisce l'ultimo errore verificatosi, quindi il valore della variabile speciale last_error dove è memorizzato l'ultimo codice di errore sarà azzerato. Quindi, la prossima chiamata per GetLastError() restituirà 0".

Il dizionario MetaEditor recita:

int GetLastError( )
La funzione restituisce l'ultimo errore verificatosi, quindi il valore della variabile speciale last_error dove è memorizzato l'ultimo codice di errore sarà azzerato. Quindi, la prossima chiamata per GetLastError() restituirà 0.

Questa funzione restituisce l'ultimo errore verificatosi, quindi il valore della variabile speciale last error dove è memorizzato l'ultimo codice di errore verrà azzerato...

Il verde è compreso e il giallo non è compreso.


. . . . aggiungi queste due righe e prova.

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      int ClosedTicketNum = OrderTicket();   //  <---- add this line
      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      
      OrderSelect(ClosedTicketNum, SELECT_BY_TICKET);   //  <---- add this line

      Print(OrderCloseTime());
      GetLastError();
     }

Sarà fatto.


Penso che ti manchi il mio punto. . . se aggiungo delle parentesi graffe forse sarà più chiaro. . . hai fatto questo . . .

Credo di aver voluto fare questo ...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
      {
      if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
      if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
         {
         OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
         Print(OrderCloseTime());
         GetLastError();
         }
      }

Questo perché desideravo che la condizione...

if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))

fosse applicata alla sezione di codice all'interno delle parentesi graffe ("{ }").


Il requisito era . . . "stampare il numero di ticket nel log nella forma "Numero di ticket per USDJPY = " "

Si può fare.


Grazie.

 
WhooDoo22:


"La funzione restituisce l'ultimo errore verificatosi, quindi il valore della variabile speciale last_error dove è memorizzato l'ultimo codice di errore sarà azzerato. Quindi, la prossima chiamata per GetLastError() restituirà 0".

Il dizionario MetaEditor legge:

int GetLastError( )
La funzione restituisce l'ultimo errore avvenuto, quindi il valore della variabile speciale last_error dove è memorizzato l'ultimo codice di errore sarà azzerato. Quindi, la prossima chiamata per GetLastError() restituirà 0.

Questa funzione restituisce l'ultimo errore verificatosi, quindi il valore della variabile speciale last error dove è memorizzato l'ultimo codice di errore verrà azzerato...

Il verde è compreso e il giallo non è compreso.

OK, come potete vedere dalla documentazione GetLastError() non stampa nulla . . .restituisce solo il numero di errore . . . quindi per usarlo avete bisogno di farci qualcosa . . .

Print("The last error was error number: ", GetLastError());

//  or . . .

int ErrorNumber = GetLastError();

//  or . . .

if(GetLastError() == 130)

Quando chiamate GetLast Error() esso restituisce l'errore e poi azzera la variabile che stava usando internamente per contenere l'ultimo errore . . . quindi se avete fatto questo . . .

OrderDelete(-1);   //  should produce an error 4108 or 3

Print("Last error was number ", GetLastError());    //  should print - Last error was number 4108

Print("Last error was number ", GetLastError());    //  should print - Last error was number 0  the previous call cleared the GetlastError internal variable
 

la seconda chiamata a GetLastError() restituirà 0 poiché la prima chiamata ha azzerato la variabile che contiene il numero dell'errore. . . inoltre tenete presente che viene mantenuto solo l'errore più recente.

 
WhooDoo22:


Penso che non hai capito il mio punto... se aggiungo delle parentesi forse sarà più chiaro. ... hai fatto questo ...

Credo di aver voluto fare questo ...

Questo perché volevo che la condizione...

fosse applicata alla sezione di codice all'interno delle parentesi graffe ("{ }").

Ma non l'hai fatto . ... ti è sfuggito nel tuo progetto, poi ti è sfuggito quando hai codificato, poi ti è sfuggito quando hai letto il tuo codice e hai controllato che facesse quello che volevi, poi ti è sfuggito quando hai testato . Le parentesi graffe sono una di quelle cose fondamentali che dovete conoscere come il palmo della vostra mano.

Dovete capire perché vi è sfuggito e affrontare il problema... nessun altro può farlo per voi, a meno che non vogliate pagarli per codificare per voi.

 

Simon,


Lo 0 nella tua immagine è probabilmente da . . .

Print(OrderCloseTime());


Nah-uh-uh! ;)

Facciamo un viaggio nella documentazione, che ne dite? Hahaha.

datetime OrderCloseTime( )
Restituisce il tempo di chiusura dell'ordine attualmente selezionato. Se il tempo di chiusura dell'ordine non è 0 allora l'ordine selezionato è stato chiuso e recuperato dalla storia del conto. Il tempo di chiusura degli ordini aperti e in sospeso è uguale a 0.

Nota: l'ordine deve essere precedentemente selezionato dalla funzione OrderSelect().


Per prima cosa, diamo entrambi un'occhiata al blocco di codice della funzione OrderClose() che ho codificato di recente...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
     }

Poi diamo entrambi un'occhiata al risultato mostrato in un'istantanea del pannello 'Esperti'...

Risultato del pannello 'Esperti'.

Aaah, cosa abbiamo qui? :)


Per favore, pubblica una risposta per il nuovo consulente esperto allegato. Soddisfa ancora tutti i criteri che il tuo esercizio ha incluso?


Il problema di fondo che è causato dal modo in cui hai codificato il tuo ciclo while . . . il problema che stava causando Invalid ticket per la funzione OrderClose e Unknown ticket 2 per OrderModify non l'hai risolto perché hai affrontato il sintomo.

Desidero discutere questo problema con voi in modo finemente dettagliato da solo, permettendomi di concentrare i miei pensieri sulla risoluzione del problema senza distrazioni da altri punti.


Grazie.

Motivazione: