Análogo a iBarShift

 
GarF1eld писал(а)  :

He echado de menos una funcionalidad similar a la de iBarShift para MT4. ¿Puede decirme cómo hacerlo?

¿Y por lo que tengo entendido deberías usar CopyTime en lugar de Time[10]?

El análogo de ibarshift:

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

análogo de Time[]:

Time( int i )

Hay muchas más cosas por ahí que te serán útiles:

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

ibarshift análogo :

Tiempo[] analógico:

hay mucho más por ahí que te será útil:

gracias! cosa útil

Si no hay nada más sano de la norma, usaré algoritmos de la biblioteca

 
¿Alguien puede sugerir una contraparte más rápida de iBarShift? Las opciones existentes con CopyTime resultan ser terriblemente lentas, a juzgar por el perfilador. Necesito sincronización de barras. Estoy contando un indicador en cada barra una vez, pero desafortunadamente tengo que procesar los ticks hasta que la barra se sincronice. También he introducido un temporizador; no veo ningún aumento de la productividad.
 

Si alguien está interesado, he encontrado una 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);
}

Según mis mediciones, la aceleración en comparación con la variante CopyTime es de 2 a 7 veces (dependiendo de los datos de entrada). Si tienes algún comentario o fallo, escríbenos.

 
marketeer:

Si alguien está interesado, he encontrado una alternativa.

Según mis mediciones, la aceleración en comparación con la variante CopyTime es de 2 a 7 veces (dependiendo de los datos de entrada). Si tienes algún comentario o fallo, escríbenos.

Gracias. Lo probaré.

 

O tal vez esta es la forma correcta de hacerlo ahora:

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

O tal vez esto sea más correcto ahora:

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

Y aún más rápido y correcto (el primer parámetro debe ser NULL, no funciona con cero)

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

Porque no hay necesidad de ejecutar la funciónTimeCurrent() innecesariamente

32000000000 no es del momento actual, sino casi del momento de 3000

 
Nikolai Semko:

Y aún más rápido y correcto (el primer parámetro debe ser NULL, no funciona con cero)

Porque no hay necesidad de ejecutar la funciónTimeCurrent() innecesariamente

32000000000 no es del momento actual, sino casi del momento de 3000


¿Y qué pasa con el -1? Este es un momento importante...
 
Denis:

¿Y el -1? Es un punto importante...
¿No sé de qué estás hablando?
Explícate.
 
Nikolai Semko:
No estoy seguro de qué se trata.
Explícate.

La función Bars devuelve el número de barras. Cuando queramos 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.
Razón de la queja: