Analógico para iBarShift - página 2

 
Aqui estão duas variantes do análogo iBarShift(): poste #5 e poste #7
 
Denis:

A função Bars retorna o número de barras. Quando precisamos de obter o índice de uma barra com índice 9 (desculpem a tautologia), ele irá retornar 10, porque o índice da primeira barra é 0.
Certo, obrigado. Em suma, é um bom aviso de adição. É verdade, não me incomoda, apenas sei que é o número de barras. E se o programa precisar de um índice, só então subtraio um.
 
Vasiliy Pushkaryov:
Aqui estão duas variantes do análogo iBarShift(): poste #5 e poste #7
Variante simples:
Bars(NULL, 0, t, 32000000000)-1;

a solução mais curta e rápida para o analógico iBarShift para o símbolo actual e o período de tempo e não requer funções adicionais. No entanto, também para os não correntes, basta preencher os dois primeiros parâmetros em vez de os nulos.
 
Nikolai Semko:
Apenas uma variante:

é a solução mais curta e rápida para o iBarShift de contrapartida para o símbolo actual e o período de tempo actual e não requer funções adicionais.

Só que não vai funcionar correctamente em todos os casos. GetBarShift() da fxsaber é mais versátil.

Tente colocar o TimeCurrent() em vez de t na sua função, verá o resultado.

 
Vasiliy Pushkaryov:

Só que não vai funcionar correctamente em todos os casos. GetBarShift() by fxsaber é mais universal.

Tente colocar TimeCurrent() em vez de t na sua função, verá o resultado.

O resultado será o mesmo.
 
Nikolai Semko:
O resultado será o mesmo.
Ainda nem sequer verificou
 
Vasiliy Pushkaryov:
Ainda nem sequer verificou.
Já verifiquei antes muitas vezes, por isso só sei. Mas ainda nem sequer o tentou.
 
Nikolai Semko:
Já o testei muitas vezes antes, por isso apenas sei. Mas ainda nem sequer o tentou.

Aqui está o guião.

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

Apenas fica pendurado. A sua remoção forçada do gráfico obtém o resultado.


Por isso tentei, foi por isso que também vos aconselhei. Mas como a usou e lhe convém, não vou mudar de ideias.

 

Isso também é bom

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 ее нет, но есть все возможности для ее реализации в виде библиотеки.