Cosa aggiorna RefreshRates() - pagina 6

 
Mikhail Nazarenko:

MT4 è una scatola oscura e posso giudicare cosa succede solo testando in condizioni reali. All'inizio non ho usato affatto il sonno, ma quando mi stavano capitando delle stronzate su alcune barre di ore ho aggiunto il sonno e il problema è scomparso. Non so in che ordine e come la serie temporale di MT4 viene aggiornata. Non sono sicuro di cosa farne, lo userò come un'opportunità per risolvere il mio problema e condividerlo con gli altri.

Anch'io ho riscontrato questo problema, tutto va bene nello Strategy Tester ma sul mercato reale non c'è niente.

Sto usando l'Expert Advisor da lunedì e sono sorpreso.

Ho aperto diverse aperture redditizie e poi sono tornato a comprare invece di vendere, e viceversa.

Forum sul trading, sistemi di trading automatico e test di strategia

Tutte le domande dei neofiti su MQL4 e MQL5, o qualsiasi consiglio e discussione su algoritmi e codici

Vitaly Muzichenko, 2021.02.15 21:48

Ho già iniziato a lavorare con MQL4 per verificare il mio algoritmo.

Non ho mai provato prima, ma non ho mai visto correttamente un algoritmo del genere. Codice semplice, solo 2 buffer di indicatori



Il codice è molto semplice

   double poi=Point();
   for(int i = limit-2; i>0; i--) {
      if(open[i+0] > close[i+0] && MathAbs(open[i+0] - high[i+0]) < 0.1 * poi)
         Dn[i] = high[i+0] + 30 * poi;
      if(open[i+0] < close[i + 0] && MathAbs(open[i+0] - low[i+0]) < 0.1 * poi)
         Up[i] = low[i+0] - 30 * poi;
   }
 
Vitaly Muzichenko:

L'ho affrontato io stesso, tutto va bene nel tester, ma nel mercato reale è una schifezza.

Sto eseguendo l'EA da lunedì e sono sorpreso.

Sono sorpreso. Alcune aperture sono corrette, ma dopo sono di nuovo in acquisto invece che in vendita e viceversa.


Il codice dell'indicatore è semplice.

Questo è lo stesso problema che avevo prima di iniziare questo thread. Ho creato la funzione isRefresh() qui sopra. Provate. Per me ha funzionato bene.

E non è uno slittamento?

 
Vitaly Muzichenko:

Il codice dell'indicatore è semplice

l'indicatore apre le transazioni?

le frecce sono le stesse - il problema è nel codice EA

 
Mikhail Nazarenko:

Se iniziate a insegnare, allora aiutate, confermate con codice, test, un link a un argomento del forum o documentazione. Tutto il resto è solo masturbazione cerebrale.

Si prega di chiarire ciò che non è chiaro. Dopo aver letto sembra che la questione principale sia risolta e rimane da discutere su quanto sia obsoleto il 4).

Non ho avuto problemi dopo aver inserito tale caricamento temporale

bool HistoryCheck(int TF)
  {
   int err=0;   
   int i=0;
   datetime d1=0,d2=0;
   while(i<10)
    { 
    if((d1=iTime(NULL,TF,0))==0 || (d2=iTime(NULL,TF,InpPeriod*2))==0)          
        PrintFormat("itime=0, %s, %s", TimeToString(d1),TimeToString(d2)) ; 
   err=GetLastError();    
   if(err==4066)    
    {
    	PrintFormat("Error=4066") ; 
    	 Sleep(500);     	
    }
   else break;	
      SleepA(100);
      i++;                 
    } // while
   if(i==10)
	 { Comment("Update failed. Go to the next attempt."); return(false); }
   PrintFormat("HistoryCheck %d , %s, %s",i,TimeToString(d1),TimeToString(d2)) ;
   Comment(""); 
   return(true);
  }

Se avete bisogno di accedere raramente e irregolarmente al timeframe, dovreste (ma non necessariamente se il grafico è aperto) eseguire nuovamente questo caricamento prima di controllare

  if((iTime(NULL,TF,0)+PeriodSeconds(TF))<TimeCurrent()
   || (iTime(NULL,TF,1)+PeriodSeconds(TF)*2)<TimeCurrent())
   HistoryCheck(TF)
Документация по MQL5: Операции с графиками / ChartOpen
Документация по MQL5: Операции с графиками / ChartOpen
  • www.mql5.com
ChartOpen - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Mikhail Nazarenko:

Questa è la stessa cosa che ho incontrato prima di aprire questo thread. Per qualche motivo il terminale dà dati obsoleti sul reale, ho scritto la funzione isRefresh() qui sopra. Provate. Per me ha funzionato bene.

Ma non è uno slittamento?

No, si apre su una nuova barra 0 e si cerca il segnale sulla barra chiusa, cioè la 1.

Questa è la situazione a volte quando un EA non ottiene ciò che si aspetta attraverso iCustom(). Di nuovo: a volte, ma non spesso.

Eccone un altro - uno fresco. Ho aperto correttamente una posizione di acquisto secondo il segnale e anche il segnale successivo dell'indicatore è di acquisto (freccia sotto). Ma l'EA tramiteiCustom() ha ricevuto un segnale di vendita e ha chiuso la posizione di acquisto e aperto quella di vendita, anche se dovrebbe esserci un'altra posizione di acquisto aperta.

C'è qualcosa di sbagliato nelle serie temporali, non l'ho ancora capito, è stato trovato 4 giorni fa e probabilmente non cercherò di scoprirlo. Non ho visto alcun problema nel tester

In questo momento.

--- E ho appena trovato


 

E anche, ma già invece di una vendita, è aperto un acquisto. Come ho detto, non è spesso, ma succede

Il codice dell'indicatore è semplice - non ci sono complicati


 
Aleksey Mavrin:

Si prega di chiarire ciò che non è chiaro. Dopo aver letto questo, sembrava che la questione principale fosse risolta e siamo rimasti a discutere su quanto sia obsoleto il 4)

Non ho avuto problemi con questo caricamento di timeframes

Se avete bisogno di accedere raramente e irregolarmente a un timeframe, dovreste (ma non necessariamente se il grafico è aperto) eseguire di nuovo questo caricamento prima del controllo, o tale controllo sarà utile

Questo è corretto,

questo viene dall'aiuto:

L'accesso ai dati degli indicatori e delle serie temporali è indipendente dal fatto che i dati richiesti siano pronti (il cosiddetto accesso asincrono). Questo è fondamentale per il calcolo degli indicatori personalizzati, quindi in assenza dei dati richiesti le funzioni come Copy...() restituiscono immediatamente un errore. Tuttavia, quando si accede da Expert Advisors e script, vengono fatti diversi tentativi di ricevere dati, con una piccola pausa, che ha lo scopo di fornire il tempo necessario per scaricare le serie temporali richieste o per calcolare i valori degli indicatori.


Se le informazioni sono richieste da un altro grafico (il nome dello strumento e/o il valore del timeframe differiscono da quello corrente), può verificarsi la situazione in cui non esiste un grafico appropriato aperto nel terminale client e i dati necessari devono essere richiesti al server. In questo caso, l'errore ERR_HISTORY_WILL_UPDATED (4066 - dati storici richiesti in stato di aggiornamento) sarà posto nella variabile _Last_error e la richiesta deve essere ritentata dopo qualche tempo (vedere l'esempio di ArrayCopySeries()).

 
Vitaly Muzichenko:

E anche, ma già invece di una vendita, è aperto un acquisto. Come ho detto, non è spesso, ma succede

Il codice dell'indicatore è semplice - non ci sono complicazioni


Il metodo più affidabile è quello di scrivere il registro. Ad ogni transazione scrivete i valori delle variabili chiave nel file. Per esperienza: la condizione non rigorosa <=0 invece di <0 ha introdotto una terribile curvatura.

 
Vitaly Muzichenko:

L'ho affrontato io stesso, tutto va bene nel tester, ma nel mercato reale è una schifezza.

Sto eseguendo l'EA da lunedì e sono sorpreso.

Sono sorpreso. Alcune aperture sono corrette, ma dopo sono di nuovo in acquisto invece che in vendita e viceversa.


Il codice dell'indicatore è semplice

   double poi=Point();
   for(int i = limit-2; i>0; i--) {
      if(open[i+0] > close[i+0] && MathAbs(open[i+0] - high[i+0]) < 0.1 * poi)
         Dn[i] = high[i+0] + 30 * poi;
      if(open[i+0] < close[i + 0] && MathAbs(open[i+0] - low[i+0]) < 0.1 * poi)
         Up[i] = low[i+0] - 30 * poi;
   }


Perché dovrei aggiungere 0 a [i + 0]?

 
Aleksey Mavrin:

Si prega di chiarire ciò che non è chiaro. Dopo aver letto questo, sembrava che la questione principale fosse risolta e dobbiamo ancora discutere su quanto sia obsoleto il 4)

Non ho avuto problemi con questo caricamento di timeframes

Se avete bisogno di fare riferimento al timeframe raramente e irregolarmente, allora questo caricamento dovrebbe (ma non necessariamente se il grafico è aperto) essere fatto di nuovo prima del controllo, o un tale controllo aiuterebbe

Grazie, questo è il punto. Il terminale dà davvero un errore 4066 dopo l'accesso a una serie temporale non aggiornata tramite iTime? Ho incontrato iClose che dava informazioni non aggiornate invece di zero.

Motivazione: