Errori, bug, domande - pagina 12

 

Durante la notte ho notato una cosa molto strana, l'ora di inizio del bar si riflette con un errore - l'errore era più di un minuto. Ora voglio controllarlo e ho fatto un indicatore di prova

#property indicator_chart_window
datetime old_time=0;
int      MaxBars=10;    // ограничение 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()  {return(0);}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
   if(rates_total<10) return(0);  // ничего не считаем и ничего не рисуем на графике         
   
   int      start_pos,   // точка старта
            count_tick;
   MqlDateTime str1,str2;
   

   if(prev_calculated==0) 
      {
      old_time=0;
      count_tick=0;
      start_pos=rates_total-3;
      }
   else start_pos=prev_calculated-1;
//--- расчет 
   for(int i=start_pos;i<rates_total;i++)
     {
      TimeToStruct(TimeCurrent(),str1); // время сервера
      TimeToStruct(time[i],      str2); // время бара  
      if(str1.min!=str2.min) {
      // Сбой - тик принадлежит не своему бару
         count_tick++;
         Print("тик №=",count_tick," i=", i," c=",close[i]," time[i]=",time[i]," time=",TimeCurrent()," delta=",str1.sec);
      }   
      } // end for(...
   return(rates_total);
  }
Log

2010.06.18 10:42:03 prov_tick (EURUSD,M1) tick #=6 i=50558 c=1.23797 time[i]=2010.06.18 08:41:00 time=2010.06.18 08:42:05 delta=5

2010.06.18 10:40:59 prov_tick (EURUSD,M1) tick #=5 i=50557 c=1.23848 time[i]=2010.06.18 08:40:00 time=2010.06.18 08:41:01 delta=1

2010.06.18 10:40:01 prov_tick (EURUSD,M1) tick #=4 i=50556 c=1.23862 time[i]=2010.06.18 08:39:00 time=2010.06.18 08:40:04 delta=4

2010.06.18 10:39:03 prov_tick (EURUSD,M1) tick #=3 i=50555 c=1.23881 time[i]=2010.06.18 08:38:00 time=2010.06.18 08:39:05 delta=5

2010.06.18 10:38:30 prov_tick (EURUSD,M1) tick#2 i=50554 c=1.23859 time[i]=2010.06.18 08:37:00 time=2010.06.18 08:38:31 delta=31

2010.06.18 10:38:30 prov_tick (EURUSD,M1) tick#1 i=50553 c=1.23858 time[i]=2010.06.18 08:36:00 time=2010.06.18 08:38:31 delta=31

Le prime due zecche sono chiare, è un inizio indicatore. Ma i prossimi .... Si scopre che c'è una nuova barra secondo l'ora del server, mentre questo tick appartiene alla vecchia barra. Di notte questo delta è un incubo...

Domanda agli sviluppatori è un bug? O così è stato concepito?

Z.I. mentre scrive questo è ciò che appare nel log

2010.06.18 10:45:09 prov_tick (EURUSD,M1) tick #=9 i=50561 c=1.23787 time[i]=2010.06.18 08:44:00 time=2010.06.18 08:45:12 delta=12

File:
prov_tick.mq5  2 kb
 
Prival:

Durante la notte ho notato una cosa molto strana, l'ora di inizio del bar si riflette con un errore - l'errore era più di un minuto. Ora ho deciso di controllarlo e ho creato un indicatore di prova


Se aggiungete il valore di rates_total all'output, vedrete che si verificano errori quando si confrontano i minuti della barra corrente con i minuti della barra precedente.

2010.06.18 11:53:18     prov_tick_src (EURUSD,M1)       тик №=4 i=51420 rates_total=51422 c=1.23997 time[i]=2010.06.18 09:51:00 time=2010.06.18 09:52:06 delta=6
2010.06.18 11:52:12     prov_tick_src (EURUSD,M1)       тик №=3 i=51419 rates_total=51421 c=1.24061 time[i]=2010.06.18 09:50:00 time=2010.06.18 09:51:00 delta=0

Cioè, tempo[tassi_totale-2].

Inoltre, l'uscita delta non è del tutto chiara.

https://www.mql5.com/ru/docs/basis/function/events#oncalculate dice:

I parametri open[], high[], low[] e close[] contengono array con i prezzi di apertura, massimo, minimo e chiusura del timeframe corrente. Il parametro time[] contiene un array di valori di tempo aperto, il parametro spread[] contiene un array con la storia degli spread (se viene specificato uno spread per uno strumento di trading). I parametri volume[] e tick_volume[] contengono rispettivamente la storia del volume degli scambi e dei tick.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Prival:

Durante la notte ho notato una cosa molto strana, l'ora di inizio del bar si riflette con un errore - l'errore era più di un minuto. Ho deciso di controllarlo ora e ho fatto un indicatore di prova

Log

2010.06.18 10:42:03 prov_tick (EURUSD,M1) tick #=6 i=50558 c=1.23797 time[i]=2010.06.18 08:41:00 time=2010.06.18 08:42:05 delta=5

2010.06.18 10:40:59 prov_tick (EURUSD,M1) tick #=5 i=50557 c=1.23848 time[i]=2010.06.18 08:40:00 time=2010.06.18 08:41:01 delta=1

2010.06.18 10:40:01 prov_tick (EURUSD,M1) tick #=4 i=50556 c=1.23862 time[i]=2010.06.18 08:39:00 time=2010.06.18 08:40:04 delta=4

2010.06.18 10:39:03 prov_tick (EURUSD,M1) tick #=3 i=50555 c=1.23881 time[i]=2010.06.18 08:38:00 time=2010.06.18 08:39:05 delta=5

2010.06.18 10:38:30 prov_tick (EURUSD,M1) tick #=2 i=50554 c=1.23859 time[i]=2010.06.18 08:37:00 time=2010.06.18 08:38:31 delta=31

2010.06.18 10:38:30 prov_tick (EURUSD,M1) tick #1 i=50553 c=1.23858 time[i]=2010.06.18 08:36:00 time=2010.06.18 08:38:31 delta=31

Le prime due zecche sono chiare, è un inizio indicatore. Ma i prossimi .... Si scopre che c'è una nuova barra secondo l'ora del server, mentre questo tick appartiene alla vecchia barra. Di notte questo delta è un incubo...

Domanda agli sviluppatori, è un bug o è stato progettato così?

Z.I. mentre scrive questo è ciò che appare nel log

2010.06.18 10:45:09 prov_tick (EURUSD,M1) tick #=9 i=50561 c=1.23787 time[i]=2010.06.18 08:44:00 time=2010.06.18 08:45:12 delta=12

Provate a testare come segue. Senza anello.

      TimeToStruct(TimeCurrent(),      str1); // время сервера
      TimeToStruct(time[rates_total-1],str2); // время последнего бара  

Più avanti nel testo.

 
stringo:

Provate a controllare come segue. Senza ciclo.

Il prossimo nel testo.

Ops, capito, grazie. Ho fatto un controllo all'interno del ciclo.

   if(old_time<time[i]) 
         {
         Print("НОВЫЙ бар");
         old_time=time[i];
         //...
         }  
// а нужно вот так
   if(old_time<time[rates_total-1]) // работаем только по завершенным барам
         {
         Print("НОВЫЙ бар");
         old_time=time[rates_total-1];
         //...
         } 

Al momento del nuovo bar i non è cambiato. Non economico, gli stessi dati vengono calcolati ripetutamente. Anche se...

Questa situazione https://book.mql4.com/ru/samples/icustom fig.119 è esclusa in MQL5 se no? e questo modello di indicatore produrrà sempre una chiusura corretta? o ci sono delle insidie?

input int   MaxBars=240;
datetime old_time=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()  {return(0);}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
//---
   if(prev_calculated==0) 
      {
      //... расчитать историю
      //...
      old_time=time[rates_total-1];
      }
// работаем только по завершенным барам
   if(old_time<time[rates_total-1]) 
      {
      old_time=time[rates_total-1];
      Print("НОВЫЙ бар close[1]=", close[rates_total-2]);
      }  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
P.S. grazie per la scienza
Создание пользовательских индикаторов - Простые программы на MQL4 - Учебник по MQL4
  • book.mql4.com
Создание пользовательских индикаторов - Простые программы на MQL4 - Учебник по MQL4
 
sergey1294:
Quando inizio ad eseguire il mio EA l'intero terminale si blocca nel tester, ma se lo metto su un grafico tutto va bene.

È provato per esperienza che circa 110 parametri possono essere digeriti (e ci sono domande). A 120, il terminale va in crash se l'Expert Advisor è specificato nel tester.


Ho già dato alcune soluzioni in privato, ma se succede qualcosa, puoi anche chiedere agli sviluppatori. Penso che potrebbero essere in grado di aiutare con questa limitazione...

 
Interesting:

È provato per esperienza che circa 110 parametri possono essere digeriti (e ci sono domande). A 120 il terminale va in crash se l'Expert Advisor è specificato nel tester.


Ho già dato alcune soluzioni in privato, ma per qualsiasi cosa, potete chiedere agli sviluppatori. Penso che potrebbero essere in grado di aiutare con questa limitazione...

Strano, naturalmente, che una tale restrizione colpisca il tester. In quad, per esempio, non c'è questo problema
 

ora le citazioni del fine settimana non arrivano. eseguendo lo script

Stampa(TimeCurrent());

risultato

2010.06.20 00:26:06 00 (USDJPY,M1) 2010.06.18 22:35:52

anche se l'ultima barra ha il tempo 2010.06.18 23:00:00

sembra strano, molto scomodo per testare la correttezza di alcune funzioni.

 

Manca il pulsante "Applica" nella finestra delle impostazioni dell'indicatore.


 
Interesting:

È provato per esperienza che circa 110 parametri possono essere digeriti (e ci sono domande). A 120 il terminale va in crash se l'Expert Advisor è specificato nel tester.

Ho già dato alcune soluzioni in privato, ma per qualsiasi cosa, potete chiedere agli sviluppatori. Penso che potrebbero essere in grado di aiutare con questa limitazione...

È possibile ottimizzare un massimo di 64 parametri.
 
stringo:
È possibile ottimizzare un massimo di 64 parametri.
Ottimizzare 64 e usare circa 110 nel tester (senza ottimizzazione). Anche se 110, naturalmente, è già un numero "da incubo" di parametri per l'Expert Advisor (ma succede)...