O que atualiza o RefreshRates() - página 4

 
Mikhail Nazarenko:
Ok, graças a todos os desenvolvedores para atenção, eu vou criar muletas como NewBar)))) Tópico fechado.

Não é preciso criá-las. Eu lhe dei uma função totalmente funcional. Use-o.

 

Aí vem uma nova hora...


Os valores são um e o mesmo...

 
Mikhail Nazarenko:

Não, melhor _Periodo. Porque esperaremos à força pela cotação zero do H1, enquanto o período atual é atualizado corretamente. É necessário obter os dados nos primeiros segundos da hora, não quando a hora é atualizada.

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

//...

Quero acrescentar ao exemplo e verificar


Eu não entendo porque você espera ver o mesmo preço de fechamento em barras completamente diferentes?

Quando há um novo bar na M5, na M1 também há um novo bar, mas na H1 somente em um dos 12 casos haverá um novo bar e nos outros 11 não haverá bar.

 
PapaYozh:

Eu não entendo por que. você espera ver o mesmo preço de fechamento em barras completamente diferentes?


Também notei isso, pensei que estava errado.

 

Aparentemente eu não explico o problema muito bem, desculpe. Eu escrevi e testei as muletas prometidas. Escrevi-o aqui porque deveria ser implementado no código da MQL4. Se você estiver interessado, por favor, aceite. O tópico agora está encerrado.

//Функция отслеживания появления обновленных котировок по таймфрейму, где 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:

Aparentemente eu não explico o problema muito bem, desculpe. Eu escrevi e testei as muletas prometidas. Escrevi-o aqui porque deveria ser implementado no código da MQL4. Se você estiver interessado, por favor, aceite. O tópico agora está encerrado.

1. Talvez, sim.

2. Por que dormir um segundo antes de retornar de uma função se isso não tem efeito no resultado retornado?

 

Para que os castiçais de outros períodos/simbolos sejam gerados a tempo, eles precisam ser "puxados" constantemente, caso contrário, a MT os atualiza "como deve ser".
É um truísmo, já foi discutido muitas vezes no fórum)

ps. Se seu código funciona com temporizador e acessa citações para outros períodos de tempo apenas uma vez por hora (ou uma vez por dia), então você precisa criar uma função separada para atualização. Ou esperar alguns segundos após o próximo pedido.

 
PapaYozh:

1. Aparentemente, sim.

2. Por que dormir um segundo antes de retornar de uma função, se o resultado retornado não é afetado?

Tudo isso é por experiência. Se você não acredita em mim, refaça e não durma). Tudo isso é voluntário.

 

Está ***aqui em sua forma mais pura.

Por que dormir em uma função quando você pode voltar dela e fazer algo útil?

 
PapaYozh:

Está ***aqui em sua forma mais pura.

Por que dormir em uma função quando você pode voltar dela e fazer algo útil?

É ***t puro e simples. Diga-me o que você não entendeu na minha resposta anterior... Mais uma vez. Não durma e faça algo útil)).

Razão: