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

 
Sono molto nuovo nel codificare mql4, e ho completato il mio primo EA. Il mio unico problema ora è che non riesco a fargli aprire operazioni su più di una coppia. Nella sezione EA sul terminale accanto al diario, invia un flusso di errore, ticket non valido per la funzione orderclose, anche se l'EA apre e chiude i trade solo su una coppia. Qualcuno potrebbe per favore dare una mano.
 
Matt_Townsend:
Sono molto nuovo nel codificare mql4, e ho completato il mio primo EA. Il mio unico problema ora è che non riesco a fargli aprire operazioni su più di una coppia. Nella sezione EA sul terminale accanto al diario, invia un flusso di errore, ticket non valido per la funzione orderclose, anche se l'EA apre e chiude le operazioni su una sola coppia. Qualcuno potrebbe per favore dare una mano.

Come ti aspetti che lo sappiamo se non mostri il tuo codice e il tuo log degli errori?

Se vuoiil nostro aiuto, dovrai mostrare il tuo codice e gli errori che dà (i risultati nel log). Sarebbe anche utile sapere su quali coppie di valute e time-frames stai testando, quando daremo un'occhiata al tuo codice.

Inoltre, si prega di notare che su MetaTrader 4 è possibile testare solo una singola valuta alla volta nello Strategy Tester. Se il tuo EA negozia più valute simultaneamente da un singolo grafico, non sarai in grado di testarlo nello Strategy Tester - solo su un conto demo o reale!

 
Matt_Townsend: anche se l'EA apre e chiude bene i trade su una coppia.
Questo è il motivo per cui raccomando
Non scambiare più valute in un solo EA
 
Matt_Townsend: Ecco il mio codice, e sto avendo il problema su una demo dal vivo, ho anche provato a vedere se posso usare più terminali, per risolvere il problema. Grazie per il vostro feedback finora.

Per favore modifica il tuo post e usa il tasto SRC per aggiungere il tuo codice! Non limitarti a copiare/incollare come testo standard perché è difficile da leggere. Sono sicuro che puoi vedere da altri thread come dovrebbe essere fatto. Per favore usa il tasto SRC per postare il tuo codice.

EDIT: Come richiesto prima - . .. Sarà anche utile sapere quali coppie di valute e time-frames stai testando su ...

EDIT2: Come richiesto prima - ... così come gli errori che dà (i risultati nel log) ...

 
Fernando Carreiro:
Per favore modifica il tuo post e usa il tasto SRC per aggiungere il tuo codice! Non limitarti a copiare/incollare come testo standard perché è difficile da leggere. Sono sicuro che puoi vedere da altri thread come dovrebbe essere fatto. Per favore usa il tasto SRC per postare il tuo codice.
//+------------------------------------------------------------------+
//|                     Simple Moving Average Crossover Strategy.mq4 |
//|                                                 Matthew Townsend |
//+------------------------------------------------------------------+
#property version   "1.05"
#property strict
//---

//---Inputs
extern  double Lots         =0.01;
extern  int    FastMA       =5;
input   int    FastMAMode   =MODE_EMA;
extern  int    SlowMA       =8;
input   int    SlowMAMode   =MODE_SMA;

//+----------------------------------------+
//|undesirables                            |
//+----------------------------------------+
int init()
{
   //----
   //----
   return(0);
}

