Analogue à iBarShift

 

La fonctionnalité similaire à iBarShift pour MT4 me manquait. Pouvez-vous me dire comment faire ?

Et d'après ce que j'ai compris, vous devriez utiliser CopyTime au lieu de Time[10] ?

 
GarF1eld писал(а)  :

La fonctionnalité similaire à iBarShift pour MT4 me manquait. Pouvez-vous me dire comment faire ?

Et d'après ce que j'ai compris, vous devriez utiliser CopyTime au lieu de Time[10] ?

L'analogue de ibarshift :

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

analogue de Time[] :

Time( int i )

Il y a beaucoup d'autres choses qui peuvent être utiles :

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)
Dossiers :
common.mqh  22 kb
 
gdtt:

ibarshift analogique :

Temps[] analogique :

il y a beaucoup d'autres choses qui peuvent être utiles :

merci ! chose utile

S'il n'y a rien de plus raisonnable dans la norme, j'utiliserai les algorithmes de la bibliothèque.

 
Quelqu'un peut-il suggérer un équivalent plus rapide de iBarShift ? Les options existantes avec CopyTime s'avèrent terriblement lentes, à en juger par le profileur. J'ai besoin d'une synchronisation des barres. Je compte un indicateur sur chaque barre une fois, mais malheureusement je dois traiter les ticks jusqu'à ce que la barre soit synchronisée. J'ai également inséré un minuteur ; je ne vois pas de gain de productivité.
 

Si quelqu'un est intéressé, j'ai trouvé une alternative.

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

D'après mes mesures, l'accélération par rapport à la variante CopyTime est de 2 à 7 fois (selon les données d'entrée). Si vous avez des commentaires ou des bugs, veuillez nous écrire.

 
marketeer:

Si quelqu'un est intéressé, j'ai trouvé une alternative.

D'après mes mesures, l'accélération par rapport à la variante CopyTime est de 2 à 7 fois (selon les données d'entrée). Si vous avez des commentaires ou des bugs, veuillez nous écrire.

Merci. Je vais l'essayer.

 

Ou peut-être que c'est la bonne façon de faire maintenant :

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

Ou peut-être que c'est plus correct maintenant :

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

Et encore plus rapide et plus correct (le premier paramètre doit être NULL, cela ne fonctionne pas avec zéro)

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

Parce qu'il n'est pas nécessaire d'exécuter inutilement la fonctionTimeCurrent()

32000000000 n'est pas du moment présent, mais presque du moment de 3000

 
Nikolai Semko:

Et encore plus rapide et plus correct (le premier paramètre doit être NULL, cela ne fonctionne pas avec zéro)

Parce qu'il n'est pas nécessaire d'exécuter inutilement la fonctionTimeCurrent()

32000000000 n'est pas du moment présent, mais presque du moment de 3000


Et que dire de -1 ? C'est un moment important...
 
Denis:

Et pour -1 ? C'est un point important...
Je ne sais pas de quoi tu parles ?
Expliquer.
 
Nikolai Semko:
Je ne suis pas sûr de savoir de quoi il s'agit ?
Expliquer.

La fonction Bars renvoie le nombre de barres. Lorsque nous voulons obtenir l'indice d'une barre d'indice 9 (désolé pour la tautologie), il retournera 10, car l'indice de la première barre est 0.
Raison: