Discussione sull’articolo "Creazione di un Expert Advisor, che fa Trading su una Serie di Strumenti" - pagina 5

 
Interesting:
Da Tnew[1] Intervallo di array non valido: sembra che si tratti di un overrun dell'intervallo. Non dimenticate che la numerazione degli elementi dell'array inizia con l'inizio dell'intervallo dell'array.

nessun accesso alla modifica del messaggio da 2010.07.16 22:41 2010.07.16 22:41:25 2010.07.16 22:41:25 #

Sostituire:8.Perché Exp_TEMA.mq5, durante i test, apre le operazioni all'interno di una barra? da

8.Perché Exp_TEMA.mq5, durante i test, apre operazioni multiple in una barra?

 
ias:
nessun accesso per modificare il messaggio da 2010.07.16 22:41 2010.07.16 22:41:25 2010.07.16 22:41:25 #

I messaggi possono essere modificati solo entro 3 giorni dalla pubblicazione.

 

ias:

8.Perché Exp_TEMA.mq5, durante il test, apre più operazioni in una sola barra?

Sarebbe logico supporre che non vi sia un controllo della presenza di posizioni aperte in precedenza e di ordini impostati....
 

Interesting:
Логично будт предположить то, что там нет проверки наличия ранее открытых позиций и установленных отложников...

Interessante:
Sarebbe logico supporre che non ci sia un controllo delle posizioni aperte in precedenza e che si impostino gli ordini pendenti....

Gli ordini pendenti non vengono utilizzati in Exp_TEMA.mq5. Le posizioni precedentemente aperte vengono controllate:

//+X================================================================X+
bool BuyPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool SellPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool BuyPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
     {
      if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_BUY) return(false);
     }
    else  return(false);
//+X================================================================X+
bool SellPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
    {
     if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_SELL)return(false);
    }
   else return(false); 

Forse qualcosa non va, in:

//+X================================================================X+
bool IsNewBar(int Number, string symbol, ENUM_TIMEFRAMES timeframe)
  {
//----+
   static datetime Told[];
   datetime Tnew[1];
   
   //----+ Dichiarazione di variabile per la memorizzazione delle dimensioni degli array di variabili
   static int Size_ = 0;
   
   //----+ Ridimensionamento delle matrici di variabili
   if (Number + 1 > Size_)
    {
     uint size = Number + 1;
     //----
     if (ArrayResize(Told, size) == -1)
      {
       string word = "";
       StringConcatenate(word, "IsNewBar( ", Number,
                    " ): Errore!!! Fallito il ridimensionamento degli array di variabili!!!".); 
       Print(word); 
       //---- 
       int error = GetLastError();
       ResetLastError();
       if (error > 4000)
        {
         StringConcatenate(word, "IsNewBar( ", Number, " ): Codice di errore ", error);
         Print(word); 
        }  
       //---- 
       Size_ = -2;
       return(false);
      }
    }
   
   CopyTime(symbol, timeframe, 0, 1, Tnew); 
   if (Tnew[0] != Told[Number])
    {
     Told[Number] = Tnew[0];
     return(true);
    }
//----+
   return(false);
  }

o in:

//+X================================================================X+
bool TradeSignalCounter
                      (
                       int Number,
                       string Symbol_,
                       bool Trade,
                       int period,
                       ENUM_APPLIED_PRICE ApPrice,
                       bool& UpSignal[],
                       bool& DnSignal[],
                       bool& UpStop[],
                       bool& DnStop[]
                      )
  
  {
//----+
   //----+ Controllo del divieto di commercio
   if (!Trade)return(true);
   
   //----+ Dichiarare una variabile per memorizzare la dimensione totale degli array di variabili
   static int Size_ = 0;
   
   //----+ Dichiarazione di un array per la memorizzazione degli handle degli indicatori come variabile statica
   static int Handle[];
   
   static int Recount[], MinBars[];
   double TEMA[4], dtema1, dtema2;
   
   //----+ Inizializzazione 
   if (Number + 1 > Size_) // Ingresso nel blocco di inizializzazione solo al primo avvio
    {
     Size_ = Number + 1; // L'entrata nel blocco è chiusa per questo numero
     
     //---- Ridimensionamento delle matrici di variabili
     ArrayResize(Handle,   Size_);
     ArrayResize(Recount,  Size_);
     ArrayResize(MinBars,  Size_);
     
     //---- Determinazione del numero minimo di barre sufficiente per il calcolo 
     MinBars[Number] = 3 * period;
     
     //---- Azzeramento preliminare delle celle dell'array
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //---- Utilizzare l'array come serie temporale
     ArraySetAsSeries(TEMA, true);
     
     //----+ Ottenere la maniglia dell'indicatore
     Handle[Number] = iTEMA(Symbol_, PERIOD_CURRENT, period, 0, ApPrice);
    }
     
   //----+ Verifica della sufficienza del numero di barre per il calcolo 
   if (Bars(Symbol_, 0) < MinBars[Number])return(true);

   //----+ Ricevere segnali di trading 
   if (IsNewBar(Number, Symbol_, PERIOD_CURRENT) || Recount[Number]) // Ingresso nel blocco in caso di cambio di barra o di copia dei dati fallita
    {
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //----+ Utilizzando le maniglie dell'indicatore, copiare i valori dell'indicatore
                   // i buffer in un array statico appositamente preparato
     if (CopyBuffer(Handle[Number], 0, 0, 4, TEMA) < 0)
      {
       Recount[Number] = true; // poiché i dati non sono stati ricevuti, si dovrebbe restituire 
                                 // in questo blocco di ricezione di segnali di trading sul tick successivo!
       return(false); // uscire dalla funzione TradeSignalCounter() senza ricevere segnali di trading
      }
      
     //---- Tutte le operazioni di copia dal buffer indicatore sono state completate con successo
     Recount[Number] = false; // è possibile non tornare a questo blocco fino al cambio di barra successivo
     
     int Digits_ = SymbolInfoInteger(Symbol_, SYMBOL_DIGITS) + 4;
     dtema2 = NormalizeDouble(TEMA[2] - TEMA[3], Digits_);
     dtema1 = NormalizeDouble(TEMA[1] - TEMA[2], Digits_);
     
     //---- Definizione dei segnali di ingresso
     if (dtema2 > 0 && dtema1 < 0) DnSignal[Number] = true;
     if (dtema2 < 0 && dtema1 > 0) UpSignal[Number] = true;
     
     //---- Definizione dei segnali di uscita
     if (dtema1 > 0) DnStop[Number] = true;
     if (dtema1 < 0) UpStop[Number] = true;
    }
//----+
   return(true);
  } 

Operazioni multiple in una barra durante il test di Exp_TEMA.mq5 su EURUSD, periodo D1

 
ias, è meglio rivolgersi all'autore dell'articolo....
 
ias:

Perché Exp_TEMA.mq5, durante i test, apre le operazioni all'interno della barra? su

Perché Exp_TEMA.mq5, in fase di test, apre operazioni multiple in una barra?

Il punto è che nel contesto di questo articolo, il compito era quello di implementare un semplice Expert Advisor multicurrency senza ingombrare l'idea principale con dettagli minori che interferiscono con la comprensione dell'essenza. Ognuno ha il suo modo di riempire i dettagli. Nella vostra situazione, tutto è risolto in modo elementare. Le variabili dei segnali di trading vengono utilizzate come input per le funzioni di trading e sono collegate dal link, e queste variabili vengono resettate dopo la transazione all'interno delle funzioni di trading.
Документация по MQL5: Торговые функции
Документация по MQL5: Торговые функции
  • www.mql5.com
Торговые функции - Документация по MQL5
 
