Analógico para iBarShift - página 10

 
Aleksey Vyazmikin:

Quer dizer que vai aparecer na segunda-feira? É isso que eu quero... :)

Sim, bem, na realidade é um comportamento estranho para uma função padrão. Afinal, estamos aqui a tratar de ajustar os valores à sua "referência".

A função padrão iBarShift da MQL4 retorna o número da barra esquerda (ou seja, sábado neste caso), e iBarShift3 retorna o número da barra direita (ou seja, segunda-feira) quando a hora solicitada atinge o buraco, o que é mais lógico.

 
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 atinge o buraco, retorna o número da barra esquerda (ou seja, sábado neste caso), e iBarShift3 retorna o número da barra direita do buraco (ou seja, segunda-feira), o que faz mais sentido.

E o que acontecerá se estivermos agora no buraco (em tempo real) e esperarmos receber informações sobre a barra, que índice nos será oferecido? Presumo que será "1" em MQL4, enquanto para o terceiro algoritmo será "0", ou não?

Penso que a função MQL4 tem uma mensagem de "não olhar em frente", o que é verdade até certo ponto - tudo depende da tarefa.

 

Nikolai Semko :

...

Tenho apenas uma queixa sobre a vossa opção: é muito complicada e lenta.

Quando a afixei (há 4 anos atrás) o objectivo principal era a exactidão (novamente), porque todas as outras versões que encontrei estavam erradas (em comparação com a versão mql4).

Eu sei que pode ser mais rápido.

Tente provar o contrário. Encontre uma única combinação de parâmetros quando a sua função e a minha mostrarem valores diferentes.

Na maioria dos casos, a função devolve o resultado errado.

Mas ainda não implementei o último parâmetro exactamente nele, porque não compreendo de todo porque é necessário. Pessoalmente, nunca precisei dele.

O requisito é ter SOMENTE a versão mql4.

Fórum sobre comércio, sistemas comerciais automatizados e teste de estratégias comerciais

Analógico para iBarShift

Alain Verleyen, 2018.04.05 00:18

Na verdade, apenas mostra o contrário, a minha versão é a única que está correcta. (E o iBarShift1 original a partir deste código está correcto).

A minha versão foi concebida como uma função autónoma, tal como o mql4 iBarShift .


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

 
vladevgeniy:
Porque não tenta a minha função? Existe aí uma solução que ajusta o início e o fim das barras no tempo. Parece calcular tudo correctamente. E é mais rápido no tempo do que a versão 3 da sua versão mais rápida. Ou o ramo é mais importante?) Ou também há aí um erro?) Tenho-o usado há muito tempo....

Onde está, a sua função, para a experimentar?

 
Aleksey Vyazmikin:

E o que acontece se estamos agora num buraco (em tempo real) e esperamos obter informações sobre uma barra, que índice nos será oferecido? Presumo que será "1" em MQL4, enquanto para o terceiro algoritmo será "0", ou não?

Penso que a função MQL4 tem a mensagem "don't look ahead", o que é verdade até certo ponto - tudo depende do problema.

Não. O primeiro é zero. Em tempo real, funciona da mesma forma.

 
Aleksey Vyazmikin:

E onde está, a sua função, para a experimentar?

Está na página 7, no final).

int iBarShift(string symbol, ENUM_TIMEFRAMES timeframe, datetime time){
datetime t1 = TimeCurrent()+10000000;
int ps = PeriodSeconds(timeframe);
double div = time/(double)ps;
double mant = div - MathFloor(div);
int ret = Bars(symbol, timeframe, (datetime)(time-(ps*mant)), t1)-1;
return(ret);
}

Isso poderia ser mais conveniente.

 
vladevgeniy:
Porque não tenta a minha função? Tenho uma solução que compensa o início e o fim das barras a tempo. Parece calcular tudo correctamente. E é mais rápido no tempo do que a 3ª versão da sua versão mais rápida. Ou o ramo é mais importante?) Ou também há aí um erro?) Tenho-o usado há muito tempo....

Isso é engraçado ))))

Aqui está a sua função:

int iBarShift4(string symbol,ENUM_TIMEFRAMES timeframe,datetime time)
  {
   datetime t1=TimeCurrent()+10000000;
   int ps=PeriodSeconds(timeframe);
   double div=time/(double)ps;
   double mant=div-MathFloor(div);
   int ret=Bars(symbol,timeframe,(datetime)(time-(ps*mant)),t1)-1;
   return(ret);
  }

Uma vez que não conhece alguns operadores matemáticos, como % - o resto da divisão

Vamos fazer uma simplificação da sua função.

Funcionou:

int iBarShift4(string symbol,ENUM_TIMEFRAMES timeframe,datetime time)
  {
   time-=time%PeriodSeconds(timeframe);
   return(Bars(symbol,timeframe,time,UINT_MAX)-1);
  }

E aqui está a minha função:

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

Muito semelhante. A sério?

Só o seu faz tudo muito mal e é mais lento a fazê-lo.

Pode experimentá-lo com este guião em MQL4.

Arquivos anexados:
 
Nikolai Semko:

Não. O primeiro é zero. Funciona da mesma forma em tempo real.

OK - apenas um algoritmo que me mostra "-1" em dados futuros hoje....

 
Nikolai Semko:

Isso é engraçado ))))


Sim, bem, dá incoerências). Vou desenterrar tudo bem.

 
vladevgeniy:

Bem, sim, dá incoerências). Vou desenterrar tudo bem.

Eu próprio tenho andado em círculos. Só agora descobri a solução mais curta.