Analógico para iBarShift - página 6

 
Vasiliy Pushkaryov:

TimeCurrent() é apenas um caso especial que eu peguei.

Agora leio esta nota para a função Bars() com mais atenção:

"Ao solicitar o número de barras num determinado intervalo de datas , só são tidas em conta as barras cujo tempo de abertura se encontre dentro desse intervalo. Por exemplo, se o dia actual da semana for sábado, ao solicitar o número de bares semanais com start_time=lastTuesday e stop_time=lastFriday, a função retorna 0 porque a hora de abertura do horário semanal cai sempre ao domingo e nenhum bar semanal se enquadra no intervalo especificado".

Uma vez que TimeCurrent() é quase sempre posterior à hora de abertura da barra actual, então a função Bars() retorna 0. Assim, se passarmos o tempo correspondente a 02:05 no horário horário como o parâmetro start_time , e quisermos que a barra que começou às 2 horas seja válida, então temos de obter a hora de abertura da barra (02:00:00) através de CopyTime() . Caso contrário, a função Bars() irá ignorar esta barra.

Ou seja, se a hora for 3:30, entendo que a hora 2:05 no horário se refere à barra com índice 1. Nenhuma das funções na 2ª página devolverá este índice. Com esta correcção, a função de Renat Akhtyamov devolveu o que eu esperava.

Estou a anexar um guião, com 4 opções para funções de pesquisa de índice, que utilizei como teste.

Tentada a função apresentada, verifica-se que se encontra por uma barra, se pedir uma barra com um tempo que não está no gráfico. Isto é, se quisermos saber a primeira barra do dia, e perguntar a hora "28.03.2018 00:00". mas não há barra com esse tempo, vamos obter o índice da última barra do dia anterior.

Ou era para ser assim?

 
Aleksey Vyazmikin:

Tentei a função apresentada e acontece que ela se encontra por uma barra, se for solicitada uma barra com um tempo que não está no gráfico. Isto é, se quisermos saber a primeira barra do dia, e perguntar pela hora "28.03.2018 00:00". mas não há barra com esse tempo, vamos obter o índice da última barra do dia anterior.

Ou era para ser assim?

Como se passa o tempo, por um fio?
 
Renat Akhtyamov:
Como se passa o tempo, por fio?

Tentei ambas com uma corda e como no código anteriormente publicado.

int teset_01=iBarShift(_Symbol,PERIOD_CURRENT,StringToTime("30.03.2018 00:00"),false);
Print ("teset_01=",teset_01);
 
Aleksey Vyazmikin:

Experimentei-o tanto com uma corda como como no código anteriormente publicado.

no seu código.

int iBarShift2(string symbol, ENUM_TIMEFRAMES timeframe, datetime time)

é por isso que não é bem claro se há falso

e se assim for:

int teset_01=iBarShift 2(_Symbol,PERIOD_CURRENT,StringToTime("30.03.2018 00:00"));
Print ("teset_01=",teset_01);
?
 

Até ao momento, já me decidi sobre este código, parece funcionar rapidamente:

//+------------------------------------------------------------------+ 
//| Получим iBarShift для заданного номера бара                      | 
//+------------------------------------------------------------------+    
int iBarShift3(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,const bool Exact=false)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;
   static bool LastExact=false;
   static int PerSec=::PeriodSeconds(LastTimeFrame);
   
   if (LastTimeFrame!=TimeFrame) PerSec=::PeriodSeconds(TimeFrame);
   time-=time%PerSec;

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

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

   return(Res);
  }  

Alguém identificou alguma desvantagem neste código, ou existe uma opção mais rápida?

Ah, bem, a única desvantagem é se fizer um pedido de barra que ainda não está no gráfico, ou seja, com o tempo de hoje, por exemplo, ...... talvez haja também uma solução para isso? Aqui só faria sentido devolver o último bar conhecido. Isto pode ser relevante para trabalhar com algoritmos que funcionam com a hora actual.

 
Renat Akhtyamov:

ele tem o mesmo.

por isso a presença de falso não é muito clara

falso - para padronização, não afecta nada :) Para ser honesto, não sei de todo porque é que esta falsidade em algumas funções é necessária?

 
Aleksey Vyazmikin:

Até ao momento, já me decidi sobre este código, parece funcionar rapidamente:

Alguém identificou alguma desvantagem neste código, ou existe uma opção mais rápida?

Ah, bem, a única desvantagem é se fizer um pedido de barra que ainda não está no gráfico, ou seja, com o tempo de hoje, por exemplo, ...... talvez haja também uma solução para isso? Aqui só faria sentido devolver o último bar conhecido. Isto pode ser relevante para trabalhar com algoritmos que funcionam com a hora actual.

devolver um número de barras que não existe não é bom

é mais fácil de regressar -1

 
Aleksey Vyazmikin:

falso - para a normalização, não afecta nada :) Para ser honesto, não sei de todo porque é que esta falsidade em algumas funções é necessária?

Estou perdido lá e sou um seguidor de códigos simples, sem colónias
 
Renat Akhtyamov:

devolver um número de bar que não existe não é bom

é mais fácil de regressar -1

Não, deve apenas devolver a última barra conhecida, ou seja, com índice 0, mas agora leva muito tempo a descobrir o que lá voltar.

Aqui está o código, que está errado por uma barra, devolve a barra correcta - zero.

Ou quer dizer quando a história pede um bar por tempo que não existe? Depois penso que, na maioria das vezes, é necessário obter a barra mais próxima do nosso tempo das que estão disponíveis, e o código retorna neste caso barra com offset -1 na história, mas funciona correctamente, se não houver mais história - retorna rapidamente barra zero.

 
Aleksey Vyazmikin:

Não, deve apenas devolver a última barra conhecida, ou seja, com índice 0, mas agora leva muito tempo a descobrir o que lá voltar.

O código, que está errado por uma barra, devolve a barra correcta - zero.

Ou quer dizer quando a história pede um bar por tempo que não existe? Então penso que na maioria das vezes devemos obter a barra que está mais próxima do nosso tempo das que estão disponíveis, e o código retorna neste caso barra com offset -1 na história, mas funciona correctamente se não houver mais história - retorna rapidamente barra zero.

Sim (destacado)

-1 é um menos (esclareço) e o erro devolvido pela função é que não existe tal barra

Ou seja, a minha função.

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

Analógico do iBarShift

Renat Akhtyamov, 2017.06.08 01:19

Isto também é possível

int iBarShift(string symbol, ENUM_TIMEFRAMES timeframe, datetime tm)
   {
        datetime tm0[1];      
        CopyTime(symbol,timeframe,0,1,tm0);
        int res=Bars(symbol,timeframe,tm0[0],tm)-1;
        return(res);
   }

também requer melhorias

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, apanharemos -1 da função tal como ela é.

===

Portanto, tudo funciona, use-o a seu gosto!

Razão: