Analógico para iBarShift - página 11

 
Nikolai Semko:

Sim, bem, isso é de facto um comportamento estranho para uma função padrão. Afinal de contas, estamos a lidar exactamente com valores de ajuste à sua "referência".

A função padrão iBarShift da MQL4, quando a hora solicitada cai num buraco, devolve o número de barra esquerda (ou seja, sábado neste caso), e iBarShift3 devolve o número de barra direita do buraco (ou seja, segunda-feira), o que faz mais sentido.

Se estivermos no buraco, é lógico devolver a barra esquerda, o último valor conhecido, mas não o futuro.

 
Vitaly Muzichenko:

Se estivermos num buraco, é lógico devolver a barra esquerda, o último valor conhecido, mas não o futuro.

Certo, não estou a fazer qualquer sentido. Confundi o passado com o futuro). Provavelmente porque 1 (passado) > 0 (futuro). Programado.
 
Alain Verleyen:


Na maioria dos casos esta função devolve o resultado errado

PS: É necessário publicar a versão inglesa ou a tradução russa está correcta?

Sim, a tradução está correcta.

Execute este guião e verá que as funções produzem exactamente o mesmo resultado.

Pode dar um exemplo de um prazo e do momento em que os valores destas funções são diferentes?

A propósito, a sua função é frequentemente confundida. Devolve o valor -1

2018.04.04 22:51:05.666 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:45:00
2018.04.04 22:50:46.867 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:46:00
2018.04.04 22:50:41.255 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
2018.04.04 22:50:23.496 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:45:00
2018.04.04 22:50:05.596 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
2018.04.04 22:48:38.638 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
Arquivos anexados:
 
Alain Verleyen:

O requisito é ter APENAS como versão de mql4


A sua função não está a funcionar correctamente com o parâmetro exacto=verdadeiro.

Isto pode ser visto neste guião.

E aqui está um análogo de funcionamento completo da função iBarShift com parâmetro exacto:

int iBarShift1(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   int Res=Bars(Symb,TimeFrame,time+1,UINT_MAX);
   if(exact) if((TimeFrame!=PERIOD_MN1 || time>TimeCurrent()) && Res==Bars(Symb,TimeFrame,time-PeriodSeconds(TimeFrame)+1,UINT_MAX)) return(-1);
   return(Res);
  }

Sem este parâmetro, pode ser simplificado para este formulário:

Bars(Symb,TimeFrame,time+1,UINT_MAX);
Arquivos anexados:
 
Nikolai Semko:

Sim, a tradução está correcta.

Execute este guião e verá que as funções produzem exactamente o mesmo resultado.

Pode dar um exemplo de um prazo e do momento em que os valores destas funções são diferentes?

A propósito, a sua função é frequentemente confundida. Devolve o valor -1

Por favor, seja sério. O meu código é para mql5.

Retorna -1 porque a função Bars() não é fiável sob MT4.

...   
   int shift=Bars(symbol,timeframe,time,LastBAR);

   datetime checkcandle[1];

   if(CopyTime(symbol,timeframe,time,1,checkcandle)==1)
     {
      if(checkcandle[0]==time)
         return(shift-1);
      else if(exact && time>checkcandle[0]+PeriodSeconds(timeframe))
         return(-1);
      else
         return(shift);
     }
...

Roteiro a correr no gráfico AUDUSD, M5.

Isto não está a acontecer com o MT5.

 
Alain Verleyen:

Por favor, seja sério. O meu código é para mql5.

Retorna -1 porque a função Bars() não é fiável sob MT4.

Roteiro a correr no gráfico AUDUSD, M5.

Isto não está a acontecer com o MT5.

Disse que deveria funcionar como na MQL4.

Mas este guião também pode ser executado em MQL5

2018.04.05 09:52:40.760 TestBarShift2 (EURUSD,M12)      PERIOD_M3  BarShift1 = -1  BarShift2 = 0    2018.08.10 18:39:49   exact = true
2018.04.05 09:52:40.760 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.04.15 00:25:08   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M6  BarShift1 = -1  BarShift2 = 0    2018.04.21 04:26:03   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M15  BarShift1 = -1  BarShift2 = 0    2018.05.29 17:10:52   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M12  BarShift1 = -1  BarShift2 = 0    2018.09.16 13:10:33   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.09.25 21:24:50   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.05.30 20:04:10   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M5  BarShift1 = -1  BarShift2 = 0    2018.04.29 16:12:16   exact = true

Se exacto=Tempo verdadeiro e futuro tem de regressar -1.

O meu guião também encontrou um estranho erro:

Este erro é confirmado por esta verificação:

Print (iBarShift2(_Symbol,PERIOD_MN1,D'2015.12.31 21:03:54',true)); // -1
Print (iBarShift1(_Symbol,PERIOD_MN1,D'2015.12.31 21:03:54',true)); // 28
Por isso, afinal tinha razão sobre aexistência de situações anormais no vosso algoritmo.
Arquivos anexados:
 

De toda a análise que fiz, podemos concluir que este análogo completo do iBarShift:

int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   int Res=Bars(Symb,TimeFrame,time+1,UINT_MAX);
   if(exact) if((TimeFrame!=PERIOD_MN1 || time>TimeCurrent()) && Res==Bars(Symb,TimeFrame,time-PeriodSeconds(TimeFrame)+1,UINT_MAX)) return(-1);
   return(Res);
  }

é de longe o mais correcto, e ao mesmo tempo o mais rápido e com o algoritmo mais simples e mais curto.

Se não precisar do parâmetro exacto, pode utilizar a versão simplificada:

int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time)
  {
   return(Bars(Symb,TimeFrame,time+1,UINT_MAX));
  }

ou simplesmente utilizar esta versão equivalente sem chamar a função:

Bars(Symb,TimeFrame,time+1,UINT_MAX);
Ou estarei eu errado?
 
O silêncio é um sinal de acordo.
 
Nikolai Semko:
O silêncio é um sinal de acordo.

Através de CTRL+SHIFT+F em ME fez uma pesquisa por "BarShift". Acontece que eu não uso uma função semelhante. Aparentemente, eu próprio não precisava dele.

Uma vez escreveu uma variante para converter MT4 EAs para MT5 numa só linha. Parece ser a única razão para o escrever.

Não trabalho com bares e não compreendo porque é que os outros não fazem o mesmo.

Não entrou no seu código. Mas sempre satisfeito quando se consegue uma solução rápida.

 
fxsaber:

Através de CTRL+SHIFT+F em ME fez uma pesquisa por "BarShift". Acontece que eu não uso uma função semelhante. Aparentemente, eu próprio não precisava dele.

Uma vez escreveu uma variante para converter MT4 EAs para MT5 numa só linha. Parece ser a única razão para o escrever.

Não trabalho com bares e não compreendo porque é que os outros não fazem o mesmo.

Não entrou no seu código. Mas sempre satisfeito quando se consegue uma solução rápida.

Compreendo o que quer dizer, mas para mim trabalhar com bares ainda é urgente. Talvez um dia se torne também um rudimento para mim.

Razão: