Analógico para iBarShift - página 9

 
Alain Verleyen:

Qual foi o seu problema?

Aqui está um exemplo da sua função trabalhando falsamente sob o nome "BarShift1".


 
Aleksey Vyazmikin :

Aqui está um exemplo da sua função que funciona falsamente - funciona sob o nome "BarShift1".


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.

Não é optimizado para múltiplas consultas, pelo que a comparação temporal é irrelevante. @nicholishen publicou uma boa biblioteca optimizada para chamadas em massa.


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

Aminha versão foi concebida para ser utilizada como uma função autónoma, exactamente como mql4 iBarShift.

Não está optimizado para pedidos múltiplos, pelo que a comparação do tempo é irrelevante. @nicholishen publicou uma boa biblioteca optimizada para chamadas em massa.

iBarShift
iBarShift
  • votos: 46
  • 2013.10.25
  • Alain Verleyen
  • www.mql5.com
Многие ищут функцию iBarShift, которая была в языке MQL4 (например, 1,2,3). В языке MQL5 ее нет, но есть все возможности для ее реализации в виде библиотеки. В качестве альтернативы многие программисты предложили свои варианты реализации этой функции на MQL5. Обнаружилось, что все 4 версии содержат ошибки (не воспроизводят в точности работу...
 
Alain Verleyen:

De facto, 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.

Não é optimizado para múltiplas consultas, pelo que a comparação temporal é irrelevante. @nicholishen publicou uma boa biblioteca optimizada para chamadas em massa.


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

Aminha versão foi concebida para ser utilizada como uma função autónoma, exactamente como mql4 iBarShift.

Não está optimizado para pedidos múltiplos, pelo que a comparação do tempo é irrelevante. @nicholishen publicou uma boa biblioteca optimizada para chamadas em massa.

Não estou a falar de tempo de processamento, estou a falar do número do bar.

Na fotografia pode ver-se que às 8:37 o código pensa que a barra mais próxima é a barra do dia anterior 23:00 , mas na realidade a barra mais próxima é a das 10:00. Está mais próximo, tanto matematicamente como logicamente.

 
Aleksey Vyazmikin:

Não estou a falar do tempo de processamento, estou a falar do número do bar.

A fotografia mostra que às 8:37 o código considera que a barra mais próxima é a barra do dia anterior às 23:00, mas na realidade a barra mais próxima é às 10:00. Ele está mais próximo tanto em matemática como em lógica.

vamos simplificá-lo.

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

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.

Experimente o mql4, compare, a mesma coisa.
 
Alain Verleyen:
Vamos simplificá-lo.
Experimente o mql4, compare, a mesma coisa.

Vejo o vosso argumento. Não o vou verificar. Aparentemente, é a minha tarefa que difere da lógica aceite.

 
Alain Verleyen:

Qual foi o problema que descobriu?

Escrevi isto há muito tempo. Já não me lembro, mas algo me confundiu.
De qualquer modo, agora só encontrei uma situação anormal.
Quando ainda não carregados os dados dos símbolos podem retornar -1 e devem retornar 0.

Isto pode ser verificado usando o guião para MQL4 que estou a anexar.

Este guião leva um tempo e um período de tempo aleatórios. Se o valor de iBarShiftX não corresponder à função iBarShift normal, então mensagem através de Imprimir.

Se executar este guião sobre um símbolo recentemente aberto, verá erros. A repetição do guião sobre o mesmo símbolo não dará erros.

Mas é uma bagatela. Na minha versão, o problema é o mesmo.

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

Aqui está a sua variante:

int iBarShift2(string symbol,ENUM_TIMEFRAMES timeframe,datetime time,bool exact=false)
  {
   datetime LastBAR;
   if(!SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE,LastBAR))
     {
      datetime opentimelastbar[1];
      if(CopyTime(symbol,timeframe,0,1,opentimelastbar)==1)
         LastBAR=opentimelastbar[0];
      else
         return(-1);
     }
   if(time>LastBAR)
      return(0);
   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);
     }
   return(-1);
  }

E aqui está a minha função, que faz a mesma coisa, mas com um algoritmo simples e muito mais rápido:

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

Pode usar um ainda mais curto sem a função:

Bars(Symb,TimeFrame,time+1,UINT_MAX);

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

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

Mas se alguém precisar realmente dele, pode ser implementado.

Deixei a variante iBarShift3, porque trata incorrectamente os buracos do histórico. Pode ser fixado, mas não vejo a questão, uma vez que a opção acima é suficiente.

Arquivos anexados:
 
Nikolai Semko:


Deixei a opção iBarShift3 porque não lida correctamente com os buracos do histórico. Pode ser fixado, mas não vejo qual é o objectivo, porque a opção acima é suficiente.

Os buracos são devidos à falta de pro-trading no bar, ou outros? E, como é que a inexactidão se manifesta?

 
Aleksey Vyazmikin:

Os buracos são devidos a uma falta de pro-trading no bar, ou outros? E qual é a inexactidão?

Vamos tomar um domingo em qualquer altura em que não haja comércio:

Print("iBarShift  = "+IntegerToString(iBarShift (_Symbol,PERIOD_H1,D'01.04.2018 10:00:00')));  
Print("iBarShift3 = "+IntegerToString(iBarShift3(_Symbol,PERIOD_H1,D'01.04.2018 10:00:00'))); // показывает на единицу меньше
 
Nikolai Semko:

Digamos que tomamos o domingo como qualquer outra altura em que não há comércio:

Então mostra segunda-feira? É isso que eu quero... :)

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