Aiuto: Perché l'EA non chiude un trade

 

Ciao amici,

Ho bisogno del vostro aiuto.

Ho costruito un EA che parte del suo processo deve chiudere un trade utilizzando una funzione. Qui ci sono le righe di kod rilevanti.

Qualcuno può aiutarmi perché l'EA non chiude il trade? Grazie.

(Forse, dato che mentre uso ORDERSELECT nella parte principale, non può usare ORDERSELECT nella funzione, anche????)

for(int cnt=0; cnt < OrdersTotal(); cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if ( OrderSymbol() == Pair && OrderType() == OP_BUY )

{

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*fattore*TP )

{

CLOSE_Single_P(Coppia, "LONG", OrderTicket(), OrderLots());

}

}

}

...

...

...

//-----------------------------------------------+

void CLOSE_Single_P(string SYMB, string TREN, int TICKET, double LOTT)

{

int Codice, sig;

doppio PRC;

if ( TREN == "LONG" )

Codice = 0;//OP_BUY

altrimenti

se ( TREN == "SHORT" )

Codice = 1;//OP_VENDITA

for ( int k=0; k < OrdersTotal(); k++ )

{

OrderSelect(k, SELECT_BY_POS, MODE_TRADES);

if( OrderSymbol() == SYMB && OrderType() == Code && OrderLots() == LOTT && OrderTicket() == TICKET )

{

if ( OrderType() == OP_BUY )

PRC = MarketInfo(OrderSymbol(),MODE_BID);

altrimenti

se ( TipoOrdine() == OP_SELL )

PRC = MarketInfo(OrderSymbol(),MODE_ASK);

OrderClose(TICKET,LOTT,PRC,Slippage,Yellow);

break;

}

}

return;

}

 

Usa il pulsante SRC per visualizzare il tuo codice per una migliore lettura, per favore :)

Il tuo OrderSelect() è codificato in modo sbagliato. Confronta il tuo codice con questo. Poi scrivi se hai ancora il problema o no :)

   for(int cnt=0; cnt<OrdersTotal(); cnt++)
     {
      if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) == true &&
          OrderSymbol()==Pair && 
          OrderType()==OP_BUY)
          {
          // code to close
          }
      }
 
crossy:

Ciao amici,

Ho bisogno del vostro aiuto.

Ho costruito un EA che parte del suo processo deve chiudere un trade utilizzando una funzione. Qui ci sono le righe di kod rilevanti.

Qualcuno può aiutarmi perché l'EA non chiude il trade? Grazie.

Quando hai un loop e stai chiudendo o cancellando ordini (Pending) devi contare in basso e non in alto.

Perché hai un loop nella funzione Close_Single_P? Non è progettata per chiudere un singolo ordine? Quando chiami la funzione passi il simbolo, il numero del ticket, il tipo di ordine e la dimensione della posizione . .. questo è tutto ciò di cui hai bisogno per chiudere l'ordine . . beh quasi, hai bisogno del prezzo di chiusura e per questo puoi usare OrderClosePrice() e poi non devi preoccuparti se è un Buy o Sell . . . infatti, sbarazzati della funzione e usa questa linea al posto della chiamata della funzione . . .

OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow);

A proposito, dove stai impostando lo slippage? E stai compensando i broker a 4/5 cifre?

Quando usi le funzioni Order, esse restituiscono un valore... questo valore di ritorno ti dice se la funzione ha funzionato o no... impara ad usare questo valore di ritorno e se ti dice che c'è stato un problema usa un'istruzione di stampa per riportare le informazioni rilevanti nei log... così saprai cosa è andato storto invece di tirare a indovinare...

Il tuo ordine dovrebbe essere chiuso? Hai verificato che questo . . . .

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )

. . . è vero?

Perché non aggiungere un'istruzione di stampa che viene eseguita se quella linea è vera . . . allora saprete se lo è o non lo è . . .

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )
   {
   Print("Trying to close Order: ", OrderTicket());                             // <---- tells you that the   if  returned true
   if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow)
      Print("OrderClose failed, error # ", GetLastError());                          // <------- reports the error if the OrderClose failed . . 
   }
 
onewithzachy:

Usa il pulsante SRC per visualizzare il tuo codice per una migliore lettura, per favore :)

Qual è il ritorno di GetLastError() allora?


Il codice ha circa 4.000 linee...

Comunque, non ottengo nessun massaggio di errore.

 
crossy:


Il codice ha circa 4.000 linee...

Comunque, non ottengo nessun massaggio di errore.

Non devi postare tutto il tuo codice. . . ma quando posti QUALSIASI codice usa il pulsante SRC. . .

