Erros, bugs, perguntas - página 12

 

Durante a noite reparei numa coisa muito estranha, a hora de início do bar é reflectida com um erro - o erro foi de mais de um minuto. Agora quero verificá-lo e fiz um indicador de teste

#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);
  }
Registo

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

Os dois primeiros tiquetaques são claros, é um começo indicador. Mas os próximos .... Acontece que existe um novo bar de acordo com o tempo do servidor, enquanto este tick pertence ao antigo bar. À noite, este delta é um pesadelo...

A questão para os criadores é um bug ? ou foi concebido assim?

Z.I. enquanto escreve isto é o que aparece no diário de bordo

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

Arquivos anexados:
prov_tick.mq5  2 kb
 
Prival:

Durante a noite reparei numa coisa muito estranha, a hora de início do bar é reflectida com um erro - o erro foi de mais de um minuto. Agora decidi verificá-lo e criei um indicador de teste


Se adicionar taxas_total à saída, verá que ocorrem erros ao comparar os minutos actuais com os minutos da barra anterior.

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

Isto é, tempo[taxas_total-2].

Além disso, a saída do delta não é totalmente clara.

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

Os parâmetros abrir[], alto[], baixo[] e fechar[] contêm matrizes com os preços de abertura, máximo, mínimo e fecho do período de tempo actual. Parâmetro tempo[] contém um conjunto de valores de tempo aberto, parâmetro spread[] contém um conjunto com o histórico de spreads (se for especificado um spread para um instrumento comercial). Os parâmetros volume[] e tick_volume[] contêm a história do comércio e do volume do tick, respectivamente.

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

Durante a noite reparei numa coisa muito estranha, a hora de início do bar é reflectida com um erro - o erro foi de mais de um minuto. Decidi verificá-lo agora e fiz um indicador de teste

Registo

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

Os dois primeiros tiquetaques são claros, é um começo indicador. Mas os próximos .... Acontece que existe um novo bar de acordo com o tempo do servidor, enquanto este tick pertence ao antigo bar. À noite, este delta é um pesadelo...

Pergunta aos criadores, é um bug ou foi concebido dessa forma?

Z.I. enquanto escreve isto é o que aparece no diário de bordo

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

Tente testar como se segue. Sem loop.

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

Mais adiante sobre o texto.

 
stringo:

Tente verificar como se segue. Sem ciclo.

A seguir no texto.

Já está. Obrigado. Fiz uma verificação dentro do laço.

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

Na altura do novo bar i ainda não mudou. Não económico, os mesmos dados são repetidamente calculados. Embora...

é esta situação https://book.mql4.com/ru/samples/icustom fig.119 excluída na MQL5 se não ? e este modelo de indicador sempre sairá sempre bem próximo ? ou existem algumas armadilhas ?

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. obrigado pela ciência
Создание пользовательских индикаторов - Простые программы на MQL4 - Учебник по MQL4
  • book.mql4.com
Создание пользовательских индикаторов - Простые программы на MQL4 - Учебник по MQL4
 
sergey1294:
Quando começo a executar a minha EA, todo o terminal cai no testador, mas se o coloco num gráfico, tudo está bem.

Está provado pela experiência que cerca de 110 parâmetros podem ser digeridos (e há questões). Com 120, o terminal trava se o Expert Advisor for especificado no testador.


Já dei algumas soluções em privado, mas se algo acontecer, podem também perguntar aos criadores. Acho que eles podem ajudar com esta limitação.

 
Interesting:

Está provado pela experiência que cerca de 110 parâmetros podem ser digeridos (e há questões). A 120 o terminal cai se o Expert Advisor for especificado no testador.


Já dei algumas soluções em privado, mas se alguma coisa, pode perguntar aos programadores. Acho que eles podem ajudar com esta limitação.

estranho, é claro, que tal restrição afecte o testador. Em quad, por exemplo, não existe tal problema
 

agora as citações de fim-de-semana não estão a chegar. executar o guião

Print(TimeCurrent());

resultado

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

embora o último bar tenha a hora 2010.06.18 23:00:00

parece estranho, muito inconveniente testar a correcção de algumas funções.

 

Falta o botão "Aplicar" na janela de definições do indicador.


 
Interesting:

Está provado pela experiência que cerca de 110 parâmetros podem ser digeridos (e há questões). A 120 o terminal cai se o Expert Advisor for especificado no testador.

Já dei algumas soluções em privado, mas se alguma coisa, pode perguntar aos criadores. Acho que eles podem ajudar com esta limitação.

É possível optimizar um máximo de 64 parâmetros.
 
stringo:
Um máximo de 64 parâmetros pode ser optimizado.
Optimizar 64 e utilizar aproximadamente 110 no testador (sem optimização). Embora 110, claro, já seja um "pesadelo" de parâmetros para o Conselheiro Especialista (mas acontece)...