Il mio EA restituisce un errore quando registra un nuovo prodotto:
test su EURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [Modifica fallita a causa della vicinanza dell'ordine o della posizione al mercato].
Ma il mio EA è pensato per funzionare su WIN$, non sul forex. Perché il tester non ti fa sapere quale asset eseguire?
Ora, come posso correggere qualcosa che non ha errori, perché l'EA funziona perfettamente, solo che non riesco a registrare il prodotto per la vendita.
Il mio EA restituisce un errore durante la registrazione di un nuovo prodotto:
test su EURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [Modifica fallita perché l'ordine o la posizione sono vicini al mercato].
Ma il mio EA è pensato per funzionare su WIN$, non sul forex. Perché il tester non ti fa sapere quale asset eseguire?
Ora, come posso correggere qualcosa che non ha errori, perché l'EA funziona perfettamente, solo che non riesco a registrare il prodotto per la vendita.
Il robot deve essere pronto a lavorare su qualsiasi asset....
Per correggere l'errore di cui sopra, prima di modificare la posizione è necessario eseguire il controllo riportato di seguito:
//+--------------------------------------------------------------------------------------------------------------------+//| Controlla se la distanza tra il TakeProfit/StopLoss e il prezzo di chiusura è superiore a SYMBOL_TRADE_STOPS_LEVEL |//+--------------------------------------------------------------------------------------------------------------------+bool Check_SL_TP(ENUM_ORDER_TYPE type, double SL, double TP)
{
//--- Variabili localibool SL_check = false, TP_check = false;
//--- Determina l'ultimo prezzo del simbolo correntedouble BID = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double ASK = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
//--- ottenere il livello SYMBOL_TRADE_STOPS_LEVELint stops_level = (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
if(stops_level != 0)
{
PrintFormat("SYMBOL_TRADE_STOPS_LEVEL=%d: StopLoss and TakeProfit must not be nearer than %d points from the closing price", stops_level, stops_level);
}
//--- controllare solo due tipi di ordineswitch(type)
{
//--- Operazione di acquistocaseORDER_TYPE_BUY:
{
//--- controllare lo StopLoss
SL_check = (BID - SL > stops_level * _Point);
if(!SL_check)
{
ERRMSG = StringFormat("For order %s StopLoss=%.5f must be less than %.5f (Bid=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, BID - stops_level * _Point, BID, stops_level);
}
//--- controllare il TakeProfit
TP_check = (TP - BID > stops_level * _Point);
if(!TP_check)
{
ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be greater than %.5f (Bid=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, BID + stops_level * _Point, BID, stops_level);
}
//--- restituire il risultato del controlloreturn(SL_check && TP_check);
}
//--- Operazione di venditacaseORDER_TYPE_SELL:
{
//--- controllare lo StopLoss
SL_check = (SL - ASK > stops_level * _Point);
if(!SL_check)
{
ERRMSG = StringFormat("For order %s StopLoss=%.5f must be greater than %.5f (Ask=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, ASK + stops_level * _Point, ASK, stops_level);
}
//--- controllare il TakeProfit
TP_check = (ASK - TP > stops_level * _Point);
if(!TP_check)
{
ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be less than %.5f (Ask=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, ASK - stops_level * _Point, ASK, stops_level);
}
//--- restituire il risultato del controlloreturn(TP_check && SL_check);
}
break;
}
//--- Verifica riuscitareturn(false);
}
Vedere gli altri controlli che il robot deve effettuare nell'articolo qui sotto:
Ho seguito le istruzioni sui vari forum, tra cui scrivere nuovamente la descrizione, nasconderla dal mercato e così via, ma la descrizione continua a tornare alla versione originale.
Ora non posso più ripristinare il prodotto sul mercato né modificarlo. Ho chiesto assistenza sul forum per questo problema, ma non ho ancora ricevuto assistenza.
Come posso risolvere questo problema di "Impossibilità di modificare la descrizione del prodotto"? Vi prego di aiutarmi
Prima di inviare gli ordini di compravendita, è necessario verificare se i volumi specificati nell'ordine sono corretti. Il numero di lotti che l'Expert Advisor intende specificare nell'ordine deve essere controllato prima di chiamare la funzione OrderSend(). Per gli strumenti finanziari, laSpecifica specifica i volumi minimi e massimi consentiti per la negoziazione, nonché la gradazione dei volumi. È possibile ottenere questi valori in MQL5dall'enumerazione ENUM_SYMBOL_INFO_DOUBLE utilizzando la funzioneSymbolInfoDouble().
//+------------------------------------------------------------------+//| Controlla il volume degli ordini per verificarne la correttezza ||//+------------------------------------------------------------------+bool CheckVolumeValue(double volume,string &description)
{
//--- volume minimo consentito per le operazioni di tradingdouble min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
if(volume<min_volume)
{
description=StringFormat("Volume inferiore al minimo consentito SYMBOL_VOLUME_MIN=%.2f",min_volume);
return(false);
}
//--- volume massimo consentito per le operazioni di tradingdouble max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
if(volume>max_volume)
{
description=StringFormat("Volume superiore al massimo consentito SYMBOL_VOLUME_MAX=%.2f",max_volume);
return(false);
}
//--- ottenere la gradazione minima del volumedouble volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
int ratio=(int)MathRound(volume/volume_step);
if(MathAbs(ratio*volume_step-volume)>0.0000001)
{
description=StringFormat("Il volume non è un multiplo della gradazione minima SYMBOL_VOLUME_STEP=%.2f, il volume corretto più vicino è %.2f",
volume_step,ratio*volume_step);
return(false);
}
description="Valore corretto del volume";
return(true);
}
Non è servito, posso correggere qualche altro codice?
Prima di inviare gli ordini di compravendita, è necessario verificare se i volumi specificati nell'ordine sono corretti. Il numero di lotti che l'Expert Advisor intende specificare nell'ordine deve essere controllato prima di chiamare la funzione OrderSend(). Per gli strumenti finanziari, laSpecifica specifica i volumi minimi e massimi consentiti per la negoziazione, nonché la gradazione dei volumi. Questi valori possono essere ottenuti in MQL5dall'enumerazione ENUM_SYMBOL_INFO_DOUBLE utilizzando la funzioneSymbolInfoDouble()
Non è servito, posso correggere qualche altro codice?
Potete dirmi come perfezionare lo script?
Leggere completamente l'articolo, 'CheckVolumeValue' è un controllo della correttezza dei parametri di input.
E c'è anche un controllo del corretto arrotondamento dei lotti...
Tenendo conto del volume della posizione aperta e del volume degli ordini in sospeso, il controllo finale avrà il seguente aspetto:
//+------------------------------------------------------------------+//| Restituisce il volume massimo consentito per l'ordine in base al simbolo |//+------------------------------------------------------------------+double NewOrderAllowedVolume(string symbol)
{
double allowed_volume=0;
//--- ottenere il limite massimo di volume nell'ordinedouble symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- ottenere il limite di caratteri sul volumedouble max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);
//--- ottenere il volume della posizione aperta per simbolodouble opened_volume=PositionVolume(symbol);
if(opened_volume>=0)
{
//--- se il volume è già esauritoif(max_volume-opened_volume<=0)
return(0);
//--- il volume della posizione aperta non supera il max_volumedouble orders_volume_on_symbol=PendingsVolume(symbol);
allowed_volume=max_volume-opened_volume-orders_volume_on_symbol;
if(allowed_volume>symbol_max_volume) allowed_volume=symbol_max_volume;
}
return(allowed_volume);
}
//+------------------------------------------------------------------+//| Funzione di avvio del programma di script|//+------------------------------------------------------------------+voidOnStart()
{
//---double step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP)/2.0;
double volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN)-step;
double finish=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX)+step;
//--- scoprire quante cifre decimali sono contenute nella gradazione del volumeint digits=(int)MathLog10(SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP));
if(digits<0) digits=-digits;
else digits=0;
//--- controllare molti valori di volume diversi nel ciclowhile(volume<finish+4*step)
{
string descr;
if(!CheckVolumeValue(volume,descr))
{
Print("Risultato dell'ispezione".,volume,": ",descr);
}
elsePrintFormat("Il volume %G è corretto".,volume);
volume+=3*step;
volume=NormalizeDouble(volume,digits+1);
}
//---
}
//+------------------------------------------------------------------+//| Controlla il volume degli ordini per verificarne la correttezza ||//+------------------------------------------------------------------+bool CheckVolumeValue(double volume,string &description)
{
//--- volume minimo consentito per le operazioni di tradingdouble min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
if(volume<min_volume)
{
description=StringFormat("Volume inferiore al minimo consentito SYMBOL_VOLUME_MIN=%.2f",min_volume);
return(false);
}
//--- volume massimo consentito per le operazioni di tradingdouble max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
if(volume>max_volume)
{
description=StringFormat("Volume superiore al massimo consentito SYMBOL_VOLUME_MAX=%.2f",max_volume);
return(false);
}
//--- ottenere la gradazione minima del volumedouble volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
int ratio=(int)MathRound(volume/volume_step);
if(MathAbs(ratio*volume_step-volume)>0.0000001)
{
description=StringFormat("Il volume non è un multiplo della gradazione minima SYMBOL_VOLUME_STEP=%.2f, il volume corretto più vicino è %.2f",
volume_step,ratio*volume_step);
return(false);
}
description="Valore corretto del volume";
return(true);
}
//+------------------------------------------------------------------+
Предлагаю свой набор торговых функций в виде готового советника. Представленный способ позволяет получать множество торговых стратегий простым добавлением индикаторов и изменением входных параметров.
Il mio EA restituisce un errore quando registra un nuovo prodotto:
test su EURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [Modifica fallita a causa della vicinanza dell'ordine o della posizione al mercato].
Ma il mio EA è pensato per funzionare su WIN$, non sul forex. Perché il tester non ti fa sapere quale asset eseguire?
Ora, come posso correggere qualcosa che non ha errori, perché l'EA funziona perfettamente, solo che non riesco a registrare il prodotto per la vendita.
Il mio EA restituisce un errore durante la registrazione di un nuovo prodotto:
test su EURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [Modifica fallita perché l'ordine o la posizione sono vicini al mercato].
Ma il mio EA è pensato per funzionare su WIN$, non sul forex. Perché il tester non ti fa sapere quale asset eseguire?
Ora, come posso correggere qualcosa che non ha errori, perché l'EA funziona perfettamente, solo che non riesco a registrare il prodotto per la vendita.
Il robot deve essere pronto a lavorare su qualsiasi asset....
Per correggere l'errore di cui sopra, prima di modificare la posizione è necessario eseguire il controllo riportato di seguito:
Vedere gli altri controlli che il robot deve effettuare nell'articolo qui sotto:
Quali test deve superare un robot di trading prima di essere pubblicato sul mercato - Articoli MQL5
Salve, non riesco a modificare la descrizione del prodotto su uno dei miei vecchi prodotti.
Ho seguito le istruzioni sui vari forum, tra cui scrivere nuovamente la descrizione, nasconderla dal mercato e così via, ma la descrizione continua a tornare alla versione originale.
Ora non posso più ripristinare il prodotto sul mercato né modificarlo. Ho chiesto assistenza sul forum per questo problema, ma non ho ancora ricevuto assistenza.
Come posso risolvere questo problema di "Impossibilità di modificare la descrizione del prodotto"? Vi prego di aiutarmi
Quando si carica l'Expert Advisor e si fa il test scrive un errore, non è chiaro come correggerlo.
test su EURUSD, H1 (compensazione)
2020.04.14 00:24:42 acquisto istantaneo fallito di 0,01 EURUSD a 1,09044 [Volume non valido].
2020.04.14 00:24:45 fallito acquisto istantaneo 0,01 EURUSD a 1,09044 [Volume non valido]
2020.04.14 00:24:48 acquisto istantaneo fallito 0,01 EURUSD a 1,09037 [Volume non valido]
2020.04.21 00:01:34 acquisto istantaneo fallito 0,01 EURUSD a 1,08626 [volume non valido]
2020.04.21 00:01:37 fallito acquisto istantaneo 0,01 EURUSD a 1,08626 [Volume non valido]
2020.04.21 00:01:40 fallito acquisto istantaneo 0,01 EURUSD a 1,08626 [Volume non valido]
2020.04.27 16:08:24 vendita istantanea fallita 0,01 EURUSD a 1,08546 [Volume non valido]
2020.04.27 16:08:27 vendita istantanea fallita 0,01 EURUSD a 1,08548 [Volume non valido]
2020.04.27 16:08:30 vendita istantanea fallita 0,01 EURUSD a 1,08547 [Volume non valido]
2020.04.29 20:15:52 vendita istantanea fallita 0,01 EURUSD a 1,08565 [Volume non valido]
2020.04.29 20:15:55 vendita istantanea fallita 0.01 EURUSD a 1.08566 [Volume non valido]
2020.04.29 20:15:58 vendita istantanea fallita 0,01 EURUSD a 1,08566 [volume non valido]
2020.05.18 00:12:09 acquisto istantaneo fallito 0,01 EURUSD a 1,08134 [Volume non valido]
2020.05.18 00:12:12 fallito acquisto istantaneo 0,01 EURUSD a 1,08134 [Volume non valido]
2020.05.18 00:12:15 fallito acquisto istantaneo 0,01 EURUSD a 1,08143 [Volume non valido]
2020.05.21 15:50:25 vendita istantanea fallita 0,01 EURUSD a 1,10031 [Volume non valido]
2020.05.21 15:50:28 vendita istantanea fallita 0,01 EURUSD a 1,10034 [Volume non valido]
2020.05.21 15:50:31 vendita istantanea fallita 0,01 EURUSD a 1,10036 [Volume non valido]
2020.05.25 19:00:05 acquisto istantaneo fallito 0,01 EURUSD a 1,08950 [Volume non valido]
2020.05.25 19:00:08 acquisto istantaneo fallito 0.01 EURUSD a 1.08951 [Volume non valido]
2020.05.25 19:00:11 acquisto istantaneo fallito 0,01 EURUSD a 1,08952 [Volume non valido]
non ci sono operazioni di trading
Quando si carica l'Expert Advisor e lo si testa scrive un errore, non è chiaro come correggerlo.
test su EURUSD, H1 (compensazione)
2020.04.14 00:24:42 fallito l'acquisto istantaneo di 0,01 EURUSD a 1,09044 [Volume non valido].
***
Leggilo, inseriscilo nel codice
Volumi errati nelle operazioni di trading
Prima di inviare gli ordini di compravendita, è necessario verificare se i volumi specificati nell'ordine sono corretti. Il numero di lotti che l'Expert Advisor intende specificare nell'ordine deve essere controllato prima di chiamare la funzione OrderSend(). Per gli strumenti finanziari, laSpecifica specifica i volumi minimi e massimi consentiti per la negoziazione, nonché la gradazione dei volumi. È possibile ottenere questi valori in MQL5dall'enumerazione ENUM_SYMBOL_INFO_DOUBLE utilizzando la funzioneSymbolInfoDouble().
Non è servito, posso correggere qualche altro codice?
Potete dirmi come perfezionare lo script?
Leggilo, inseriscilo nel codice
Volumi errati nelle operazioni commerciali
Prima di inviare gli ordini di compravendita, è necessario verificare se i volumi specificati nell'ordine sono corretti. Il numero di lotti che l'Expert Advisor intende specificare nell'ordine deve essere controllato prima di chiamare la funzione OrderSend(). Per gli strumenti finanziari, laSpecifica specifica i volumi minimi e massimi consentiti per la negoziazione, nonché la gradazione dei volumi. Questi valori possono essere ottenuti in MQL5dall'enumerazione ENUM_SYMBOL_INFO_DOUBLE utilizzando la funzioneSymbolInfoDouble()
Non è servito, posso correggere qualche altro codice?
Potete dirmi come perfezionare lo script?
Leggere completamente l'articolo, 'CheckVolumeValue' è un controllo della correttezza dei parametri di input.
E c'è anche un controllo del corretto arrotondamento dei lotti...
Tenendo conto del volume della posizione aperta e del volume degli ordini in sospeso, il controllo finale avrà il seguente aspetto:
add?
checkvolumevalue.mq5 come è scritto qui
aggiungere?
checkvolumevalue.mq5 come è scritto qui
Tutti i controlli necessari sono nell'articolo Quasi un costruttore per la creazione di un EA
Il codice richiesto in precedenza è adatto?
Si possono scrivere le righe necessarie dall'articolo.