Cosa aggiorna RefreshRates() - pagina 2

 
iClose: zero - errore. La funzione non dà un errore. Dà un valore che è attualmente obsoleto.
 
Ho letto qui che " iClose() ottiene il valore dal server del broker" Se i dati di queste funzioni sono generati da broker onesti, allora tutto va a posto))) Si scopre che possiamo fidarci solo della zecca attuale.
 
Artyom Trishkin:
No, non lo è. Cosa c'è scritto nella guida della funzione riguardo al valore di ritorno?
iClose

Valore restituito

Valore del prezzo di chiusura della barra (specificato dal parametro shift) del grafico corrispondente o 0 in caso di errore. Chiama GetLastError() per ottenere maggiori informazioni sull'errore.

Dice che se non è 0, allora non c'è errore. Ma anche il valore non cambia..., quindi non si aggiorna senza RefreshRates();, il che mi ha sorpreso.
 
Mikhail Nazarenko:

E se cambiate il timeframe in uno diverso da quello attuale, i dati non si aggiorneranno in tempo anche con RefreshRates(). Quindi le funzioni fondamentali di iClose ecc. in MT4 producono stronzate irrilevanti. Sono sicuro che l'80% delle informazioni non tiene conto di queste caratteristiche uniche di MT4. Come vivere?)))

Cambiare l'intervallo di tempo non servirà a nulla. Il valore iClose corrente è uguale al valore Bid indipendentemente dal periodo del grafico.
 
Alexey Viktorov:
Il cambiamento non darà nulla. Il valore corrente di iClose è uguale al valore Bid indipendentemente dal periodo del grafico.

Ho creato un EA e l'ho fatto funzionare su M5 per un giorno. Al cambio dell'ora disegna delle linee orizzontali per ognuno dei valori: iClose(symbol,PERIOD_H1,1),iClose(symbol, PERIOD_ M5,1), iClose(symbol, PERIOD_ M1,1 ),Close[1],Bid

  1. iClose(symbol, PERIOD_ M5,1 ),Close[1] - ha mostrato esattamente come sul grafico
  2. L'offerta era vicina, questa è la prossima spunta
  3. iClose(symbol,PERIOD_H1,1),iClose(symbol, PERIOD_ M1,1) - a volte erano uguali, e a volte, soprattutto nelle ore serali, mostravano una merda completa, anche dopo che RefreshRates() era collegato.

Domanda agli sviluppatori. Perché abbiamo bisogno della funzioneiClose in MQL4, se non dà le informazioni corrette e non c'è modo di aggiornare i suoi dati?

 
Mikhail Nazarenko:

Ho creato un EA e l'ho fatto funzionare su M5 per un giorno. Al cambio dell'ora disegna delle linee orizzontali per ognuno dei valori: iClose(symbol,PERIOD_H1,1),iClose(symbol, PERIOD_ M5,1), iClose(symbol, PERIOD_ M1,1 ),Close[1],Bid

  1. iClose(symbol, PERIOD_ M5,1 ),Close[1] - ha mostrato esattamente come sul grafico
  2. L'offerta era vicina, questa è la prossima spunta
  3. iClose(symbol,PERIOD_H1,1),iClose(symbol, PERIOD_ M1,1) - a volte erano uguali, e a volte, soprattutto nelle ore serali, mostravano una merda completa, anche dopo che RefreshRates() era collegato.

Domanda agli sviluppatori. Perché MQL4 ha bisogno di funzioniiClose, se non danno informazioni affidabili e non c'è modo di aggiornare i loro dati?

Questa è una sciocchezza. La chiamata RefreshRates() è necessaria solo se l'esecuzione è stata ritardata per qualche motivo. Casi come il ciclo lungo o solo l'aggiornamento dei prezzi al momento dell'invio di un ordine per aprire un ordine. Non dovrebbero esserci problemi nella vostra variante. Meglio postare un esempio di codice che ottiene valori di prezzo così sbagliati.

Ora sto eseguendo il seguente codice

double close_H1,
       close_M1;

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

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_M5))
   {
    close_H1 = iClose(_Symbol, PERIOD_M5, 1);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    if(close_H1 != close_M1)
      Print(close_H1, " != ", close_M1);
   }
  Comment(close_H1, "\n",
          close_M1, "\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;
 }/******************************************************************/
In sostanza, la chiusura del minuto dovrebbe coincidere con qualsiasi periodo alto del grafico. Controllerò più tardi per vedere se c'è qualcosa scritto nel registro.
 
Mikhail Nazarenko:

E se cambiate il timeframe in uno diverso da quello attuale, i dati smetteranno di aggiornarsi in tempo, anche con RefreshRates().

C'è qualche codice di test per confermare questa affermazione? Non l'ho notato io stesso. Quando si cambia TF, aspettiamo semplicemente che la storia venga scambiata e poi lavoriamo.


Quindi, iClose e altre funzioni fondamentali in MT4 producono sciocchezze irrilevanti.

Questa è un'affermazione troppo forte. A volte è possibile, ma è a questo che servono i codici di errore. Se non li controllate non saprete mai se potete usare il risultato che ottenete.


Sono sicuro che l'80% degli infoprodotti non tiene conto di queste caratteristiche uniche di MT4. Come vivere?)))

Dirò di più: quasi tutti i programmi non tengono conto di queste caratteristiche. Ecco perché vengono rilasciate le loro nuove versioni. Non appena un prodotto non è più supportato, è reso inutilizzabile.

Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений
Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений
  • www.mql5.com
Коды ошибок и предупреждений - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov:

Questa è una sciocchezza. È necessario chiamare RefreshRates() solo se c'è stato un ritardo nell'esecuzione per qualsiasi motivo. Casi come un lungo ciclo o solo l'aggiornamento dei prezzi al momento dell'invio di un ordine per aprire un ordine. Non dovrebbero esserci problemi nella vostra variante. Meglio postare un esempio di codice che ottiene valori di prezzo così sbagliati.

Ora sto eseguendo tale codice

In sostanza il minuto di chiusura dovrebbe coincidere con qualsiasi periodo alto sul grafico. Più tardi vedrò se c'è qualcosa scritto nel registro.

Il mio codice è simile a questo. C'è un errore in OnTick.

close_H1 = iClose(_Symbol, PERIOD_M5, 1);

Dovrebbe essere

close_H1 = iClose(_Symbol, PERIOD_H1, 1);
close_M5 = Close[1];
 if(close_H1 != close_M5)
	 Print(close_H1, " != ", close_M5);
if(close_M1 != close_M5)
	 Print(close_M1, " != ", close_M5);


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.

L'ho controllato su Alpari real EURCHF M5, ma invece di Print ho disegnato delle barre orizzontali ad ogni livello.

 
Ihor Herasko:

C'è qualche codice di test per supportare questa affermazione? Non ho notato questo con me stesso. Quando si cambiano i TF, aspettiamo solo che la storia si scambi e poi lavoriamo.


Questa è un'affermazione troppo forte. In alcuni casi questo è possibile, ma è a questo che servono i codici di errore. Se non li controllate, non saprete mai se potete usare il risultato che ottenete.


Dirò di più: quasi tutti i programmi non tengono conto di qualcosa. Ecco perché vengono rilasciate le loro nuove versioni. Non appena un prodotto non è più supportato, è incapace di essere utilizzato.

Ecco il codice, inseriscilo e controlla. Non ho un fiammifero su ogni candela. Alpari reale EURCHF M5.

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);
   
     Comment(
               close_H1, " H1\n",
               close_M1, " M1\n",
               close_M5, " M5\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;
 }/******************************************************************/

 
Mikhail Nazarenko:
iClose: zero - errore. La funzione non segnala un errore. Emette un valore che è attualmente obsoleto.

Se sospettate errori nelle funzioni iXXXXXXX, usate le funzioni SymbolInfoXXXXXX

Motivazione: