Analógico para iBarShift - página 7

 

Aqui está a versão de trabalho mais rápida e correcta em todas as TFs:

int iBarShift3(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;
   static int PerSec=::PeriodSeconds(LastTimeFrame);

   if(LastTimeFrame!=TimeFrame) PerSec=::PeriodSeconds(TimeFrame);
   if(TimeFrame<PERIOD_D1) time-=time%PerSec;

   if((time!=LastTime) || (Symb!=LastSymb) || (TimeFrame!=LastTimeFrame))
     {
      Res=::Bars(Symb,TimeFrame,time,UINT_MAX);
      if(TimeFrame<PERIOD_D1) Res--;
      if(Res<0) Res=0;

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }

   return(Res);
  }

A velocidade abranda para TF D1, W1 e MN1

E aqui está um indicador de teste, que mostra claramente a resposta das diferentes versões, bem como a sua velocidade (o segundo número. Quanto menor for o número, mais rápida é a função)


Ambas as versões 3 e 4 funcionam correctamente. Mas a 3ª é mais rápida.

As variantes com CopyTime são as mais lentas.

Isto pode ser verificado em MQL4 (ver indicador em anexo).

Não especifico a autoria de diferentes variantes, porque já fiquei confuso.
Mas a terceira, a forma mais útil é 80% a partir de@fxsaber. Só o afinei um bocadinho.

Arquivos anexados:
 
Nikolai Semko:

Ambas as opções 3 e 4 funcionam correctamente. Mas o 3 é o mais rápido. As variantes do CopyTime são as mais lentas.

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

Discussão sobre "LifeHack for trader: misturar ForEach on define (#define)"

fxsaber, 2018.02.14 11:58

As medições de velocidade da função ZZY devem ser medidas num ambiente em que o desempenho é importante - Testador.

 
fxsaber:

As medidas não são realmente importantes aqui. Pode-se ver que a lógica é a mais rápida.

 
Nikolai Semko:

Aqui está a versão de trabalho mais rápida e correcta em todas as TFs:

A velocidade abranda para TF D1, W1 e MN1

E aqui está um indicador de teste, que mostra claramente a resposta das diferentes versões, bem como a sua velocidade (o segundo número. Quanto menor for o número, mais rápida é a função)


Ambas as versões 3 e 4 funcionam correctamente. Mas a 3ª é mais rápida.

As variantes com CopyTime são as mais lentas.

Pode ser verificado em MQL4 (ver indicador em anexo).

Não estou a indicar a autoria de diferentes variantes porque já estou confuso.
Mas a terceira variante, a mais funcional, é 80% de@fxsaber. Só o afinei um pouco.

Adicionei TF ao vosso indicador - os dois primeiros algoritmos não são de todo úteis.

Nos números, a actual TF é H1, e o cálculo é baseado em taxas diárias.



 
Renat Akhtyamov:
Sim (destacado)

-1 é um menos (para esclarecer), devolvido pela função de erro, que diz que não existe tal barra

Assim, a minha função

também precisa de ser refinado

embora...

Documentação:

"Nota.

Se os dados das séries de tempos com os parâmetros especificados ao chamar a função Bars() ainda não tiverem sido gerados no terminal, ou se os dados das séries de tempos não estiverem sincronizados com o servidor de comércio no momento da chamada da função, então a função retornará o valor zero. "

====

Se res==0, então apanharemos -1 da função tal como está.

===

Portanto, tudo funciona, use-o em seu proveito!

No indicador acima pode ver-se claramente como este método é falso.

 
Nikolai Semko:

Aqui está a versão de trabalho mais rápida e correcta em todas as TFs:

A velocidade abranda para TF D1, W1 e MN1

E aqui está um indicador de teste, que mostra claramente a resposta das diferentes versões, bem como a sua velocidade (o segundo número. Quanto menor for o número, mais rápida é a função)


Ambas as versões 3 e 4 funcionam correctamente. Mas a 3ª é mais rápida.

As variantes com CopyTime são as mais lentas.

Pode ser verificado em MQL4 (ver indicador em anexo).

Não especifico a autoria de diferentes variantes, porque já fiquei confuso.
Mas a terceira variante, a mais funcional, é 80% de@fxsaber. Só o afinei um bocadinho.

A varianteiBarShift3 não funciona correctamente.

 

Aqui está a minha versão. Parece funcionar tanto com estruturas júnior como sénior. A velocidade é um pouco mais rápida do que o iBarshift3.


int iBarShift(string symbol, ENUM_TIMEFRAMES timeframe, datetime time){

data/hora t1 = TimeCurrent()+10000000;

int ps = PeriodSeconds(timeframe);

double div = tempo/(duplo)ps;

double mant = div - MathFloor(div);

int ret = Bars(symbol, timeframe, (datetime)(datetime(ps*mant)), t1)-1;

return(ret);

}

 
Vitaly Muzichenko:

A opçãoiBarShift3 não funciona correctamente.

Posso ter um exemplo de que não está a funcionar correctamente?

Então isso deixa apenas a opção quatro?

 
Vitaly Muzichenko:

A opçãoiBarShift3 não funciona correctamente.

Vocabulário é tudo para nós.

 
Nikolai Semko:

Vocabulário é tudo para nós.

Fiz uma verificação rápida: há uma função que está a funcionar há mais de um dia, substituí oiBarShift3 e consegui que a EA trabalhasse incorrectamente. Foi assim que cheguei à minha conclusão.

Aqui está o que eu uso

int iBarShift(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 we always return 0
  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);
 }
Razão: