Cosa aggiorna RefreshRates() - pagina 4

 
Mikhail Nazarenko:
Ok, grazie a tutti gli sviluppatori per l'attenzione, creerò stampelle come NewBar))) Argomento chiuso.

Non c'è bisogno di crearli. Vi ho dato una funzione perfettamente funzionante. Usalo.

 

Arriva una nuova ora...


I valori sono gli stessi...

 
Mikhail Nazarenko:

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

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);

//...

Voglio aggiungere all'esempio e controllare


Non capisco perché vi aspettate di vedere lo stesso prezzo di chiusura in barre completamente diverse?

Quando c'è una nuova barra su M5, su M1 c'è anche una nuova barra, ma su H1 solo in un caso su 12 ci sarà una nuova barra e negli altri 11 non ci sarà nessuna barra.

 
PapaYozh:

Non capisco perché. vi aspettate di vedere lo stesso prezzo di chiusura su barre completamente diverse?


Ho notato anche questo, pensavo di aver sbagliato.

 

A quanto pare non spiego molto bene il problema, mi dispiace. Ho scritto e testato le stampelle promesse. L'ho scritto qui perché dovrebbe essere implementato nel codice di MQL4. Se siete interessati, per favore prendetelo. L'argomento è ora chiuso.

//Функция отслеживания появления обновленных котировок по таймфрейму, где max_tf таймфрейм +1 до которого включительно будет требоваться обновление
bool isRefresh(int max_tf = 0,int min_sleep = 1000){
   
   //Массив с таймфреймами
   int tf[9] = {1,5,15,30,60,240,1440,10080,43200};
   
   //Если максимальное 0 то текущее значение
   max_tf = (max_tf <= 0) ? _Period : max_tf;
   
   //Текущее время
   datetime period,tc = TimeCurrent();
   
   for(int i = 0; i < 9; i++){
         
      period = tf[i]*60;
      
      if(iTime(_Symbol,tf[i],1) != (int(tc/period)-1)*period){
         Sleep(min_sleep);
         return false;   
      }
      if(max_tf < tf[i])//Если таймфрейм больше максимального и тоже обновлен то выходим
         break;
   }
   Sleep(min_sleep);
   RefreshRates();
   
   return true;
}
 
Mikhail Nazarenko:

A quanto pare non spiego molto bene il problema, mi dispiace. Ho scritto e testato le stampelle promesse. L'ho scritto qui perché dovrebbe essere implementato nel codice di MQL4. Se siete interessati, per favore prendetelo. L'argomento è ora chiuso.

1. Forse sì.

2. Perché dormire un secondo prima di tornare da una funzione se non ha effetto sul risultato restituito?

 

Affinché le candele di altri periodi/simboli siano generate in tempo, devono essere costantemente "tirate", altrimenti il MT le aggiorna "come deve".
È un'ovvietà, è stato discusso molte volte sul forum)

ps. Se il vostro codice funziona su timer e accede alle quotazioni per altri timeframe solo una volta all'ora (o una volta al giorno), allora dovete creare una funzione separata per l'aggiornamento. Oppure aspetta un paio di secondi dopo la prossima richiesta.

 
PapaYozh:

1. A quanto pare, sì.

2. Perché dormire un secondo prima di tornare da una funzione, se il risultato restituito non è influenzato in alcun modo?

Questo è tutto per esperienza. Se non mi credi, rifallo e non dormire). Il tutto è volontario.

 

E' *** lì nella sua forma più pura.

Perché dormire in una funzione quando si può tornare indietro e fare qualcosa di utile?

 
PapaYozh:

E' *** lì nella sua forma più pura.

Perché dormire in una funzione quando si può tornare indietro e fare qualcosa di utile?

È ***t puro e semplice. Mi dica cosa non ha capito nella mia risposta precedente? Un'altra volta. Non dormire e fai qualcosa di utile)).