Analogo a iBarShift

 

Mi mancava la funzionalità simile a iBarShift per MT4. Puoi dirmi come si fa?

E per quanto ho capito si dovrebbe usare CopyTime invece di Time[10]?

 
GarF1eld писал(а)  :

Mi mancava la funzionalità simile a iBarShift per MT4. Puoi dirmi come si fa?

E per quanto ho capito si dovrebbe usare CopyTime invece di Time[10]?

L'analogo di ibarshift:

int iBarOnTime( string symbol, ENUM_TIMEFRAMES timeframe, datetime time, bool exact=false )

analogo di Time[]:

Time( int i )

Ci sono molte altre cose là fuori che possono essere utili:

double iHigh(string symbol,int tf,int ind)
double High( int i )
double iLow(string symbol,int tf,int ind)
double Low( int i )
double iClose(string symbol,int tf,int ind)
double Close( int i )
double iOpen(string symbol,int tf,int ind)
double Open( int i )
double HighOnTime( string symbol, ENUM_TIMEFRAMES timeframe, datetime time, bool exact=false )
double LowOnTime( string symbol, ENUM_TIMEFRAMES timeframe, datetime time, bool exact=false )
double CloseOnTime( string symbol, ENUM_TIMEFRAMES timeframe, datetime time, bool exact=false )
double OpenOnTime( string symbol, ENUM_TIMEFRAMES timeframe, datetime time, bool exact=false )
string SPeriod(ENUM_TIMEFRAMES tf)  //символьное представление периода
datetime iTime( const string symbol, int tf, int ind  )

//+------------------------------------------------------------------+
//| Аналог Bars(), не требует предварительной синхронизации истории  |
//| Вход  : symbol - символ в терминале                              |
//|         timeframe - таймфрейм                                    |
//| Выход : нет                                                      |
//| Прим. : нет                                                      |
//+------------------------------------------------------------------+
int BarsSinh( string symbol,ENUM_TIMEFRAMES  timeframe )

//+------------------------------------------------------------------+
//| Произвести синхронизацию таймсерии с историей                    |
//| Вход  : symbol - символ в терминале                              |
//|         tf     - таймфрейм                                       |
//| Выход : нет                                                      |
//| Прим. : нет                                                      |
//+------------------------------------------------------------------+
void SynhronizeSeries( string symbol, ENUM_TIMEFRAMES tf )

//+------------------------------------------------------------------+
//| Проверить наличие истории на дату start_date, если остуствует,   |
//| то произвести попытку загрузки                                   |
//| Вход  : symbol - символ в терминале                              |
//|         period - таймфрейм                                       |
//|         start_date - дата проверки истории                       |
//| Выход : код результата выполнения операции подробнее             |
//|         см. https://www.mql5.com/ru/docs/series/timeseries_access |
//| Прим. : нет                                                      |
//+------------------------------------------------------------------+
int CheckLoadHistory(string symbol,ENUM_TIMEFRAMES period,datetime start_date)
//+------------------------------------------------------------------+
//| возвращает строкое значение периода                              |
//+------------------------------------------------------------------+
string GetPeriodName(ENUM_TIMEFRAMES period)
File:
common.mqh  22 kb
 
gdtt:

ibarshift analogico :

Tempo[] analogico:

ci sono molte altre cose là fuori che possono essere utili:

grazie! cosa utile

Se non c'è niente di più sano dallo standard, userò gli algoritmi della libreria

 
Qualcuno può suggerire una controparte più veloce di iBarShift? Le opzioni esistenti con CopyTime risultano essere terribilmente lente, a giudicare dal profiler. Ho bisogno della sincronizzazione delle barre. Sto contando un indicatore su ogni barra una volta, ma purtroppo devo elaborare i tick fino a quando la barra è sincronizzata. Ho anche inserito un timer; non vedo alcun guadagno di produttività.
 

Se qualcuno è interessato, ho trovato un'alternativa.

int iBarShiftFast(string symbol, ENUM_TIMEFRAMES timeframe, datetime time)
{
  datetime lastBar;
  SeriesInfoInteger(symbol, timeframe, SERIES_LASTBAR_DATE, lastBar);
  return(Bars(symbol, timeframe, time, lastBar) - 1);
}

Secondo le mie misurazioni, l'accelerazione rispetto alla variante CopyTime è da 2 a 7 volte (a seconda dei dati di input). Se avete commenti o bug, scrivete pure.

 
marketeer:

Se qualcuno è interessato, ho trovato un'alternativa.

Secondo le mie misurazioni, l'accelerazione rispetto alla variante CopyTime è da 2 a 7 volte (a seconda dei dati di input). Se avete commenti o bug, scrivete pure.

Grazie. Lo proverò.

 

O forse questo è il modo giusto per farlo ora:

int bar = Bars(0, 0, barTime_last, TimeCurrent());
 
Roffild:

O forse questo è più corretto ora:

int bar = Bars(0, 0, barTime_last, TimeCurrent());

E ancora più veloce e corretto (il primo parametro deve essere NULL, non funziona con zero)

 int bar = Bars(NULL, 0, t, 32000000000);

Perché non c'è bisogno di eseguire inutilmente la funzioneTimeCurrent()

32000000000 non è dal momento attuale, ma quasi dal momento di 3000

 
Nikolai Semko:

E ancora più veloce e corretto (il primo parametro deve essere NULL, non funziona con zero)

Perché non c'è bisogno di eseguire inutilmente la funzioneTimeCurrent()

32000000000 non è dal momento attuale, ma quasi dal momento di 3000


E che dire di -1? Questo è un momento importante...
 
Denis:

Che dire di -1? È un punto importante...
Non so di cosa stai parlando?
Spiegare.
 
Nikolai Semko:
Non sono sicuro di cosa si tratti?
Spiegare.

La funzione Bars restituisce il numero di barre. Quando vogliamo ottenere l'indice di una barra con indice 9 (scusate la tautologia), restituirà 10, perché l'indice della prima barra è 0.