Non ottieni messaggi di errore perché non li riporti nel log . . devi controllare i valori di ritorno e segnalare gli errori.

 
RaptorUK:

Quando hai un ciclo e stai chiudendo o cancellando ordini (Pending) devi contare alla rovescia e non alla rovescia...

Perché hai un loop nella funzione Close_Single_P? Non è stata progettata per chiudere un singolo ordine? Quando chiami la funzione passi il simbolo, il numero di ticket, il tipo di ordine e la dimensione della posizione . .. questo è tutto ciò di cui hai bisogno per chiudere l'ordine . . beh, quasi, hai bisogno del prezzo di chiusura e per questo puoi usare OrderClosePrice() e poi non devi preoccuparti se è un Buy o Sell . .. infatti, sbarazzati della funzione e usa questa linea al posto della chiamata alla funzione . ..

. A proposito, dove stai impostando lo slippage? E stai compensando i broker a 4/5 cifre?

Quando usi le funzioni Order, esse restituiscono un valore... questo valore di ritorno ti dice se la funzione ha funzionato o no... impara ad usare questo valore di ritorno e se ti dice che c'è stato un problema usa un'istruzione di stampa per riportare le informazioni rilevanti nei log... così saprai cosa è andato storto invece di tirare a indovinare...

Il tuo ordine dovrebbe essere chiuso? Hai verificato che questo . . .

. . . . è vero?

Perché non aggiungere un'istruzione di stampa che viene eseguita se quella linea è vera . . . allora saprai se lo è o non lo è . . .


Grazie Raptor per le tue offerte di saggezza. Mi aiuti SEMPRE in modo saggio e chiaro.

Proverò quello che hai appena suggerito.

Auguri.

 

Hai già il biglietto selezionato, perché passare attraverso un secondo ciclo orderSelect per trovare lo stesso biglietto?

Perché non controlli il valore di ritorno di OrderClose e stampi l'errore per scoprire il PERCHE'?

 
WHRoeder:

Hai già il biglietto selezionato, perché passare attraverso un secondo ciclo orderSelect per trovare lo stesso biglietto?

Perché non stai controllando il valore di ritorno di OrderClose e stampando l'errore per scoprire perché?


Bene amici, grazie per i vostri sforzi.

Ho fatto alcune modifiche e niente è stato utile, finché non ho visto il commento di WHRoeder.

Sei geniale, penso che tu abbia ragione.

Proverò l'EA modificato lunedì.

Buon fine settimana.

 
crossy:


Bene amici, grazie per i vostri sforzi.

Ho fatto alcune modifiche e niente è stato utile, finché non ho visto il commento di WHRoeder.

Sei geniale, penso che tu abbia ragione.

Proverò l'EA modificato lunedì.

Buon fine settimana.


Bene, i miei amici,

Ho fatto tutti i tuoi suggerimenti - e l'EA ha fallito.

Qualche altra idea?

 

Facciamolo di nuovo

  #include "..\libraries\stdlib.mq4" // drag and drop from libraries to very top of your code
  
  for(int cnt = OrdersTotal(); cnt >= 0; cnt--)  // from RaptorUK, count it down to zero 
     {
     if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) == true && OrderSymbol() == Pair) // this is how to write OrderSelect()
        {
        if(OrderType()== OP_BUY) // the code below is to close buy position only
          {
          
          //---
           if(MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT) * factor * TP) // from RaptorUK, is this statemement true ?
             {
              //CLOSE_Single_P(Pair,"LONG",OrderTicket(),OrderLots()) // From RaptorUK & WHRoeder, you don't have to do OrderSelect() twice
             Print("Trying to close buy position : ", OrderTicket());                            
             if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow)) // From Raptor UK, are you doing the slippage correctly ?
                Print("failed to close buy position ", ErrorDescription(GetLastError())  ); 
             }
             else
             {
             Print ("Not qualify to close buy position ", OrderTicket()); // from RaptorUK, is this statemement true ?, if not this print will tell you
             }
          //---
             
           }
           /*
           else
           {
           if (OrderType() == OP_SELL)
              {
              
              }
           }
           */
        }
     }
      

Mentre sto ancora leggendo il secondo podio di Valentino Rossi in MotoGP Le Mans, spero di scriverlo correttamente :)

 
onewithzachy:

Facciamolo di nuovo

Mentre sto ancora leggendo il secondo podio di Valentino Rossi in MotoGP Le Mans, spero di scrivere correttamente :)


Grazie onewithzachy,

Per prima cosa penso che tu abbia un piccolo errore con:

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

Devi aggiungere la correzione in verde e in grassetto.

Ma non capisco come la seguente linea possa aiutarci?

#include "..\libraries\stdlib.mq4"

Grazie, Y.

Motivazione: