Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1754

 
La situazione è la seguente: la variabile X memorizza l'indice della barra nella storia, sappiamo che quando appare una nuova barra, c'è uno spostamento, e quindi X punta già a una barra diversa. Come risolvere il problema? L'idea: ad ogni nuova barra aumentiamo il contatore (count++) e lo aggiungiamo a X. Così X punterà sempre alla stessa barra indipendentemente dall'offset. Ma c'è un problema - quando l'EA viene inizializzato la prima barra corrente non dovrebbe essere presa in considerazione. Penso che possa essere facilmente risolto se il conteggio è inizialmente uguale a -1. Cioè, sulla barra corrente dopo il conteggio dell'incremento sarà "0", e sulla prossima nuova barra (quando il primo spostamento di 1 barra è avvenuto dopo l'inizializzazione) sarà "1". Cosa ne pensate? Forse sto pensando nel posto sbagliato?
 
Nerd Trader #:
La situazione è la seguente: la variabile X memorizza l'indice della barra nella storia, sappiamo che quando appare una nuova barra, c'è uno spostamento, e quindi X punta già a una barra diversa. Come risolvere il problema? L'idea: ad ogni nuova barra aumentiamo il contatore (count++) e lo aggiungiamo a X. Così X punterà sempre alla stessa barra indipendentemente dall'offset. Ma c'è un problema - quando l'EA viene inizializzato la prima barra corrente non dovrebbe essere presa in considerazione. Penso che possa essere facilmente risolto se il conteggio è inizialmente uguale a -1. Cioè, sulla barra corrente dopo il conteggio dell'incremento sarà "0", e sulla prossima nuova barra (quando il primo spostamento di 1 barra è avvenuto dopo l'inizializzazione) sarà "1". Cosa ne pensate? Forse sto pensando nel posto sbagliato?

Se è un indicatore, è sufficiente

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

a tutti gli array e i buffer dell'indicatore utilizzato.

Allora la barra zero diventerà rates_total-1

ArraySetAsSeries - Операции с массивами - Справочник MQL4
ArraySetAsSeries - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArraySetAsSeries - Операции с массивами - Справочник MQL4
 
Nerd Trader #:
La situazione è la seguente: la variabile X memorizza l'indice della barra nella storia, sappiamo che quando appare una nuova barra, c'è uno spostamento, e quindi X punta già a una barra diversa. Come risolvere il problema? L'idea: ad ogni nuova barra aumentiamo il contatore (count++) e lo aggiungiamo a X. Così X punterà sempre alla stessa barra indipendentemente dall'offset. Ma c'è un problema - quando l'EA viene inizializzato la prima barra corrente non dovrebbe essere presa in considerazione. Penso che possa essere facilmente risolto se il conteggio è inizialmente uguale a -1. Cioè, sulla barra corrente dopo il conteggio dell'incremento sarà "0", e sulla prossima nuova barra (quando il primo spostamento di 1 barra è avvenuto dopo l'inizializzazione) sarà "1". Cosa ne pensate? Forse sto pensando nel posto sbagliato?
      datetime x=время нужного бара;
      int index=iBarShift(_Symbol,0,x);
 
MakarFX #:
Perché prendersi tutto questo disturbo?
 
Alexey Viktorov #:
Perché prendersi tutto questo disturbo?
È più facile per me)
 
MakarFX #:
È più facile per me)

Ma il processore è più pesante...

 
Alexey Viktorov #:

Ma il processore è più pesante...

Non so quali funzioni portano quale carico. C'è un posto dove leggere di questo?
 
Nerd Trader #:
La situazione è la seguente: la variabile X memorizza l'indice della barra nella storia, e sappiamo che quando appare una nuova barra, questa viene spostata e quindi X punta già a un'altra barra. Come risolvere il problema? L'idea: ad ogni nuova barra aumentiamo il contatore (count++) e lo aggiungiamo a X. Così X punterà sempre alla stessa barra indipendentemente dall'offset. Ma c'è un problema - quando l'EA viene inizializzato la prima barra corrente non dovrebbe essere presa in considerazione. Penso che possa essere facilmente risolto se il conteggio è inizialmente uguale a -1. Cioè, sulla barra corrente dopo il conteggio dell'incremento sarà "0", e sulla prossima nuova barra (quando il primo spostamento di 1 barra è avvenuto dopo l'inizializzazione) sarà "1". Cosa ne pensate? Forse sto pensando nel posto sbagliato?

Non c'è. Non c'è niente in X quando si carica EA/indicatore se è all'interno del terminale, a meno che non sia una variabile intu o extern o globale fuori dal terminale, quindi qualcosa deve essere scritto prima lì. E poi calcoliamo semplicemente i cambiamenti del numero totale di barre (la nuova apparizione delle barre deve essere considerata).

datetime BarTime;

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

Saluti. Puoi darmi un suggerimento? Come in mt5 all'inizializzazione o al tick definire i test?

Finora ho trovato solo OnTester(), che è chiamato appena prima della chiamata di OnDeinit().

 
@Alexey Viktorov @MakarFX interessante, soluzioni abbastanza buone. Grazie.

@Valeriy Yastremskiy L'indice è posto in X ancora in OnInit(). Il mio codice è così:
last_time = iTime(NULL, 0, 0);

  if(last_time > bar.time_open){
    bar.time_open = last_time;
    coint++;//стартовое значение -1
  }
La condizione con FlagNewBar mi sembra ridondante.
Motivazione: