Análogo a iBarShift - página 6

 
Vasiliy Pushkaryov:

TengoTimeCurrent() sólo como un caso especial.

Ahora leo con más atención esta nota a la función Bars():

"Cuando se solicita el número de compases en un rango de fechas determinado , sólo se tienen en cuenta los compases cuya hora de apertura se encuentra dentro de ese rango. Por ejemplo, si el día actual de la semana es el sábado, al solicitar el número de barras semanales con start_time=lastTuesday y stop_time=lastFriday, la función devuelve 0 porque la hora de apertura del marco temporal semanal siempre cae en domingo y ninguna barra semanal cae en el rango especificado".

Dado que TimeCurrent() es casi todo el tiempo posterior a la hora de apertura de la barra actual, la función Bars( ) devuelve 0. Por lo tanto, si pasamos la hora correspondiente a las 02:05 en el timeframe horario como parámetro start_time , y queremos que la barra que comenzó a las 2 sea válida, entonces debemos obtener la hora de apertura de la barra (02:00:00) a través de CopyTime() . De lo contrario, la función Bars() ignorará esta barra.

Por ejemplo, si la hora es 3:30, entiendo que la hora 2:05 en el marco temporal horario se refiere a la barra con índice 1. Ninguna de las funciones de la segunda página devolverá este índice. Con esta corrección, la función de Renat Akhtyamov ha devuelto lo que esperaba.

Adjunto un script, con 4 opciones de funciones de búsqueda de índices, que he utilizado como prueba.

Probado la función presentada, resulta que miente por una barra, si pide una barra con un tiempo que no está en el gráfico. Es decir, si queremos saber el primer compás del día, y pedimos la hora "28.03.2018 00:00" pero no hay ninguna barra con esa hora, obtendremos el índice de la última barra del día anterior.

¿O estaba destinado a ser así?

 
Aleksey Vyazmikin:

He probado la función presentada y resulta que miente por una barra, si se pide una barra con un tiempo que no está en el gráfico. Es decir, si queremos saber el primer compás del día, y pedimos la hora "28.03.2018 00:00". pero no hay ninguna barra con esa hora, obtendremos el índice de la última barra del día anterior.

¿O estaba destinado a ser así?

¿Cómo se pasa el tiempo, por una cuerda?
 
Renat Akhtyamov:
¿Cómo pasas el tiempo, por cuerda?

He probado tanto con una cadena como con el código publicado anteriormente.

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

Lo he probado tanto con una cadena como con el código publicado anteriormente.

en su código.

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

por eso no está muy claro si hay falsos

y si es así:

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

De momento me he decantado por este código, parece que funciona rápidamente:

//+------------------------------------------------------------------+ 
//| Получим 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);
  }  

¿Alguien ha identificado alguna desventaja en este código, o hay una opción más rápida?

Ah, bueno, el único inconveniente es si usted hace una solicitud de una barra que aún no está en el gráfico, es decir, con la hora de hoy e.g..... ¿tal vez también haya una solución para eso? Aquí sólo tendría sentido devolver la última barra conocida. Esto podría ser relevante para trabajar con algoritmos que trabajan en tiempo actual.

 
Renat Akhtyamov:

tiene lo mismo.

por lo que la presencia de falsos no está del todo clara

falso - para la estandarización, no afecta a nada :) Para ser honesto, no sé por qué este falso en algunas funciones es necesario en absoluto?

 
Aleksey Vyazmikin:

De momento me he decantado por este código, parece que funciona rápidamente:

¿Alguien ha identificado alguna desventaja en este código, o hay una opción más rápida?

Ah, bueno, el único inconveniente es si usted hace una solicitud de una barra que aún no está en el gráfico, es decir, con la hora de hoy e.g..... ¿tal vez también haya una solución para eso? Aquí sólo tendría sentido devolver la última barra conocida. Esto podría ser relevante para trabajar con algoritmos que trabajan con la hora actual.

devolver un número de barra que no existe no es bueno

es más fácil devolver -1

 
Aleksey Vyazmikin:

falso - para la estandarización, no afecta a nada :) Para ser honesto, no sé por qué este falso en algunas funciones es necesario en absoluto?

Me he perdido ahí y soy un seguidor de los códigos simples, sin dos puntos
 
Renat Akhtyamov:

devolver un número de barra que no existe no es bueno

es más fácil devolver -1

No, sólo debería devolver la última barra conocida, es decir, con índice 0, pero ahora tarda mucho tiempo en saber qué devolver ahí.

Aquí está el código, que está equivocado por una barra, devuelve la barra correcta - cero.

¿O te refieres a cuando el historial pide una barra por tiempo que no existe? Entonces creo que lo más frecuente es obtener la barra más cercana a nuestra hora de las que están disponibles, y el código devuelve en este caso la barra con el offset -1 en el historial, pero funciona correctamente, si no hay más historial - devuelve rápidamente la barra cero.

 
Aleksey Vyazmikin:

No, sólo debería devolver la última barra conocida, es decir, con índice 0, pero ahora tarda mucho tiempo en saber qué devolver ahí.

El código, que es erróneo por una barra, devuelve la barra correcta: cero.

¿O te refieres a cuando el historial pide una barra por tiempo que no existe? Entonces creo que lo más frecuente es obtener la barra más cercana a nuestra hora de las que están disponibles, y el código devuelve en este caso la barra con desplazamiento -1 en el historial, pero funciona correctamente si no hay más historial - devuelve rápidamente la barra cero.

Sí (resaltado)

-1 es un menos (aclaro) y el error que devuelve la función es que no existe tal barra

Es decir, mi función.

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Análogo de iBarShift

Renat Akhtyamov, 2017.06.08 01:19

Esto también es posible

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);
   }

también requiere mejoras

aunque...

Documentación:

"Nota.

Si los datos de las series temporales con los parámetros especificados al llamar a la función Bars() aún no se han generado en el terminal, o los datos de las series temporales no están sincronizados con el servidor de comercio en el momento de la llamada a la función, entonces la función devolverá un valor cero. "

====

Si res==0, cogeremos -1 de la función tal cual.

===

Así que todo funciona, ¡aprovéchalo en tu favor!