Discussione sull’articolo "Wizard MQL5: Come creare un modulo di trailing delle posizioni aperte" - pagina 2

 

Grazie per il tuo grande e utile articolo,

Posso gentilmente chiederti di portare un esempio di come si potrebbe utilizzare questa classe nella scrittura di un consulente esperto, la mia intenzione è che l'utilizzo di questa classe in modello EA non EA generare...

Grazie ancora,..

 

Buon pomeriggio. Il modulo non funziona.

Il log mostra che il livello di soglia del profitto deve essere maggiore del livello di impostazione degli ordini.

Nel costruttore ho inizializzato delle variabili che non sono vuote e non sono uguali a zero. Perché ricevo un errore?

 //+------------------------------------------------------------------+
//|TrailingFixedPips.mqh |
//| Copyright 2009-2013, MetaQuotes Software Corp. | |
//| http://www.mql5.com
//+------------------------------------------------------------------+
#include <Expert\ExpertTrailing.mqh>
// avvio della descrizione della procedura guidata
//+----------------------------------------------------------------------+
//| Descrizione della classe|
//| Titolo=Trailing con Stop Loss fluttuante (Fox104) | |
//| Tipo=Trailing|
//| Nome=FixedPips|
//| Classe=CTrailingFixedPips|
//| Pagina=|
//| Parametro=StopLevel,int,30,Livello di trailing dello Stop Loss (in punti) | |
//| Parametro=ProfitLevel,int,50,livello di trailing del Take Profit (in punti) | |
//+----------------------------------------------------------------------+
// descrizione della procedura guidata fine
//+------------------------------------------------------------------+
//| Classe CTrailingFixedPips.|
//| Scopo: Classe di trailing stop con livello di stop fisso in pip. || Scopo: Classe di trailing stop con livello di stop fisso in pip. ||
//| Deriva dalla classe CExpertTrailing.|
//+------------------------------------------------------------------+
class CTrailingFixedPips : public CExpertTrailing
  {
protected:
   //--- parametri di ingresso
   int               m_stop_level;
   int               m_profit_level;

public:
                     CTrailingFixedPips(void);
                    ~CTrailingFixedPips(void);
   //--- metodi di inizializzazione dei dati protetti
   void              StopLevel(int stop_level)     { m_stop_level=stop_level;     }
   void              ProfitLevel(int profit_level) { m_profit_level=profit_level; }
   virtual bool      ValidationSettings(void);
   //---
   virtual bool      CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp);
   virtual bool      CheckTrailingStopShort(CPositionInfo *position,double &sl,double &tp);
  };
//+------------------------------------------------------------------+
//| Costruttore|
//+------------------------------------------------------------------+
void CTrailingFixedPips::CTrailingFixedPips(void)
  {
            m_stop_level = 30;
            m_profit_level = 50;
  }
//+------------------------------------------------------------------+
//| Distruttore|
//+------------------------------------------------------------------+
CTrailingFixedPips::~CTrailingFixedPips(void)
  {
  }
//+------------------------------------------------------------------+
//||Impostazioni di convalida dei dati protetti.
//+------------------------------------------------------------------+
bool CTrailingFixedPips::ValidationSettings(void)
  {
   if(!CExpertTrailing::ValidationSettings())
      return(false);
//--- controlli iniziali dei dati
   if((m_profit_level-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit_level!=0.0)
     {
      printf(__FUNCTION__+": il livello di profitto soglia deve essere maggiore del livello di impostazione dell'ordine".);
      return(false);
     }
//--- ok
   return(true);
  }
//+------------------------------------------------------------------+
//| Controllo del trailing stop e/o del profitto per una posizione lunga.
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp)
  {
//--- controllo
   if(position==NULL)
      return(false);
   if(m_stop_level==0)
      return(false);
//--- controllo dei parametri 
   if(m_profit_level==0.0)  return(false);
//- già in pareggio?
   double open=position.PriceOpen();
   if(position.StopLoss()>=open) return(false);
//--- controllo del profitto
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(m_symbol.Bid()-open>m_profit_level*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open+m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+
//| Controllo del trailing stop e/o del profitto per la posizione corta.
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopShort(CPositionInfo *position,double &sl,double &tp)
  {
//--- controllo
   if(position==NULL)
      return(false);
   if(m_stop_level==0)
      return(false);
//--- controllo dei parametri
   if(m_profit_level==0.0)  return(false);
//- già in pareggio?
   double open=position.PriceOpen();
   if(position.StopLoss()<=open) return(false);
//--- controllo del profitto
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(open-m_symbol.Ask()>m_profit_level*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open-m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
Fox104:

Buon pomeriggio. Il modulo non funziona.

Il log mostra che il livello di soglia del profitto deve essere maggiore del livello di impostazione degli ordini.

Nel costruttore ho inizializzato delle variabili che non sono vuote e non sono uguali a zero. Perché ottengo un errore?

Formatta correttamente il codice nel tuo messaggio: Inserisci correttamente il codice nel forum. (Il tuo messaggio è già stato corretto).
 
Andy:

Quando si utilizza il modulo specificato nell'articolo, nel log dell'Expert Advisor vengono generati degli errori durante il caricamento dell'Expert Advisor sul grafico:

2017.09.06 00:28:29.873 1 (EURUSD,M5) OnInit: errore di inizializzazione degli indicatori

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::SetPriceSeries: la modifica della serie temporale è proibita

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::SetOtherSeries: la modifica delle serie temporali è vietata

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::InitIndicators: i parametri di impostazione non sono controllati

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpert::InitIndicators: errore inizializzazione indicatori dell'oggetto trailing

2017.09.06 00:31:20.256 1 (EURUSD,M5) OnInit: errore inizializzazione indicatori

Forse non è aggiornato, dove trovarne uno nuovo o cosa correggere in questo caso?

Modificare il modulo di trailing "sampleTrailing.mqh":

//+------------------------------------------------------------------+
//| Controllare i parametri di impostazione.|
//| INPUT: no.|
//| OUTPUT: vero se le impostazioni sono corrette, altrimenti falso. || OUTPUT: vero se le impostazioni sono corrette, altrimenti falso.
//| NOTA: No.|
//+------------------------------------------------------------------+
bool CSampleTrailing::ValidationSettings()
  {
   if(!CExpertTrailing::ValidationSettings())
      return(false);
//--- nel caso in cui il metodo Init non sia stato richiamato
   if(m_symbol==NULL) return(false);
//--- controllo dei parametri
   if((m_profit-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit!=0.0)
     {
      printf(__FUNCTION__+": il livello di profitto soglia deve essere superiore al livello di impostazione dell'ordine".);
      return(false);
     }
//--- ok
   return(true);
  }
 
Andy:

Quando si utilizza il modulo specificato nell'articolo, nel log dell'Expert Advisor vengono generati errori durante il caricamento dell'Expert Advisor su un grafico:


Forse è obsoleto, dove trovarne uno nuovo o cosa correggere in questo caso?

Grazie per il messaggio, l'articolo è stato corretto.

 
Andy:

Quando si apre una posizione short e si imposta lo stop loss abituale (non trailing) a 0 nei parametri, il trailing stop non viene impostato su breakeven, ma se si sposta leggermente lo stop abituale e lo si imposta ad almeno -1 pip, tutto funziona. Nel longing tutto funziona normalmente. Nel verificare la condizione che ci sia già un breakeven (lo stop è inferiore al prezzo), inizialmente 0 nel valore dello stop e non lo lascia andare oltre.


È così. È lo Stop Loss specificato che fa scattare QUESTO modulo trailing per lavorare a pareggio. Si presume cioè che la posizione DEVE avere inizialmente uno stop loss.


Aggiunto:

lo scopo di ogni articolo è quello di mostrare e far conoscere gli approcci per risolvere alcuni problemi. Poi l'utente stesso dovrebbe sviluppare il proprio codice sulla base delle conoscenze acquisite.

 
Andy:

Dovrebbe essere integrato in modo che se non c'è uno stop, lo sia anche il trailing - riempire la variabile con almeno il valore di apertura.

(Ho ricevuto una notifica push per 2 dei tuoi messaggi, ma uno di essi è mancante - cancellato)?


Se avete bisogno di cambiare qualcosa, questo non è il problema di questo articolo. Qui potete farlo da soli, sulla base delle conoscenze acquisite. Se invece volete comporre un incarico tecnico e pensate che l'articolo verrà riscritto in base ad esso, non è così.

Come vedo le vostre azioni: riscrivere il modulo (una piccola modifica) e utilizzare.


Aggiunto: Per l'ultima volta, si prega di utilizzare il pulsante "risposta". Altrimenti non risponderò.

 
Andy:

Ok, lo scriverò io stesso. Hai cancellato uno dei tuoi post (dimmi se l'hai fatto, così non dovrò cercarlo)?


Puoi aprire un nuovo argomento, qualcosa come"Modulo di mantenimento delle posizioni aperte per raggiungere il pareggio" - penso che un tale argomento sarà utile.

Quindi sì, stavo modificando il mio post e ho cliccato su "cancella" per errore - cioè in realtà ho scritto DUE post e ne ho cancellato uno. Pertanto il push è arrivato correttamente.