Cosa aggiorna RefreshRates() - pagina 3

 
Artyom Trishkin:

Se sospettate errori nelle funzioni iXXXXX, usate le funzioni SymbolInfoXXXXXX

Può un esempio di sostituzione di iXXXXX con SymbolInfoXXXXXX.

 
Mikhail Nazarenko:

Il mio codice è simile. Errore in OnTick

dovrebbe essere

Se abbiamo l'attuale timeframe M5 dovremmo confrontare M5 con H1 e M1

L'attuale timeframe M5 viene visualizzato correttamente. Il problema era con H1 e M1.

Ho controllato su Alpari real EURCHF M5 solo che invece di Print ho disegnato delle barre orizzontali ad ogni livello.

Sì, all'inizio ho messo H1 in questo modo, ma poi ho deciso che sarebbe stato un confronto troppo raro. Così l'ho cambiato in M5.

Mikhail Nazarenko:

Posso darvi un esempio di sostituzione di iXXXXXXX con SymbolInfoXXXXXX.

Artyom ha fatto un piccolo errore...

Invece di iClose potete usare

int  CopyClose( 
   string           symbol_name,       // имя символа 
   ENUM_TIMEFRAMES  timeframe,         // период 
   int              start_pos,         // откуда начнем  
   int              count,             // сколько копируем 
   double           close_array[]      // массив для копирования цен закрытия 
   );

qualcosa del genere

double close_M5[];
    CopyClose(_Symbol, PERIOD_M5, 1, 1, close_M5);

In questo modo si possono ottenere valori di diverse barre con una sola mossa della bacchetta magica.

La funzione restituisce vero o falso, ma non l'ho controllato in questo esempio. Potete indovinarlo voi stessi...

 
Alexey Viktorov:
Sì, è così che ho messo inizialmente H1, ma poi ho deciso che sarebbe stato un confronto troppo raro. Così l'ho cambiato in M5.

Ho finito il tuo codice lì e l'ho postato sopra. Ho messo la tua versione nella mia e il risultato è lo stesso. C'è un mismatch su quasi tutte le candele M5. Quali sono i vostri risultati?

 
Mikhail Nazarenko:

Ho finito il tuo codice lì e l'ho postato sopra. Ho messo la tua versione nella mia e il risultato è lo stesso. C'è un mismatch su quasi tutte le candele M5. Quali sono i vostri risultati?

Qui dobbiamo cambiare

if(NewBar(PERIOD_M5))

a

if(NewBar(PERIOD_H1))
 
Alexey Viktorov:

Qui dobbiamo cambiare

a

No, meglio _Periodo. Perché aspetteremo forzatamente la quotazione zero da H1, mentre il periodo corrente è correttamente aggiornato. I dati devono essere ricevuti ai primi secondi dell'ora, non quando l'ora viene aggiornata.

Voglio aggiungere all'esempio e controllare
double close_H1,close_M5,
       close_M1;

/*******************Expert initialization function*******************/
int OnInit()
 {
  return(INIT_SUCCEEDED);
 }/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_M5))
   {
    close_H1 = iClose(_Symbol, PERIOD_H1, 1);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    close_M5 = Close[1];
    
    
    if(close_H1 != close_M5)
      Print(close_H1, " H1 != M5 ", close_M5);
    if(close_M1 != close_M5)
      Print(close_M1, " M1 != M5 ", close_M5);
    
    double ARRAY_M1[];
    CopyClose(_Symbol, PERIOD_M1, 1, 1, ARRAY_M1);
    double ARRAY_H1[];
    CopyClose(_Symbol, PERIOD_H1, 1, 1, ARRAY_H1);
    
    if(ARRAY_H1[0] != close_M5)
      Print(ARRAY_H1[0], " CopyClose H1 != M5 ", close_M5);
    if(ARRAY_M1[0] != close_M5)
      Print(ARRAY_M1[0], " CopyClose M1 != M5 ", close_M5);
   
     Comment(
               close_H1, " H1\n",
               close_M1, " M1\n",
               close_M5, " M5\n",
               ARRAY_H1[0], " CopyCloseH1\n",
               ARRAY_M1[0], " CopyCloseM1\n"
            );
         
  }       
 }/******************************************************************/

/**********************Expert OnDeinit function**********************/
void OnDeinit(const int reason)
 {
  Comment("");
 }/******************************************************************/

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/ 

 
Alexey Viktorov:

Qui dobbiamo cambiare

a

Il risultato è lo stesso che con iClose(); iClose e CopyClose sembrano prendere i dati dallo stesso posto.

Документация по MQL5: Доступ к таймсериям и индикаторам / iClose
Документация по MQL5: Доступ к таймсериям и индикаторам / iClose
  • www.mql5.com
iClose - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Mikhail Nazarenko:

No, meglio _Periodo. Perché aspetteremo forzatamente la quotazione zero da H1, mentre il periodo corrente è correttamente aggiornato. I dati devono essere ricevuti ai primi secondi dell'ora, non quando l'ora viene aggiornata.

Voglio aggiungere all'esempio e controllare

Sembra che tu non capisca affatto come funziona la funzione della comparsa di una nuova barra.

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/ 

E di conseguenza.

Mikhail Nazarenko:

Il risultato è lo stesso di quando iClose(); iClose e CopyClose sembrano prendere i dati dallo stesso posto.

Quando si ricevono i valori di chiusura delle barre, o altri da OHLC quando si riceve un nuovo valore TIKA, non c'è sempre nessun problema.
 
Alexey Viktorov:

Sembra che tu non capisca affatto come funziona la nuova funzione della barra.

E di conseguenza.

Quando si ottengono i valori di chiusura delle barre e altri da OHLC quando arriva un nuovo TIKA i valori sono sempre senza problemi.

Rispondi alla domanda. Perché su una nuova candela la funzione iClose(1) restituisce informazioni superate e non aggiornate o un errore? Questo è un bug.

 
Mikhail Nazarenko:

Rispondere a una domanda. Perché su una nuova candela la funzione iClose(1) restituisce informazioni superate e non aggiornate o un errore? Questo è un bug.

Se è un bug, allora tutti, o quasi, dovrebbero averlo. Se sei solo tu, allora è un problema nel codice.

Ho il mio EA su M15 con determinazione di una nuova barra H1

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_H1))
   {
    close_H1 = iClose(_Symbol, PERIOD_H1, 1);
    CopyClose(_Symbol, PERIOD_M5, 1, 1, close_M5);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    if(close_H1 != close_M1)
      Print(close_H1, " != ", close_M1);
   }
  Comment(close_H1, "\n",
          close_M5[0], "\n",
          close_M1, "\n"
         );
 }/******************************************************************/

E questo è ciò che dice il commento.

Non c'è alcuna discrepanza.

 
OK, grazie a tutti gli sviluppatori per la loro attenzione, vado a creare stampelle come NewBar))) Argomento chiuso.
Motivazione: