L'EA non funziona su più coppie, ho bisogno di aiuto - pagina 2

 
Fernando Carreiro:

Un'altra nota molto importante per quanto riguarda l'uso del tuo EA su più coppie di valute o time-frames.

Il tuo codice non utilizza la selezione "Magic Number" né controlla il simbolo (né il "Magic number") in uso quando controlla gli ordini aperti nella cronologia. Quindi in sostanza il tuo EA non funzionerà correttamente né con se stesso né con altri EA.

Così com'è, puoi usare questo EA solo da solo senza nessun altro EA in esecuzione, nemmeno se stesso su un altro grafico!

Grazie mille per avermi aiutato con il mio codice fino ad ora e per il tuo tempo, cercherò di fare le modifiche necessarie.
 
Keith Watford:

    bool ans;

   

         //You do not select an order

         if(OrderType()==OP_BUY)
         {
           while(fastma < slowma)                                 //Use if not while
           {
             ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
             if(ticket < 1)                                        //ticket is a local variable and has not been assigned a value
             {     
                if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                Print("Buy order closed : ", OrderClosePrice());   
             }   
             else
               Print("Error closing order : ", GetLastError());
               return(0);
           }
         }
Riscrivi la sezione dell'ordine di chiusura del codice per essere logico, non dovresti usare affatto la variabile ticket qui.
Mentre scrivevo questo prima non avevo la variabile ticket lì, stavo solo vedendo se metterla lì avrebbe avuto un impatto sul modo in cui il codice funzionava, e grazie per il tuo input e tempo.
 
Matt_Townsend:
Grazie mille per avermi aiutato con il mio codice finora e per il tuo tempo, cercherò di fare le modifiche necessarie.

Poiché hai troppi problemi di logica nel tuo EA, ti suggerisco di dare un'occhiata al codice di esempio di MetaQuotes, vale a dire"Moving Average.mq4" e/o "MACD Sample.mq4" e costruire su quello, fino a capire i principi di base di come funziona un EA.

Ho allegato i file, ma li troverai nella tua cartella "MQL4\Experts".

File:
 
Fernando Carreiro:

EDIT: Per quanto riguarda il codice, stai usando OrderSelect, ma stai sempre assumendo che funzioni ogni volta. E quando non funziona continui ad usare le funzioni di dettaglio dell'ordine come OrderTicket() nella tua chiusura, che potrebbe fallire se anche l'iniziale OrderSelect() fallisce.

Dopo aver notato il tuo edit.....

Ho sempre pensato che un OrderSelect() sarebbe stato perso quando c'è un nuovo tick.

Così ho controllato e ho scoperto che una volta che un ordine è selezionato rimane selezionato anche nei nuovi tick successivi.

Imparo qualcosa di nuovo ogni giorno :)

 
Keith Watford: Dopo aver notato la tua modifica.....

Ho sempre pensato che un OrderSelect() sarebbe stato perso quando c'è un nuovo tick.

Così ho controllato e ho scoperto che una volta che un ordine è selezionato rimane selezionato anche nei nuovi tick successivi.

Imparo qualcosa di nuovo ogni giorno :)

In pratica, però, è poco utile perché quei dettagli vengono congelati nel tempo, quindi cose come OrderClosePrice() non si aggiornano fino a quando non si riseleziona di nuovo!
 
Usare OrdersTotal direttamente e/o nessun filtro Magic number sul tuo cicloOrderSelect significa che il tuo codice è incompatibile con ogni EA (incluso se stesso su altri grafici e sul trading manuale) Symbol Doesn't equal Ordersymbol when another currency is added to another seperate chart. - MQL4 forum
 
Fernando Carreiro:

Un'altra nota molto importante per quanto riguarda l'uso del tuo EA su più coppie di valute o time-frames.

Il tuo codice non utilizza la selezione "Magic Number" né controlla il simbolo (né il "Magic number") in uso quando controlla gli ordini aperti nella cronologia. Quindi in sostanza il tuo EA non funzionerà correttamente né con se stesso né con altri EA.

Così com'è, è possibile utilizzare questo EA solo da solo senza altri EA in esecuzione, nemmeno se stesso su un altro grafico!


    for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
         if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) continue;
         //---Check Order Type
         if(OrderType()==OP_BUY)
         {
           if(fastma < slowma)
           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }
           else
            Print("Error : ", GetLastError());
            return(0);
           break;
         }
      if(OrderType()==OP_SELL)
        {
          if(fastma > slowma)
          {
             if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
            
          }
          else
               Print("Error : ", GetLastError());
               return(0);
          break;
        }

      } 

Ecco la sezione OrderClose, non ricevo più l'errore di ticket non valido, ma ora ricevo un prezzo non valido

Qui è direttamente dal log

2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1: prezzo non valido 1.05454000 per la funzione OrderClose


 
Matt_Townsend:

           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }

...

         {

             if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);

 

Ecco la sezione OrderClose, non ottengo più l'errore di biglietto non valido, ma ora ottengo il prezzo non valido

Qui è direttamente dal log

2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1: prezzo non valido 1.05454000 per la funzione OrderClose


Non usare Bid/Ask quando chiudi, usa OrderClosePrice(). Sarà automaticamente il prezzo buono.
 
Alain Verleyen:
Non usare Bid/Ask quando chiudi, usa OrderClosePrice(). Sarà automaticamente il prezzo buono.

Dovrei semplicemente sostituirlo nella funzione OrderClose? e se è così dovrei rimuovere l'OrderClosePrice nella funzione di stampa sotto di esso?

Modifica:

L'ho appena fatto, ma ora non tiene nessuna posizione aperta. Apre e chiude solo le posizioni, anche se ora non ha alcun problema a lavorare su più coppie.

 

         if(OrderType()==OP_BUY)
         {
           if(fastma < slowma)
           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }
           else
            Print("Error : ", GetLastError());
            return(0);
           break;
         }

Non c'è nessun beed per i ritorni o l'interruzione in quanto è necessario completare il ciclo

Inoltre, la vostra stampa dell'errore dipende dal fatto che


           if(fastma < slowma)


è falso, non è correlato al fatto che OrderClose() fallisca o meno



   if(OrderType()==OP_BUY)
     {
      if(fastma<slowma)
        {
         if(OrderClose(OrderTicket(),Lots, OrderClosePrice(),10,clrNONE))
            Print("Order Closed : ",OrderClosePrice());
         else
            Print("Error : ",GetLastError())
        }
     }