Analógico para iBarShift

 

Falhei a funcionalidade semelhante ao iBarShift para MT4. Pode dizer-me como o fazer?

E, tanto quanto sei, deveria usar CopyTime em vez de Time[10]?

 
GarF1eld писал(а)  :

Falhei a funcionalidade semelhante ao iBarShift para MT4. Pode dizer-me como o fazer?

E, tanto quanto sei, deveria usar CopyTime em vez de Time[10]?

O análogo de ibarshift:

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

análogo do Tempo[]:

Time( int i )

Há muito mais por aí que virá a calhar:

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

ibarshift analógico:

Tempo[] analógico:

há muito mais lá fora que virá a calhar:

obrigado! coisa útil

Se não houver nada mais sã do padrão, usarei algoritmos da biblioteca

 
Alguém pode sugerir uma contrapartida mais rápida para o iBarShift? As opções existentes com CopyTime acabam por ser terrivelmente lentas, a julgar pelo profiler. Preciso de sincronização de barras. Estou a contar uma vez um indicador em cada barra, mas infelizmente tenho de processar carraças até que a barra esteja sincronizada. Também introduzi um temporizador; não vejo qualquer ganho de produtividade.
 

Se alguém estiver interessado, encontrei uma 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);
}

De acordo com as minhas medições, a aceleração em relação à variante CopyTime é de 2 a 7 vezes (dependendo dos dados introduzidos). Se tiver quaisquer comentários ou bugs, por favor escreva.

 
marketeer:

Se alguém estiver interessado, encontrei uma alternativa.

De acordo com as minhas medições, a aceleração em relação à variante CopyTime é de 2 a 7 vezes (dependendo dos dados introduzidos). Se tiver quaisquer comentários ou bugs, escreva por favor.

Obrigado. Vou experimentá-lo.

 

Ou talvez esta seja a forma correcta de o fazer agora:

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

Ou talvez isto seja mais correcto agora:

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

E ainda mais rápido e mais correcto (o primeiro parâmetro deve ser NULL, não funciona com zero)

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

Porque não há necessidade de executar a funçãoTimeCurrent() desnecessariamente

32000000000 não é do momento actual, mas quase desde o momento de 3000

 
Nikolai Semko:

E ainda mais rápido e mais correcto (o primeiro parâmetro deve ser NULL, não funciona com zero)

Porque não há necessidade de executar a funçãoTimeCurrent() desnecessariamente

32000000000 não é do momento actual, mas quase desde o momento de 3000


E que tal -1? Este é um momento importante...
 
Denis:

Que tal -1? É um ponto importante...
Não sei do que está a falar?
Explicar.
 
Nikolai Semko:
Não tenho a certeza do que se trata?
Explicar.

A função Bars retorna o número de barras. Quando quisermos obter o índice de uma barra com índice 9 (desculpem a tautologia), ele irá retornar 10, porque o índice da primeira barra é 0.
Razão: