Análogo a iBarShift - página 2

 
Aquí hay dos variantes del análogo de iBarShift(): post #5 y post #7
 
Denis:

La función Bars devuelve el número de barras. Cuando necesitemos obtener el índice de una barra con índice 9 (perdón por la tautología), devolverá 10, porque el índice de la primera barra es 0.
Sí, gracias. En general, es una buena adición-aviso. Es cierto, no me molesto mucho, sólo sé que es el número de barras. Y si el programa necesita un índice, sólo entonces restaré uno.
 
Vasiliy Pushkaryov:
Aquí hay dos variantes del análogo de iBarShift(): post #5 y post #7
Variante simple:
Bars(NULL, 0, t, 32000000000)-1;

la solución más corta y rápida para el análogo de iBarShift para el símbolo actual y el marco temporal y no requiere funciones adicionales. Sin embargo, para los no actuales también, sólo hay que rellenar los dos primeros parámetros en lugar de los nulos.
 
Nikolai Semko:
Sólo una variante:

es la solución más corta y rápida para la contraparte iBarShift para el símbolo actual y el marco de tiempo actual y no requiere funciones adicionales.

Sólo que no funcionará correctamente en todos los casos. GetBarShift() de fxsaber es más versátil.

Prueba a poner TimeCurrent() en lugar de t en tu función, verás el resultado.

 
Vasiliy Pushkaryov:

Sólo que no funcionará correctamente en todos los casos. GetBarShift() de fxsaber es más universal.

Prueba a poner TimeCurrent() en lugar de t en tu función, verás el resultado.

El resultado será el mismo.
 
Nikolai Semko:
El resultado será el mismo.
Ni siquiera has comprobado
 
Vasiliy Pushkaryov:
Ni siquiera lo has comprobado.
Ya lo he comprobado muchas veces, así que lo sé. Pero ni siquiera lo has probado.
 
Nikolai Semko:
Ya lo he probado muchas veces, así que lo sé. Pero ni siquiera lo has probado.

Este es el guión.

void OnStart()
{
  int idShort = Bars(NULL, 0, TimeCurrent(), 32000000000)-1;
  int idUni = GetBarShift(_Symbol, 0, TimeCurrent());
  Print("idShort = ", idShort, " idUni=", idUni);
}


//+------------------------------------------------------------------------------------------------------------------+
//| 
//+------------------------------------------------------------------------------------------------------------------+
int GetBarShift(const string symbol_name, const ENUM_TIMEFRAMES timeframe, const datetime time) 
{
  int res=-1;
  datetime last_bar;
  
   // --- время открытия последнего бара по символу, периоду
  if(SeriesInfoInteger(symbol_name, timeframe, SERIES_LASTBAR_DATE, last_bar)) 
  {
    if(time > last_bar) res = 0;
    else 
    {
      const int shift = Bars(symbol_name, timeframe, time, last_bar);
      if(shift > 0) res = shift-1;
    }
  }
  return res;
}

Sólo se cuelga. Si se elimina a la fuerza del gráfico, se obtiene el resultado.


Así que lo probé, por eso te lo aconsejé también. Pero como lo has usado y te conviene, no voy a cambiar de opinión.

 

Eso también está bien.

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);
   }
 
iBarShift
iBarShift
  • votos: 42
  • 2013.10.25
  • Alain Verleyen
  • www.mql5.com
Многие ищут функцию iBarShift, которая была в языке MQL4. В языке MQL5 ее нет, но есть все возможности для ее реализации в виде библиотеки.