Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1754

 
A situação é a seguinte: a variável X armazena o índice da barra no histórico, sabemos que quando uma nova barra aparece, há um deslocamento, e portanto X já aponta para uma barra diferente. Como consertá-lo? A idéia: a cada nova barra, aumentamos o contador (contagem++) e o adicionamos ao X. Assim, X sempre apontará para a mesma barra, independentemente da compensação. Mas há um problema - quando a EA é inicializada, a primeira barra atual não deve ser levada em conta. Acho que ela pode ser facilmente resolvida se a contagem for inicialmente apenas igual a -1. Ou seja, na barra atual após a contagem de incremento será "0", e na próxima barra nova (quando o primeiro turno por 1 barra tiver acontecido após a inicialização) será "1". O que você acha? Talvez eu esteja pensando no lugar errado?
 
Nerd Trader #:
A situação é a seguinte: a variável X armazena o índice da barra no histórico, sabemos que quando uma nova barra aparece, há um deslocamento, e portanto X já aponta para uma barra diferente. Como consertá-lo? A idéia: a cada nova barra, aumentamos o contador (contagem++) e o adicionamos ao X. Assim, X sempre apontará para a mesma barra, independentemente da compensação. Mas há um problema - quando a EA é inicializada, a primeira barra atual não deve ser levada em conta. Acho que ela pode ser facilmente resolvida se a contagem for inicialmente apenas igual a -1. Ou seja, na barra atual após a contagem de incremento será "0", e na próxima barra nova (quando o primeiro turno por 1 barra tiver acontecido após a inicialização) será "1". O que você acha? Talvez eu esteja pensando no lugar errado?

Se for um indicador, é suficiente

bool  ArraySetAsSeries(
   const void&  array[],    // массив по ссылке
   bool         flag        // true означает обратный порядок индексации
   );

a todas as matrizes e tampões do indicador utilizado.

Então a barra zero se tornará taxas_total-1

ArraySetAsSeries - Операции с массивами - Справочник MQL4
ArraySetAsSeries - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArraySetAsSeries - Операции с массивами - Справочник MQL4
 
Nerd Trader #:
A situação é a seguinte: a variável X armazena o índice da barra no histórico, sabemos que quando uma nova barra aparece, há um deslocamento, e portanto X já aponta para uma barra diferente. Como consertá-lo? A idéia: a cada nova barra, aumentamos o contador (contagem++) e o adicionamos ao X. Assim, X sempre apontará para a mesma barra, independentemente da compensação. Mas há um problema - quando a EA é inicializada, a primeira barra atual não deve ser levada em conta. Acho que ela pode ser facilmente resolvida se a contagem for inicialmente apenas igual a -1. Ou seja, na barra atual após a contagem de incremento será "0", e na próxima barra nova (quando o primeiro turno por 1 barra tiver acontecido após a inicialização) será "1". O que você acha? Talvez eu esteja pensando no lugar errado?
      datetime x=время нужного бара;
      int index=iBarShift(_Symbol,0,x);
 
MakarFX #:
Por que se dar a tanto trabalho?
 
Alexey Viktorov #:
Por que se dar a tanto trabalho?
É mais fácil para mim)
 
MakarFX #:
É mais fácil para mim)

Mas o processador é mais pesado...

 
Alexey Viktorov #:

Mas o processador é mais pesado...

Eu não sei quais funções carregam que carga. Há algum lugar para ler sobre isso?
 
Nerd Trader #:
A situação é a seguinte: a variável X armazena o índice da barra no histórico, e sabemos que quando uma nova barra aparece, ela é deslocada e, portanto, X já aponta para outra barra. Como consertá-lo? A idéia: a cada nova barra, aumentamos o contador (contagem++) e o adicionamos ao X. Assim, X sempre apontará para a mesma barra, independentemente da compensação. Mas há um problema - quando a EA é inicializada, a primeira barra atual não deve ser levada em conta. Acho que ela pode ser facilmente resolvida se a contagem for inicialmente apenas igual a -1. Ou seja, na barra atual após a contagem de incremento será "0", e na próxima barra nova (quando o primeiro turno por 1 barra tiver acontecido após a inicialização) será "1". O que você acha? Talvez eu esteja pensando no lugar errado?

Aí não. Não há nada em X ao carregar EA/indicador se estiver dentro do terminal, a menos que seja uma variável intu ou externa ou global fora do terminal, então algo tem que ser escrito lá primeiro. E então simplesmente lemos as mudanças do número total de barras (conta para o aparecimento de uma nova barra).

data/hora BarTime;

FlagNewBar=false;
if(BarTime!=iTime(NULL,0,0))
{
 BarTime=iTime(NULL,0,0);
 FlagNewBar=true;
}
if(FlagNewBar==true)
{
// И когда тру, делаем что нужно делать когда появился новый бар, 
//на следующем тике флаг нового бара будет ложь, так как БарТайм время все время существования нулевого бара будет равным
}
 

Saudações. Você pode me dar uma dica? Como em mt5 na inicialização ou no tick para definir os testes?

Até agora, encontrei apenas OnTester(), que é chamado pouco antes da chamada de OnDeinit().

 
@Alexey Viktorov @MakarFX soluções interessantes e muito boas. Obrigado.

@Valeriy Yastremskiy O índice é colocado em X ainda no OnInit(). Meu código é parecido com este:
last_time = iTime(NULL, 0, 0);

  if(last_time > bar.time_open){
    bar.time_open = last_time;
    coint++;//стартовое значение -1
  }
A condição com FlagNewBar me parece redundante.