Discussione sull’articolo "Guida Step-By-Step alla scrittura di un Expert Advisor in MQL5 per Principianti" - pagina 22

 
Buongiorno, se qualcuno può aiutarmi per favore. A quanto ho capito ho fatto tutto quello che è indicato nell'articolo. Ma non riesco ad avere due operazioni aperte simultaneamente, al di là di quello che ho capito che l'autore voleva fare per non mettere buy se c'era già buy o sell se c'era già sell. La mia strategia, ad esempio, invia un segnale di vendita quando ho un ordine di acquisto aperto, e invece di aprire una vendita, il codice chiude l'operazione di acquisto senza che possa toccare il tp/sl. E così mi ritrovo senza acquisti o vendite. La vendita chiude l'acquisto e l'acquisto chiude la vendita. Sto utilizzando una sola coppia, un solo time frame e un solo lotto nella mia strategia. Potete dirmi come posso fare in modo che l'acquisto e la vendita si aprano contemporaneamente se la strategia si attiva? Vale a dire che gli ordini vengono chiusi SOLO da tp/sl. Grazie mille in anticipo.
 
Ottimo articolo!
 
Sella170:
Qualcuno sa se posso usare questo EA per i mini-indici o i mini-dollari?
Sì, è possibile utilizzare l'EA trascinando il mouse sul grafico o sul menu > inserisci > Expert advisor > {nomedoseurobo}.

Spero che la sua domanda abbia trovato risposta.

 
Grazie per l'eccellente articolo. Dove e come si può implementare il modulo Intraday Time Filter nel codice?
 

Ciao ragazzi, buongiorno.

Sono nel"Tester di Strategia" con questo file dalla fine della Guida e mostra il seguente errore:

*l'errore è già stato discusso qui in questo articolo, ma nessuna soluzione scritta ha funzionato per me e ho bisogno del vostro aiuto.


OF      0       12:44:39.040    EA_ADX (XAUUSD,H1)      2020.01.03 19:00:00   Alert: The Buy order request could not be completed -error:4756
ED      2       12:44:39.043    Trades  2020.01.03 20:00:00   failed market buy 0.1 XAUUSD sl: 1549.09 tp: 1549.16 [Invalid stops]
JP      0       12:44:39.043    EA_ADX (XAUUSD,H1)      2020.01.03 20:00:00   Alert: The Buy order request could not be completed -error:4756
ER      2       12:44:39.049    Trades  2020.01.03 21:00:00   failed market buy 0.1 XAUUSD sl: 1549.90 tp: 1549.97 [Invalid stops]
MR      0       12:44:39.049    EA_ADX (XAUUSD,H1)      2020.01.03 21:00:00   Alert: The Buy order request could not be completed -error:4756
PP      2       12:44:39.053    Trades  2020.01.03 22:00:00   failed market buy 0.1 XAUUSD sl: 1548.16 tp: 1548.23 [Invalid stops]


Il file si trova alla fine della Guida.

Come posso risolvere questo problema?

 
surfdoode2:


Anche io continuo ad avere questo errore dopo aver effettuato entrambe le correzioni suggerite:

ZeroMemory(mrequest);

e anche

se(Acquisto_aperto || Vendita_aperta)

Qualcuno può aiutarmi con l'errore 4756? Sembra che non sia possibile piazzare un ordine di acquisto.

Controllate se avete usato la funzione SymbolInfoTick e se avete scritto questa parte del codice:

//--- Ottenere l'ultima quotazione del prezzo utilizzando la struttura MQL5 MqlTick
   if(!SymbolInfoTick(_Symbol,latest_price))
     {
      Alert("Error getting the latest price quote - error:",GetLastError(),"!!");
      return;
     }
Documentation on MQL5: Market Info / SymbolInfoTick
Documentation on MQL5: Market Info / SymbolInfoTick
  • www.mql5.com
SymbolInfoTick - Market Info - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
C'è un errore nella logica dell'algoritmo:
 //--- Abbiamo già posizioni aperte?
     bool Buy_opened= false ;   // variabile per contenere il risultato di Buy open position
     bool Sell_opened= false ; // variabile per contenere il risultato di Vendi la posizione aperta
    
     if ( PositionSelect ( _Symbol ) == true )   // abbiamo una posizione aperta
    {
         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ;   //È un acquisto
         }
         else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // È una vendita
         }
    }

Poiché PositionSelect seleziona la prima posizione per _Symbol, se l'EA apre una posizione di acquisto, la variabile Sell_opened sarà sempre falsa mentre la posizione di acquisto è aperta, causando la realizzazione di più posizioni di vendita ogni volta che c'è un segnale di vendita.

Per correggere questo problema e sapere se ci sono posizioni di acquisto e di vendita aperte contemporaneamente, si può utilizzare la seguente logica:

 //--- Abbiamo già posizioni aperte?
   bool Buy_opened = false ;   // variabile per contenere il risultato di Buy open position
   bool Sell_opened = false ; // variabili per contenere il risultato della posizione Sell open

   if ( PositionSelect ( _Symbol ) == true ) // abbiamo una posizione aperta
   {
       for ( int i= 0 ;i< PositionsTotal ();i++){
	 
         PositionSelectByTicket ( PositionGetTicket (i));

         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // È una vendita
         } else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ; //È un acquisto
         }
      }
   
Documentação sobre MQL5: Funções de Negociação / PositionSelect
Documentação sobre MQL5: Funções de Negociação / PositionSelect
  • www.mql5.com
PositionSelect - Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Vitor Gama Barreto:

Ciao a tutti, buongiorno.

Sono nel"Tester di Strategia" con questo file dalla fine della Guida e mostra il seguente errore:

*l'errore è già stato discusso qui in questo articolo, ma nessuna soluzione scritta ha funzionato per me e ho bisogno del vostro aiuto.



Il file si trova alla fine della Guida.

Come posso risolvere questo problema?

Verificate il prezzo di vendita che state richiedendo; a tale scopo, utilizzate il breakpoint per eseguire il debug delle variabili mrequest.price, mrequest.sl e mrequest.tp.

Provate a cambiare

mrequest.type_filling = ORDER_FILLING_FOK;                               // Tipo di esecuzione dell'ordine

a:

mrequest.type_filling = ORDER_FILLING_IOC;                               // Tipo di esecuzione dell'ordine


Alcune carte hanno regole di stop loss minimo, per saperne di più: https://www.mql5.com/pt/forum/319474

ERRO 4756 - INVALID PRICE
ERRO 4756 - INVALID PRICE
  • 2019.08.06
  • www.mql5.com
Ja tentei de tudo, por favor, preciso muito da ajuda de voces!! alguem pode me dar uma luz??? E retorna o : 2019.08.05 13:42:51.236 Core 1 2019.08...
 

Ciao,

Grazie mille per l'articolo di Samuel, sei un vero e proprio crack!

È stato un po' difficile farlo funzionare con il mio broker perché l'articolo è in modalità "net" e ho dovuto cercare informazioni per metterlo in modalità "hedging". Il primo problema che ho incontrato è stato quello di mrequest.type_filling .

Per il broker XM, quello che funziona è:

mrequest.type_filling = ORDER_FILLING_IOC;                                          // Tipo di esecuzione dell'ordine

Se non sapete quale sia il tipo consentito dalla vostra MT5, il mio consiglio è di usare la funzione TypeFilling() in un Print(TypeFilling()) o in un Comment( TypeFilling()) e questa restituisce il tipo; se vi dice che è 1 (ORDER_FILLING_FOK) o 2 (ORDER_FILLING_IOC) sapete quale dovete mettere(https://www.mql5.com/docs/constants/tradingconstants/orderproperties#enum_order_type_filling) perchéORDER_FILLING_FOK (1) non funziona con questo broker.


Una volta risolto questo problema, il problema è che PositionSelect apre molte posizioni. Anche se Samuel non lo dice nella sua strategia, capisco che l'obiettivo è quello di aprire una singola posizione di acquisto o di vendita (a seconda di quale sia la prima) con i criteri stabiliti (i 4 passi booleani) e che finché questa posizione non viene chiusa, non possiamo aprirne un'altra.

Quello che ho fatto è stato modificare questo codice ...

//--- non abbiamo errori, quindi continuiamo.
//--- Abbiamo già posizioni aperte?
    bool Buy_opened=false;  // variabile che memorizza il risultato dell'acquisto della posizione aperta
    bool Sell_opened=false; // variabile che memorizza il risultato della posizione aperta Sale
    
    if (PositionSelect(_Symbol) ==true)  // abbiamo una posizione aperta
    {
         if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
            Buy_opened = true;  // È un acquisto
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
            Sell_opened = true; // E' una vendita
         }
    }

Per questo...

//--- Non ci sono errori, quindi continuiamo.
//--- Abbiamo già posizioni aperte?
   bool Buy_opened = false;               // Variabile che memorizza il risultato della posizione Buy aperta
   bool Sell_opened = false;              // Variabile che memorizza il risultato della posizione aperta Sell
   
   // Esaminiamo tutti gli ordini per vedere se ce ne sono di aperti.
   for(int i = 0; i < PositionsTotal(); i++)   
        {
         ulong ticket = PositionGetTicket(i);
         PositionSelectByTicket(ticket);
    
    if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
          Buy_opened = true;       // è un acquisto
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
          Sell_opened = true;      // è una vendita
         }
   }

// se c'è una posizione aperta, attendiamo che l'operazione attiva sia chiusa (toccando lo SL o ilTP).
   if (Buy_opened || Sell_opened) return; 

Nota: subito dopo viene la riga...

//--- Copia il prezzo di chiusura della barra precedente nella barra corrente, che è la barra1.
   p_close=mrate[1].close;

In questo modo ha funzionato bene per me. Spero che lo troviate utile.

Cordiali saluti.

 
surfdoode2:


Anche io continuo ad avere questo errore dopo aver effettuato entrambe le correzioni suggerite:

ZeroMemory(mrequest);

e anche

se(Acquisto_aperto || Vendita_aperta)

Qualcuno può aiutarmi con l'errore 4756? Sembra che non sia possibile piazzare un ordine di acquisto.


Forse il tipo di riempimento del vostro Broker è ORDER_FILLING_IOC, potete provare a modificare il codice da:

mrequest.type_filling = ORDER_FILLING_FOK;

A:

mrequest.type_filling = ORDER_FILLING_IOC;

Ho avuto lo stesso problema e ora l'ho risolto con successo.