Experimente isto em sua EA, no início da função OnTick.
// Usaremos a variável estática Old_Time para servir o tempo da barra.
// A cada execução do OnTick, verificaremos o tempo atual da barra com o tempo gravado.
// Se o tempo da barra não for igual ao tempo salvo, isso indica que temos um novo tick.
data/hora estática Old_Time;
data/hora Nova_Tempo[1];
bool IsNewBar=false;
// copiando o último tempo da barra para o elemento Novo_Tempo[0]; bool IsNewBar=false
int copied=CopyTime(_Símbolo,_Periodo,0,1,New_Time);
if(copied>0) // ok, os dados foram copiados com sucesso
{
if(Old_Time!=New_Time[0]) // se o tempo antigo não for igual ao tempo do novo bar
{
IsNewBar=true; // se não é uma primeira chamada, a nova barra apareceu
if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("Temos aqui um novo bar ",New_Time[0]," o tempo antigo era ",Old_Time);
Tempo_Velho=Novo_Tempo[0]; // economizando tempo de barra
}
}
senão
{
Alerta("Erro na cópia de dados históricos, erro =",GetLastError()));
ResetLastError();
retornar;
}
//--- A EA só deve verificar a existência de novo comércio se tivermos um novo bar
if(IsNewBar==falso)
{
retornar;
}
//--- Temos barras suficientes para trabalhar com
int Mybars=Bars(_Símbolo,_Periodo);
if(Mybars<60) // se o total de barras for inferior a 60 barras
{
Alerta ("Temos menos de 60 barras, EA sairá agora!");
retornar;
}
Olá oneillj,
Pensei que já tinha respondido, mas parece ter desaparecido no éter da internet.
O fragmento de código que você forneceu é praticamente aquele de que eu estava reclamando em primeiro lugar. Por que é tão complexo? Achei que tinha que haver uma maneira mais fácil. Eu inventei esta, que parece funcionar. Por favor, me corrija se eu estiver errado. (Eu também tentei usar BarsCalculated, mas sempre foi igual a Bars, então o teste sempre foi avaliado como falso).
estático no LastBarCount = 0;
se (Bars(_Símbolo, _Periodo) > LastBarCount)
LastBarCount = Bars(_Symbol, _Period);
mais
retornar;
- www.mql5.com
static int BARS; //+------------------------------------------------------------------+ //| NewBar function | //+------------------------------------------------------------------+ bool IsNewBar() { if(BARS!=Bars(_Symbol,_Period)) { BARS=Bars(_Symbol,_Period); return(true); } return(false); }
- 2010.10.11
- Konstantin Gruzdev
- www.mql5.com
Eu uso isto...
Você também pode tentar isto:
// Rates structure array for last two bars MqlRates mrate[2]; CopyRates(Symbol(), Period(), 0, 2, mrate); // NEW BAR CHECK. //--------------- static double dBar_Open; static double dBar_High; static double dBar_Low; static double dBar_Close; static long lBar_Volume; static datetime nBar_Time; // Boolean for new BAR confirmation. bool bStart_NewBar = false; // Check if the price data has changed tov the previous bar. if(mrate[0].open != dBar_Open || mrate[0].high != dBar_High || mrate[0].low != dBar_Low || mrate[0].close != dBar_Close || mrate[0].tick_volume != lBar_Volume || mrate[0].time != nBar_Time) { bStart_NewBar = true; // A new BAR has appeared! // Update the new BAR data. dBar_Open = mrate[0].open; dBar_High = mrate[0].high; dBar_Low = mrate[0].low; dBar_Close = mrate[0].close; lBar_Volume = mrate[0].tick_volume; nBar_Time = mrate[0].time; } // Check if a new bar has formed. if(bStart_NewBar == true) { // Your code. }
Eu uso isto...
![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Olá a todos,
Sou um novato completo da MQL5, mas já fiz um pouco de codificação para outras plataformas.
Estou me perguntando por que é tão difícil para uma EA executar apenas em uma nova barra. Dei uma olhada em alguns dos artigos, incluindo o manipulador de eventos da "nova barra", e parece muito difícil.
Se isso não funcionar e eu tiver que usar o manipulador de eventos do "novo bar", é possível simplesmente não carregar os arquivos relevantes e copiá-los para a pasta Files(?), e depois #inclui-los? Há algum lugar onde isso seja documentado para pessoas como eu que basicamente não têm idéia do que estão fazendo?
Estou trabalhando através do tutorial em https://www.mql5.com/en/articles/100, e a primeira coisa que notei foi que a função "Barras" é usada para garantir que haja barras suficientes para realizar cálculos, mas o próximo código é aparentemente projetado para detectar uma nova barra e é (para minha compreensão de qualquer forma) uma peça de código muito complexa. A função "Bars" não poderia ser usada para detectar uma nova barra? Algo como if(Bars > int LastBarCount) {bool IsNewBar = true; LastBarCount = Bars;} else {IsNewBar = false;}. Algo como isso funcionaria?
Uma para a lista de desejos. Não seria bom se houvesse um evento OnNewBar que pudéssemos anular, em vez de OnTick? Como todos os indicadores que eu já vi funcionam em bares, não em carrapatos, eu acho que isso tornaria a vida de todos muito mais fácil.
Acabou de encontrar outra possibilidade: "BarsCalculados". Mais uma vez, não tenho certeza absoluta do que isso significa a partir da descrição, mas parece ser o número de barras que a EA já processou. Se isso fosse verdade, tudo que eu precisaria verificar é se (Bars > BarsCalculated), se for verdade, então vá e faça meu processamento, caso contrário volte? Estou perdendo alguma coisa?
Obrigado,
Ian