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.
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 012:44:39.040 EA_ADX (XAUUSD,H1) 2020.01.0319:00:00Alert: The Buy order request could not be completed -error:4756
ED 212:44:39.043 Trades 2020.01.0320:00:00 failed market buy 0.1 XAUUSD sl: 1549.09 tp: 1549.16 [Invalid stops]
JP 012:44:39.043 EA_ADX (XAUUSD,H1) 2020.01.0320:00:00Alert: The Buy order request could not be completed -error:4756
ER 212:44:39.049 Trades 2020.01.0321:00:00 failed market buy 0.1 XAUUSD sl: 1549.90 tp: 1549.97 [Invalid stops]
MR 012:44:39.049 EA_ADX (XAUUSD,H1) 2020.01.0321:00:00Alert: The Buy order request could not be completed -error:4756
PP 212:44:39.053 Trades 2020.01.0322:00:00 failed market buy 0.1 XAUUSD sl: 1548.16 tp: 1548.23 [Invalid stops]
//--- Abbiamo già posizioni aperte?bool Buy_opened= false ; // variabile per contenere il risultato di Buy open positionbool Sell_opened= false ; // variabile per contenere il risultato di Vendi la posizione apertaif ( PositionSelect ( _Symbol ) == true ) // abbiamo una posizione aperta
{
if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
{
Buy_opened = true ; //È un acquisto
}
elseif ( 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 positionbool Sell_opened = false ; // variabili per contenere il risultato della posizione Sell openif ( 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
} elseif ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
{
Buy_opened = true ; //È un acquisto
}
}
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
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 apertabool Sell_opened=false; // variabile che memorizza il risultato della posizione aperta Saleif (PositionSelect(_Symbol) ==true) // abbiamo una posizione aperta
{
if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
{
Buy_opened = true; // È un acquisto
}
elseif(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 apertabool 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
}
elseif(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.
Qualcuno sa se posso usare questo EA per i mini-indici o i mini-dollari?
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.
Il file si trova alla fine della Guida.
Come posso risolvere questo problema?
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:
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:
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
a:
Alcune carte hanno regole di stop loss minimo, per saperne di più: https://www.mql5.com/pt/forum/319474
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 è:
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 ...
Per questo...
Nota: subito dopo viene la riga...
In questo modo ha funzionato bene per me. Spero che lo troviate utile.
Cordiali saluti.
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.