Discussione sull’articolo "Come pubblicare un prodotto sul Market" - pagina 48

 

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.

 
Adriano De Mello Moura #:

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 locali
   bool SL_check = false, TP_check = false;

//--- Determina l'ultimo prezzo del simbolo corrente
   double BID = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double ASK = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

//--- ottenere il livello SYMBOL_TRADE_STOPS_LEVEL
   int 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 ordine
   switch(type)
     {
      //--- Operazione di acquisto
      case  ORDER_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 controllo
         return(SL_check && TP_check);
        }
      //--- Operazione di vendita
      case  ORDER_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 controllo
         return(TP_check && SL_check);
        }
      break;
     }

//--- Verifica riuscita
   return(false);
  }



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

 
Kirill Voytseshchuk #:

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].

***

Leggete il messaggio di errore completo - ci sarà un link all'articolo "Quali controlli dovrebbero passare...".
 

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().

//+------------------------------------------------------------------+
//| Controlla il volume degli ordini per verificarne la correttezza ||
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- volume minimo consentito per le operazioni di trading
   double 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 trading
   double 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 volume
   double 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?

Potete dirmi come perfezionare lo script?

Обзор рынка - Торговые операции - Справка по MetaTrader 5
Обзор рынка - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Окно "Обзор рынка" позволяет просматривать ценовые данные по торговым инструментам: котировки, ценовую статистику и график тиков. Здесь...
 
Kirill Voytseshchuk #:

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:

//+------------------------------------------------------------------+
//| 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'ordine
   double symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- ottenere il limite di caratteri sul volume
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);

//--- ottenere il volume della posizione aperta per simbolo
   double opened_volume=PositionVolume(symbol);
   if(opened_volume>=0)
     {
      //--- se il volume è già esaurito
      if(max_volume-opened_volume<=0)
         return(0);

      //--- il volume della posizione aperta non supera il max_volume
      double 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);
  }

add?

checkvolumevalue.mq5 come è scritto qui


//+------------------------------------------------------------------+
//| Funzione di avvio del programma di script|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   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 volume
   int digits=(int)MathLog10(SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP));
   if(digits<0) digits=-digits;
   else digits=0;

//--- controllare molti valori di volume diversi nel ciclo
   while(volume<finish+4*step)
     {
      string descr;
      if(!CheckVolumeValue(volume,descr))
        {
         Print("Risultato dell'ispezione".,volume,": ",descr);
        }
        else PrintFormat("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 trading
   double 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 trading
   double 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 volume
   double 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);
  }
//+------------------------------------------------------------------+
 
Kirill Voytseshchuk ordini pendenti, il controllo finale avrà il seguente aspetto:

aggiungere?

checkvolumevalue.mq5 come è scritto qui


Tutti i controlli necessari sono nell'articolo Quasi un costruttore per la creazione di un EA

Почти конструктор для создания советника
Почти конструктор для создания советника
  • www.mql5.com
Предлагаю свой набор торговых функций в виде готового советника. Представленный способ позволяет получать множество торговых стратегий простым добавлением индикаторов и изменением входных параметров.
 

Il codice richiesto in precedenza è adatto?

Si possono scrivere le righe necessarie dall'articolo.