int deinit()
{
   //----
   //----
   return(0);
}
//+---------------------------------------------+
//|System start                                 |
//+---------------------------------------------+
int start()
{


    double fastma, slowma;
    int    ticket, total;
    //---define Ma's
    
    fastma = iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);
    slowma = iMA(NULL,0,8,0,MODE_SMA,PRICE_CLOSE,0);
    
    total = OrdersTotal();
    //---Start operations
    
    if(total < 1)
    {
       if(fastma > slowma)
       {
         ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,10,0,0,"",0,0,Blue);
         if(ticket > 0)
         {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Print("Buy order opened : ", OrderOpenPrice());
         }
         else
           Print("Error opening order : ", GetLastError());
           return(0);
       }
       if(fastma < slowma)
       {
         ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,0,"",0,0,Red);
         if(ticket > 0)
         {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Print("Sell order opened : ", OrderOpenPrice());
         }
         else
           Print("Error opening order : ", GetLastError());
           return(0);
       }
       return(0);
    }
    bool ans;
    
        
         if(OrderType()==OP_BUY)
         {
           while(fastma < slowma)
           {
             ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
             if(ticket < 1)
             {      
                if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                Print("Buy order closed : ", OrderClosePrice());    
             }    
             else
               Print("Error closing order : ", GetLastError());
               return(0);
           }
         }
      if(OrderType()==OP_SELL)
        {
          while(fastma > slowma)
          {
             ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
             if(ticket < 1)
             {
               if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("Sell order closed : ", OrderClosePrice());
              
             }
             else
               Print("Error closing order : ", GetLastError());
               return(0);
          }
          
        }
    
    return(0);
}

//+-----------------------------------------------------------------------------------+
 
Fernando Carreiro:
Ti ho chiesto di MODIFICARE il tuo post precedente, non di aggiungerne uno nuovo, per non rendere il thread così lungo!
Scusami, anche io sono molto nuovo in questo forum, posso cancellare i 2 post?
 
Matt_Townsend:
Stavo testando su timeframe 1 ora, EURUSD e 1 ora GBPUSD
Ci sono già due avvisi del compilatore per il seguente codice:
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...

Non stai controllando correttamente il risultato dell'operazione di chiusura.

In termini di logica ci sono diversi problemi con il tuo EA, ma allo stato attuale, sta funzionando senza alcun errore da parte mia nello Strategy Tester, quindi per favore fornisci la lista degli errori che stai ottenendo!

 
Fernando Carreiro:
Ci sono già due avvertimenti del compilatore per il seguente codice:
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...

Non stai controllando correttamente il risultato dell'operazione di chiusura.

In termini di logica ci sono diversi problemi con il tuo EA, ma allo stato attuale, sta funzionando senza alcun errore da parte mia, quindi per favore fornisci la lista degli errori che stai ottenendo!

L'unico errore che ho ottenuto dall'EA è unticket non valido per la funzione orderclose, con un numero accanto, vorrei mostrare il log attuale, ma sul secondo grafico con l'EA in esecuzione non sta facendo nulla, in quanto normalmente tenterebbe di aprire un trade immediatamente. Se, e quando il log inizia a riempirsi con l'errore, come faccio a mostrarvi il log attuale?
 
Matt_Townsend:
L'unico errore che ho ottenuto dall'EA è unticket non valido per la funzione orderclose, con un numero accanto, vorrei mostrare il log attuale, ma sul secondo grafico con l'EA in esecuzione non sta facendo nulla, in quanto normalmente tenterebbe di aprire un trade immediatamente. Se, e quando il log inizia a riempirsi con l'errore, come dovrei fare per mostrarvi il log attuale?

Seleziona le linee in questione con Click, Ctrl-Click o Shift-Click (operazione standard di windows), poi clicca con il tasto destro sulla selezione e scegli "Copy"!

EDIT: Per quanto riguarda il codice, stai usando OrderSelect, ma stai sempre assumendo che funzioni ogni volta. E quando non funziona continui a usare le funzioni di dettaglio dell'ordine come OrderTicket() nella tua chiusura, che potrebbe fallire se anche l'iniziale OrderSelect() fallisce. Come ho detto, hai molti problemi di logica nel tuo codice!

 

    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);
           }
         }
Riscrivete la sezione del codice di chiusura per essere logici, non dovreste usare affatto la variabile ticket qui.
 
Matt_Townsend:
L'unico errore che ho ottenuto dall'EA è unticket non valido per la funzione orderclose, con un numero accanto, vorrei mostrare il log attuale, ma sul secondo grafico con l'EA in esecuzione non sta facendo nulla, in quanto normalmente tenterebbe di aprire un trade immediatamente. Se, e quando il log inizia a riempirsi con l'errore, come faccio a mostrarvi il log attuale?

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 solo usare questo EA da solo senza altri EA in esecuzione, nemmeno se stesso su un altro grafico!

Motivazione: