Analógico para iBarShift - página 14

 
fxsaber:

Então não percebo porque é que o Bars pensa que 18:00:01 pertence à M1-bar 18:01 e não às 18:00.

E a lógica aqui é a mesma que o facto de a minha filha estar agora no seu segundo aniversário, apesar de só ter feito um há uma semana. Ou hoje é 09.04.2018, embora 01 Jan 00 fosse 2017 anos, 3 meses e 8 dias atrás .

A propósito, a TimeCurrent precisa de ser substituída por SYMBOL_TIME.

Obrigado! Eu realmente não sabia de tal identificador.

 

A propósito, quando testei a correcção do algoritmo iBars, comparando-o com o benchmark Bars em MQL4, tentando diferentes variantes ao acaso, encontrei um bug em Bars:

Print(Bars(_Symbol,PERIOD_MN1,D'2005.08.31 00:00:00',D'2005.08.31 23:00:00')); // 1  должен быть 0, т.к. временной диапазон находиться внутри одного бара.
Print(Bars(_Symbol,PERIOD_MN1,D'2006.08.31 00:00:00',D'2006.08.31 23:00:00')); // 0

Não existe tal insecto na MQL5.

Claro que não é significativo, uma vez que só aparece em TF = MN1, nas datas 30 e 31, stop_time = 23 e só antes de 2005 :))))

Aqui está o guião para MQL4 que o apanha, e iBars acabou por ser mais referência do que Barras nativas.

Arquivos anexados:
TestiBars.mq4  10 kb
 
fxsaber:


A propósito, a TimeCurrent deve ser substituída por SYMBOL_TIME.

Não, não tem.
Não acrescenta correcção, porque TimeCurrent() é universal para todos os símbolos, porque devolve a última hora de chegada da citação para todos os símbolos, não a actual.

Ao mesmo tempo, SymbolInfoInteger(symbol_name,SYMBOL_TIME) é muito lento em comparação com o TimeCurrent(), e este tempo é necessário em cada chamada de iBars

 

Para aqueles que estão interessados.

Versão editada de iBars (semelhante às Barras embutidas, apenas sem falhas e mais rápido).

Corrigidos alguns bugs.

Se tiver notado que o seu código MQL5 fica pendurado durante 10-20 segundos de repente e tem a função Bars, que pode devolver 0, então recomendo vivamente a sua substituição por esta versão.
Funcionará mais rapidamente e sem pendências.

int iBars(string symbol_name,ENUM_TIMEFRAMES  timeframe,datetime start_time,datetime stop_time)
  {
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;
   static datetime LastTime0=0;
   static int PerSec=0;
   static int PreBars=0;
   static datetime LastBAR=0;
   static datetime LastTimeCur=0;
   datetime TimeCur;
   if(stop_time<start_time) {TimeCur=stop_time; stop_time=start_time; start_time=TimeCur; }
   TimeCur=TimeCurrent();
   if(LastTimeFrame!=timeframe) if(timeframe==PERIOD_MN1) PerSec=2419200; else PerSec=::PeriodSeconds(timeframe);
   if(timeframe<PERIOD_W1) TimeCur-=TimeCur%PerSec;
   if(start_time>TimeCur) {LastSymb=NULL; return(0);}
   if(LastTimeFrame!=timeframe || LastSymb!=symbol_name || ((TimeCur-LastBAR)>0 && TimeCur!=LastTimeCur))
      LastBAR=(datetime)SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE);

   LastTimeCur=TimeCur;
   if(PerSec==0) return(0);
   if(start_time>LastBAR)
     {LastTimeFrame=timeframe; LastSymb=symbol_name; return(0);}

   datetime tS,tF=0;
   bool check=true;
   if(timeframe<PERIOD_W1) tS=start_time-(start_time-1)%PerSec-1;
   else if(timeframe==PERIOD_W1) tS=start_time-(start_time-259201)%PerSec-1;
   else
     {
      PerSec=2678400;
      MqlDateTime dt;
      TimeToStruct(start_time-1,dt);
      tS=dt.year*12+dt.mon;
     }
   if(stop_time<=LastBAR)
     {
      if(timeframe<PERIOD_W1) tF=stop_time-(stop_time)%PerSec;
      else if(timeframe==PERIOD_W1) tF=stop_time-(stop_time-259200)%PerSec;
      else
        {
         MqlDateTime dt0;
         TimeToStruct(stop_time,dt0);
         tF=dt0.year*12+dt0.mon;
        }
      if(tS==tF) {PreBars=0; check=false;}
     }
   if((LastTimeFrame!=timeframe || LastSymb!=symbol_name || tS!=LastTime || tF!=LastTime0) && check)
      PreBars=Bars(symbol_name,timeframe,start_time,stop_time);
   LastTime=tS; LastTime0=(datetime)tF;
   LastTimeFrame=timeframe;
   LastSymb=symbol_name;
   return(PreBars);
  }
 
Nikolai Semko:

Versão editada de iBars(semelhante às Barras embutidas, apenas sem falhas e mais rápido).

Corrigidos alguns bugs.

Barras embutidas() está sobrecarregada:

1. int Bars(const string symbol_name,ENUM_TIMEFRAMES timeframe)
2. int Bars(const string symbol_name,ENUM_TIMEFRAMES timeframe,datetime start_time,datetime stop_time)

Tem apenas um formulário de chamada.

 
Artyom Trishkin:

As barras embutidas() estão sobrecarregadas:

Só tem um formulário para telefonar.

se precisar de um formulário curto, não há problema em utilizar o formulário incorporado. Quase não há falhas.

 
Nikolai Semko:

Não, não é necessário.
Não adicionará correcção, porque TimeCurrent() é universal para todos os símbolos, porque devolve a última hora de chegada da citação para todos os símbolos, não a actual.

SymbolInfoInteger(symbol_name,SYMBOL_TIME) é muito lento em comparação com o TimeCurrent(), e este tempo é necessário cada vez que iBars é chamado

Os Cotypes podem ir para todos os caracteres excepto o de interesse.

Ok, olhei para a nova fonte. Viu que as edições, que foram discutidas, não foram feitas. Estou fora.

 
Porque não o fazem os próprios criadores?
 
Seria muito mais conveniente para os utilizadores chamar uma função e obter um conjunto sincronizado (alinhado no tempo) de filas através de vários instrumentos
 
A propósito, sobre a função Bars(). Esta pode ser a causa do clincher.
Razão: