Vitaly Gorbunov: Acho que consegui! O indicador é lançado imediatamente junto com o terminal? Se assim for, antes de verificar a comunicação com o servidor IsConnected() você tem um timer muito rápido que não tem tempo para sincronizar!
Boa tentativa. Eu estava começando a pensar que iria funcionar. Mas... Não:
2018.09.2115:16:40.519 Custom indicator test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: removed
2018.09.2115:32:29.397 Custom indicator test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: loaded successfully
2018.09.2115:32:29.415 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: initialized
2018.09.2115:32:29.508 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.532 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.557 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.587 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.620 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.651 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.683 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.716 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.743 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.776 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.807 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.841 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.872 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.901 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.935 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.972 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.996 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:30.059 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: test_isNewDayInTimer_iBarShirt().mq4: Актуальное время открытия бара М15 = 2018.09.2113:15. Ошибка #0
Eu substituí a função OnTimer( ) no código anterior por esta função:
//+------------------------------------------------------------------+//| Timer function |//+------------------------------------------------------------------+voidOnTimer()
{
if( !IsConnected() )
{
Print( __FUNCTION__,": Связь отсутствует!" );
return;
}
//--- Проверяем, записано ли время открытия текущего бара М15if(!CheckCurrentM15OpenTime()) // Если время не записаноreturn; // Выходим
}
Acho que consegui! O indicador é iniciado imediatamente junto com o terminal? Se sim, antes de verificar a conexão com o servidor IsConnected() você tem um timer muito rápido que não tem tempo para sincronizar!
Ou faça assim.
Mas teremos que levar em conta a diferença entre a hora do servidor e a hora local. Escreva de volta com os resultados!
Eu não vou fazer muletas. Há um erro óbvio no idioma! Estamos esperando os desenvolvedores...
Muito interessante, é suposto funcionar. Mas então novamente o timer é muito rápido, talvez o terminal não tenha tempo para começar a aceitar citações. Tenho que pensar sobre isso. Que tal fazer um temporizador normal por 5 segundos para testar a idéia?
Muito interessante, é suposto funcionar. Mas então novamente o timer é muito rápido, talvez o terminal não tenha tempo para começar a aceitar citações. Tenho que pensar sobre isso. E se fizermos um timer normal por 5 segundos para testar a idéia?
E eu não preciso de um "ajuste" para verificar a idéia. Na vida real, eu preciso do temporizador mais rápido possível.
//+------------------------------------------------------------------+//| ProjectName |//| Copyright 2012, CompanyName |//| http://www.companyname.net |//+------------------------------------------------------------------+#property version"1.00"#property strict#property indicator_chart_windowdatetime ChkTime;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+//--- Время открытия текущего часа, дня и неделиdatetime _m15OpenTime=0;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//Сохраняем старое время
ChkTime=TimeCurrent();
//--- Запускаем таймерif(!EventSetMillisecondTimer(20))
{
Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": таймер с частотой 20 ms не установлен!");
return( INIT_FAILED );
}
//--- Сбрасываем время открытия текущего бара м15
_m15OpenTime=0;
//---return( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
return( rates_total );
}
//+------------------------------------------------------------------+//| Timer function |//+------------------------------------------------------------------+voidOnTimer()
{
if(!IsConnected())
{
Print(__FUNCTION__,": Связь отсутствует!");
return;
}
//Если есть соединение проверяем что прошла синхронизация времни if(IsConnected() && ChkTime==TimeCurrent())
{
return;
}
//--- Проверяем, записано ли время открытия текущего бара М15if(!CheckCurrentM15OpenTime()) // Если время не записаноreturn;// Выходим
}
//+------------------------------------------------------------------+//| Проверяем, записано ли время открытия текущего бара М15 |//+------------------------------------------------------------------+bool CheckCurrentM15OpenTime()
{
//--- Проверяем, записано ли времяif(_m15OpenTime==0) // Если время не записано
{
//---ResetLastError();
if(iBarShift(Symbol(),PERIOD_M15,TimeCurrent(),true)==-1)
{
Print(__FILE__+": Данные истории по последнему часу отсутствуют! Ошибка #",GetLastError());
return( false );
}
//---if(GetLastError()==ERR_NO_ERROR)
{
ResetLastError();
//--- Запоминаем время открытия бара
_m15OpenTime=iTime(NULL,PERIOD_M15,0);
//---Print(__FILE__,": Актуальное время открытия бара М15 = "+TimeToString(_m15OpenTime)+". Ошибка #",GetLastError());
//--- Возвращаем истинуreturn( true );
}
elsereturn( false );
}
//--- Время открытия недели ранее записано. Возвращаем истинуreturn( true );
}
//+------------------------------------------------------------------+
2018.09.2115:02:42.910 Custom indicator test XAUUSD,H1: removed
2018.09.2115:15:27.985 test XAUUSD,H1: initialized
2018.09.2115:15:29.520 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.552 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.589 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.605 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.636 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.667 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.705 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.736 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.768 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.805 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.837 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.868 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.906 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.937 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.969 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:30.006 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:30.038 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:30.069 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:30.106 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:30.138 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:30.169 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:31.880 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #40662018.09.2115:15:31.900 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #02018.09.2115:15:31.940 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #02018.09.2115:15:31.990 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #02018.09.2115:15:32.010 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #02018.09.2115:15:32.074 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #02018.09.2115:15:32.100 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #02018.09.2115:15:32.120 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #02018.09.2115:15:32.174 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #02018.09.2115:15:32.274 test XAUUSD,H1: test.mq4: Актуальное время открытия бара М15 = 2018.09.2115:15. Ошибка #0
Lá está a muleta de novo. Você está tentando resolver o problema por qualquer meio, mesmo que irracional, ignorando a causa do problema - erros de linguagem. Acho que você não deveria fazer isso.
Adicionado:
Sim, este tipo de técnica parece funcionar. Como opção, você pode usá-lo. Obrigado! Mas eu ainda gostaria que as funções funcionassem corretamente.
Bem, eu não diria que é uma muleta. Estou esperando que as citações fluam do servidor, caso contrário, o histórico não será atualizado. Outra opção é tomar o tempo do computador local e corrigir o fuso horário, que pode ser calculado automaticamente e, no final, aguardar a atualização das cotações de qualquer forma. É um pouco tortuoso, mas não creio que o povo Metakvot mude nada no MT4. No final do dia, é um problema de conexão ao servidor que tem que ser tratado de uma forma ou de outra.
De acordo com as entradas dos registros. O terminal foi desligado às 14:25. A seguir, ligado às 14h30min. Verificamos o horário do bar M15. Começamos com a TF M1. O indicador (código acima) mostrava o tempo real de abertura 12:15 (hora do terminal, atrasado em 2 horas em relação à minha hora local). O resultado deveria ter sido 12:30! Conclusão - o erro está presente. E este método proposto por @Ihor Herasko não funciona.
Há dois erros significativos em sua abordagem para verificar:
No OnInit() do indicador, é impossível obter os dados corretos de qualquer TF, mesmo do atual. O OnInit() do indicador no início do terminal é executado quase em uma janela vazia (pode até não haver os dados que estavam no momento do desligamento do terminal). Mesmo o ambiente de mercado ainda é muitas vezes indisponível. A ajuda contém muitos avisos sobre o que não se deve fazer no OnInit(). Portanto, não há muito a incluir em seu código. Normalmente, esta é uma verificação dos valores dos parâmetros definidos, ligação de buffers indicadores a arrays e criação de classes, caso sejam utilizados. Tudo o resto tem que ser feito na OnCalculate().
Todas essas verificações só podem ser feitas após a OnCalculate ser chamada pelo menos uma vez.
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
Acho que consegui! O indicador é lançado imediatamente junto com o terminal? Se assim for, antes de verificar a comunicação com o servidor IsConnected() você tem um timer muito rápido que não tem tempo para sincronizar!
Boa tentativa. Eu estava começando a pensar que iria funcionar. Mas... Não:
Eu substituí a função OnTimer( ) no código anterior por esta função:
Acho que consegui! O indicador é iniciado imediatamente junto com o terminal? Se sim, antes de verificar a conexão com o servidor IsConnected() você tem um timer muito rápido que não tem tempo para sincronizar!
Ou faça assim.
Mas teremos que levar em conta a diferença entre a hora do servidor e a hora local. Escreva de volta com os resultados!Eu não vou fazer muletas. Há um erro óbvio no idioma! Estamos esperando os desenvolvedores...
Muito interessante, é suposto funcionar. Mas então novamente o timer é muito rápido, talvez o terminal não tenha tempo para começar a aceitar citações. Tenho que pensar sobre isso. Que tal fazer um temporizador normal por 5 segundos para testar a idéia?
Muito interessante, é suposto funcionar. Mas então novamente o timer é muito rápido, talvez o terminal não tenha tempo para começar a aceitar citações. Tenho que pensar sobre isso. E se fizermos um timer normal por 5 segundos para testar a idéia?
E eu não preciso de um "ajuste" para verificar a idéia. Na vida real, eu preciso do temporizador mais rápido possível.
Muito interessante, é suposto funcionar.
Você sempre pode executar o indicador em seu terminal, aguardar 15 minutos e reportar de volta.
Está bem, mas tenho muito mais trabalho a fazer. Assim que eu tiver uma pausa, farei uma experiência.
E acho que até tenho uma idéia de como pegá-lo.
Experimente assim!
Experimente assim!
Lá está a muleta de novo. Você está tentando resolver o problema por qualquer meio, mesmo que irracional, ignorando a causa do problema - erros de linguagem. Acho que você não deveria fazer isso.
Adicionado:
Sim, este tipo de técnica parece funcionar. Como opção, você pode usá-lo. Obrigado! Mas eu ainda gostaria que as funções funcionassem corretamente.
Primeiro uma resposta de @Ihor Herasko. Código para reprodução:
Resultado:
De acordo com as entradas dos registros. O terminal foi desligado às 14:25. A seguir, ligado às 14h30min. Verificamos o horário do bar M15. Começamos com a TF M1. O indicador (código acima) mostrava o tempo real de abertura 12:15 (hora do terminal, atrasado em 2 horas em relação à minha hora local). O resultado deveria ter sido 12:30! Conclusão - o erro está presente. E este método proposto por @Ihor Herasko não funciona.
Há dois erros significativos em sua abordagem para verificar: