Analogo a iBarShift - pagina 2

 
Ecco due varianti dell'analogo di iBarShift(): post #5 e post #7
 
Denis:

La funzione Bars restituisce il numero di barre. Quando abbiamo bisogno di ottenere l'indice di una barra con indice 9 (scusate la tautologia), restituirà 10, perché l'indice della prima barra è 0.
Bene, grazie. Tutto sommato, è una buona aggiunta-notizia. È vero, non mi preoccupo davvero, so solo che è il numero di barre. E se il programma ha bisogno di un indice, solo allora ne sottraggo uno.
 
Vasiliy Pushkaryov:
Ecco due varianti dell'analogo di iBarShift(): post #5 e post #7
Variante semplice:
Bars(NULL, 0, t, 32000000000)-1;

la soluzione più breve e veloce per l'analogico iBarShift per il simbolo corrente e il timeframe e non richiede funzioni aggiuntive. Tuttavia, anche per quelli non correnti, basta compilare i primi due parametri invece di quelli nulli.
 
Nikolai Semko:
Solo una variante:

è la soluzione più breve e veloce della controparte iBarShift per il simbolo corrente e il timeframe corrente e non richiede funzioni aggiuntive.

Solo che non funzionerà correttamente in tutti i casi. GetBarShift() di fxsaber è più versatile.

Provate a mettere TimeCurrent() invece di t nella vostra funzione, vedrete il risultato.

 
Vasiliy Pushkaryov:

Solo che non funzionerà correttamente in tutti i casi. GetBarShift() di fxsaber è più universale.

Provate a mettere TimeCurrent() invece di t nella vostra funzione, vedrete il risultato.

Il risultato sarà lo stesso.
 
Nikolai Semko:
Il risultato sarà lo stesso.
Non hai nemmeno controllato
 
Vasiliy Pushkaryov:
Non hai nemmeno controllato.
Ho già controllato molte volte, quindi lo so e basta. Ma non l'hai nemmeno provato tu stesso.
 
Nikolai Semko:
L'ho già testato molte volte, quindi lo so e basta. Ma non l'hai nemmeno provato tu stesso.

Ecco il copione.

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

Si blocca e basta. Rimuovendolo forzatamente dal grafico si ottiene il risultato.


Così l'ho provato, ed è per questo che l'ho consigliato anche a voi. Ma visto che l'hai usato e ti sta bene, non ti farò cambiare idea.

 

Anche questo va bene

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