GODZILLA:
Il punto è che nel contesto di questo articolo, l'obiettivo era quello di implementare un semplice Expert Advisor multicurrency senza ingombrare l'idea principale con dettagli minori che interferiscono con la comprensione dell'essenza. Ognuno ha il suo modo di riempire i dettagli. Nella vostra situazione, tutto è risolto in modo elementare. Le variabili dei segnali di trading vengono utilizzate come input per le funzioni di trading e sono collegate dal link, e queste variabili vengono ripristinate dopo l'esecuzione di un'operazione all'interno delle funzioni di trading.
Per favore, mostratemi come farlo sull'esempio del vostro Expert Advisor Exp_TEMA.mq5.
 

ias:
Покажите, пожалустайста, на примере вышего эксперта Exp_TEMA.mq5, как это сделать.

A mio parere, l'apprendimento e la comprensione di un linguaggio di programmazione consistono nel fatto che un individuo risolve piccoli compiti di riorganizzazione del codice per le proprie esigenze. Altrimenti, a cosa servono questo sito e gli articoli di programmazione? Per dimostrare le capacità degli autori degli articoli? Chi non vuole capirlo da solo può utilizzare la risorsa https://www.mql5.com/ru/job
Per esempio, in MQL4 ho implementato questo approccio nella sua forma più semplice come questo https://www.mql5.com/it/articles/1516. Per MQL5, non cambia nulla e tutto viene fatto allo stesso modo.

.

 
GODZILLA:

Ho grande rispetto per l'autore dell'articolo "Creare un Expert Advisor che faccia trading su diversi strumenti".
1.Il codice dell'Expert Advisor Exp_TEMA.mq5 presentato nell'articolo apre più trade in una barra durante i test,
come riportato in precedenza su questo topic. Questo fatto conferma la presenza di un codice errato o di un bug nell'Expert Advisor, che molti visitatori del sito sono interessati ad eliminare.
2. La risposta di Roche sull'argomento "Expert Advisors:Multicast": "Inoltre, la funzione di determinazione di una nuova barra può essere implementata senza utilizzare la funzione di copia dell'orario" - conferma anche la possibilità di un'operazione di multicast..la risposta di Roche sull'argomento "Expert Advisors:Multicast": "Inoltre, la funzione di determinazione di una nuova barra può essere implementata senza utilizzare la funzione di copia del tempo" - conferma anche la possibilità di una scrittura più razionale della funzione IsNewBar() nell'Expert Advisor.
Vorrei vedere come l'autore eliminerà professionalmente questi difetti, dato che tutti possono commettere errori e solo i professionisti possono correggerli correttamente.
 
ias:

Se si osservano attentamente i sistemi di trading presentati nell'articolo, si può concludere che si tratta di sistemi di rovesciamento. Lo stoploss in questi sistemi ha un ruolo secondario ed è posto a una distanza molto discreta dall'entrata, calcolata in almeno diverse candele. La professionalità nella presentazione del materiale consiste nel presentare l'argomento nella forma più semplice possibile, senza ingombrarlo con ulteriori espedienti, e non sulla base del pubblico che non vuole pensare con la propria testa. Qualsiasi libro di testo è sempre difettoso rispetto all'ideale. E questo è considerato accettabile e normale. In futuro ci sarà un tale ordine di presentazione dettagliata di questo dettaglio della costruzione di sistemi di trading, ci sarà una revisione dettagliata dell'implementazione, che non è nemmeno così semplice.
Per quanto riguarda la copia del tempo, posso dire con certezza che io stesso non ho notato alcuna differenza significativa da una scrittura più razionale della funzione IsNewBar() nell'Expert Advisor, anche se l'ho misurata! Ho anche scritto un articolo su questo argomento. Sarebbe quindi comprensibile se ci fosse un significativo peggioramento del lavoro del codice.
E se volessi, io, ad esempio, potrei fare a pezzi qualsiasi articolo di questo sito senza problemi. Ma apprezzo le informazioni prima di tutto perché sono disponibili, non perché corrispondono alle mie idee sull'ideale.
Quindi non ho intenzione di eliminare difetti inverosimili e allo stesso tempo ingombrare in modo significativo il codice, che non è così semplice, per motivi comprensibili e professionali.