Ciclo operatore 'per' domande - pagina 11

 
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 ("{ }").

Allora perché non hai fatto questo cambiamento nella tua ultima versione del tuo codice. . . se volevi farlo, perché non l'hai fatto?

 
WhooDoo22:

Simon,


Lo 0 nella tua immagine è probabilmente da . . .


Nah-uh-uh! ;)

Facciamo un viaggio lungo la strada della documentazione, va bene? 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 cronologia del conto. Il tempo di chiusura degli ordini aperti e pendenti è 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...

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

Aaah, cosa abbiamo qui? :)

Non sono sicuro di quale punto tu stia cercando di fare qui, puoi spiegare per favore? Il Print(OrderCloseTime()) è ovviamente sbagliato ma lo hai ancora nel tuo codice, perché? Cosa è successo quando hai aggiunto le 2 linee di codice che ho suggerito?
 

Simon,

Allora perché non hai fatto questa modifica nella tua ultima versione del tuo codice. ... se avevi intenzione di farlo, perché non l'hai fatto?

Dammi un secondo per dare un'occhiata, per favore.

Avevo intenzione di codificare questo in precedenza, ma non ho intenzione di codificare questo attualmente. Non c'è motivo di codificare 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();
         }
      }

Quando invece posso codificare 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());
     }

Tutte le condizioni 'if' si applicano a ciò che è dentro le parentesi graffe ("{}"). Aggiungere le parentesi a questo blocco di codice (nel modo in cui intendevo codificarlo) è inefficiente e non serve a nulla.


Grazie.

 

Simon,


Non sono sicuro di quale punto tu stia cercando di fare qui, puoi spiegare per favore?

   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());
     }

// replace above code block with...

   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());
     }

Fai girare velocemente l'EA (senza la funzione Print()) nel terminale su un conto demo, poi clicca sul pannello 'Experts' e visualizza l'assenza dello zero (0) dal resto dei risultati nel pannello 'Experts'.

Notate che non c'è alcuno 0. Hmm, giusto? ;)

Ora dai un giro all'EA (con la funzione Print() inclusa).

Nota che c'è uno 0 nel riquadro 'Esperti'.


Hai fatto un'ipotesi educata sul perché ci fosse uno zero nei risultati del riquadro 'Esperti' in precedenza e avevi ragione (gratta via "Nah-uh-uh! ;)" all'inizio del messaggio).

Lo 0 nella tua immagine è probabilmente da . . .

Print(OrderCloseTime());

Ricordi? Certo che sì :)


il Print(OrderCloseTime()) è ovviamente sbagliato ma tu lo hai ancora nel tuo codice, perché?

Per favore, spiega perché credi che sia sbagliato.

Ce l'ho nel codice per mostrarti un punto. Il punto è: Zero sta spuntando nel pannello 'Esperti' a causa di questo pezzo di codice che è nel codice.


Cosa è successo quando hai aggiunto le 2 linee di codice che ti ho suggerito?

Attualmente sto lavorando in modo spedito su questo. :)


Grazie

 
WhooDoo22:

il Print(OrderCloseTime()) è ovviamente sbagliato ma tu lo hai ancora nel tuo codice, perché?

Per favore, spiega perché credi che sia sbagliato.

Ce l'ho nel codice per mostrarvi un punto. Il punto è: Zero sta spuntando nel pannello 'Esperti' perché questo pezzo di codice è nel codice.


L'ultima immagine che hai postato mostra che l'ordine USDJPY è stato chiuso alle 01:45:35 . . . la prossima linea di codice che segue la linea che ha chiuso l'ordine è Print(OrderCloseTime()); e risulta un valore di 0 . . . 0 come datetime è Midnight 1st Jan 1970, che non è quando hai chiuso l'ordine, come hai giustamente sottolineato un valore di ritorno di 0 da OrderCloseTime() può anche essere quando l'ordine è aperto o è un ordine in sospeso, bene il tuo ordine è chiuso, tu sai che è chiuso, la tua ultima immagine lo ha dimostrato. . quindi come può essere corretto un valore di 0? la risposta è che non può essere corretto, quindi significa che è sbagliato.

 

Simon,

Attualmente sto lavorando su 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();
     }

Grazie.

 
WhooDoo22:

Simon,

Allora perché non hai fatto questa modifica nella tua ultima versione del tuo codice. ... se avevi intenzione di farlo, perché non l'hai fatto?

Datemi un secondo per dare un'occhiata, per favore.

Avevo intenzione di codificare questo in precedenza, ma non ho intenzione di codificare questo attualmente. Non c'è motivo di codificare questo...

Quando invece posso codificare questo...

Tutte le condizioni 'if' si applicano a ciò che è dentro le parentesi graffe ("{}"). Aggiungere le parentesi a questo blocco di codice (nel modo in cui intendevo codificarlo) è inefficiente e non serve a nulla.

Ok, guardando questo codice . . . .

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

Ho numerato le linee per facilitare la discussione.

Guardando la linea 1. quale delle altre linee di codice numerate sarà eseguita se OrderStopLoss() e OrderTakeProfit() sono entrambe0?

 

Simon,

Corretto, quindi funziona come previsto.

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

Linee 2 e 3.

Grazie.

 

Simon,

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

      OrderSelect(ClosedTicketNum,SELECT_BY_TICKET);
      
      Print(OrderCloseTime());
     }

Risultato:

Risultato del pannello 'Esperti'.

Perché il tempo di chiusura dell'ordine è rappresentato in tale forma (1357306061)?

Il motivo per cui la funzione Print() funziona è che la funzione OrderSelect() (all'interno delle parentesi graffe) deve selezionare l'ordine chiuso e NON un ordine aperto? Questo deve essere fatto all'interno delle parentesi graffe, giusto? ;) Complicato, complicato.

Grazie.

 

Simon,

Ecco che arriva... BAM!

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

      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)
      
      Print(OrderCloseTime());
     }

Ancora meglio! Hahaha ;)

Grazie.