Esteja ciente de que essa abordagem não é confiável, já que o MT pára de atualizar a contagem de publicações após a configuração máxima de publicações. Então, thereal! Método confiável é verificar o tempo.
Esteja ciente de que essa abordagem não é confiável, já que o MT pára de atualizar a contagem de publicações após a configuração máxima de publicações. Então, thereal! Método confiável é verificar o tempo.
Sim, concordou, certamente não use o método Bars. O método para utilizar o SeriesInfoInteger e chamá-lo para o seu LASTBAR_DATE e perguntar novamente até que a sua função expire ou você obtenha um resultado limpo. Aqui está um exemplo de uma função isNewBar do MTF ... Inserted Code #include lt; Arrays \ ArrayObj.mqhgt; classe NewBars: public CObject {ENUM_TIMEFRAMES m_timeframe; datetime m_last_bar_time; pessoas: NewBars (ENUM_TIMEFRAMES tf): m_timeframe (tf), m_last_bar_time (0) {} bool isNewBar () uint ms = GetTickCount (); datetime curr; do ResetLastError (); curr = (datetime) SeriesInfoInteger (_Simbolo, m_timeframe, SERIES_LASTBAR_DATE); while (_LastError! = ERR_NO_ERROR GetTickCount () - ms lt; 500); if (curr gt; 0 _LastError == ERR_NO_ERROR curr! = m_last_bar_time) bool res = verdadeiro; if (m_last_bar_time == 0) res = false; m_last_bar_time = curr; return res; retorna falso; bool isMatching (ENUM_TIMEFRAMES tf) retorna m_timeframe == tf? Verdadeiro falso; }; bool isNewBar (const intervalo ENUM_TIMEFRAMES) static CArrayObj tfs; para (int I = tfs.Total () - 1; igt; = 0; I -) NewBars * tf = dynamic_castlt; NewBars * gt; (tfs.At (I)); if (tf.isMatching (interval)) retorna tf.isNewBar (); tfs.Add (new NewBars (interval)); retorna falso;
1 Anexo (s)
Não (pare de atualizar) Barras () excede o número máximo de barras em cenários quando a configuração máxima de pubs é atingida (e excedida)
Obrigado, você é muito gentil em fornecer este exemplo, aqui e em meus outros tópicos. Eu sei o que você fez aqui, mas a lingüística me ilude, pois ainda estou aprendendo o lado OO do MQL4. Eu também não estou totalmente convencido de que seu código funcionará dentro do contexto de um script, no entanto, eu não sou tão educado.
Obrigado, eu li respostas contraditórias em vários tópicos, então eu não estava convencido, mas ele estava trabalhando para mim, então eu percebi o que diabos
Obrigado por responder, então estou certo em usar este método de barras ou não? Parece mais fácil que o sistema Time e prefiro manter as coisas simples
Nenhum dos métodos é complexo: Código inserido static datetime _prevTime = 0; datetime _currTime = iTime (NULL, período de tempo desejado, 0); bool _isNewBar = (_prevTime! = _currTime); if (_isNewBar) _prevTime = _currTime;
Obrigado, eu tinha algo parecido com o meu script, mas ele não funcionou (publicado anteriormente no artigo inicial), mesmo quando eu adicionei o RefreshRates (). Tentarei novamente com seu código, com ResreshRates () adicionado dentro e fora do loop para que o script receba novas informações.
Código inserido/- Variável mundial ------------------------------------------ ------------------------ datetime ArrayTime # 91; # 93 ;, LastTime; void OnTick () if (NewBar (PERIOD_CURRENT))/seu código bool NewBar (int period) bool firstRun = falso, novoBar = falso; ArraySetAsSeries (ArrayTime, true); CopyTime (símbolo (), período, 0,2, ArrayTime); if (LastTime == 0) firstRun = true; if (ArrayTime # 91; 0 # 93; gt; LastTime) if (firstRun == falso) newBar = verdadeiro; LastTime = ArrayTime # 91; 0 # 93 ;; Rendimento newBar;
Além disso, verifique este código que é adequado para intervalos de tempo aleatórios (descobertos usando a primeira cotação de preço): Código inserido #property strict void OnStart () datetime segundos = _Stage * 60;/indica qualquer quantia em segundos datetime t_last_recorded = 0;/para demonstração: D while (! IsStopped ()) RefreshRates (); datetime t = TimeCurrent ();/hora da última datação conhecida datetime t_normalized = t/moments * moments; quando (t_normalized gt; t_last_recorded)/nova barra printf (nova barra!); t_last_recorded = t_normalized; Sono (1);