Discussão do artigo "Guia prático do MQL5: Analisando propriedades de posição no testador de estratégias do MetaTrader 5"
Boa noite, por favor, me ajude. Na função CheckNewBar , a variável estática new_bar é zerada na primeira linha e, em seguida, a lógica da função se baseia no fato de ela ser igual a zero ou não. Poderia me dizer onde não estou entendendo?!?!!!!!!
bool CheckNewBar() { //--- Variável para o horário de abertura da barra atual static datetime new_bar=NULL; //--- Matriz para obter o horário atual de abertura da barra static datetime time_last_bar[1]={0}; //--- Obter o horário de abertura da barra atual // Se houver um erro durante o recebimento, nós o informaremos if(CopyTime(_Symbol,Period(),0,1,time_last_bar)==-1) { Print(__FUNCTION__,": Erro ao copiar o horário de abertura da barra: "+IntegerToString(GetLastError())+""); } //--- Se essa for a primeira chamada de função if(new_bar==NULL) { // Definir a hora new_bar=time_last_bar[0]; Print(__FUNCTION__,": Inicialização ["+_Symbol+"][TF: "+TimeframeToString(Period())+"][" +TimeToString(time_last_bar[0],TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"]"); return(false); // Retornar falso e sair } //--- Se a hora for diferente if(new_bar!=time_last_bar[0]) { new_bar=time_last_bar[0]; // Definir a hora e sair return(true); // Lembrar a hora e retornar true } //--- Chegamos a esse ponto - portanto, a barra não é nova, vamos retornar false return(false); }
Boa noite, por favor, me ajude. Na função CheckNewBar , a variável estática new_bar é zerada na primeira linha e, em seguida, a lógica da função se baseia no fato de ela ser igual a zero ou não. Poderia me dizer onde não estou entendendo?!?!!!!!!
A ajuda diz:
As variáveis locais declaradas com a palavra-chave static retêm seus valores durante todo o tempo de existência da função. Em cada próxima chamada da função, essas variáveis locais contêm os valores que tinham na chamada anterior.
Ou seja, em uma nova chamada da função CheckNewBar(), a variável new_bar manterá o valor recebido na chamada anterior da função, mas na primeira linha será atribuído a ela um novo valor NULL...... e não está claro para mim por que tudo isso e como funciona. Por favor, esclareça minha confusão, provavelmente estou em algum lugar estúpido, mas ONDE ?????
Boa noite, por favor, me ajude. Na função CheckNewBar , a variável estática new_bar é zerada na primeira linha e, em seguida, a lógica da função se baseia no fato de ela ser igual a zero ou não. Poderia me dizer onde não estou entendendo?!?!!!!!!
Se eu entendi a Ajuda corretamente, na linhastatic datetimenew_bar=NULL; " Se os valores iniciais não forem especificados, as variáveis da classe de memória estática terão valores iniciais zero". Portanto, ela não deveria ter sido inicializada com null e a lógica seria perfeita. Ou não ????
Se eu entendi a Ajuda corretamente, a linhastatic datetimenew_bar=NULL; " Se os valores iniciais não forem especificados, as variáveis de classe de memória estática terão valores iniciais nulos." Portanto, ela não deveria ter sido inicializada com null e a lógica seria perfeita. Ou não ???
As variáveis DEVEM sempre ser inicializadas. É uma lei não escrita. Aqueles que não a cumprem, mais cedo ou mais tarde, cometem erros muito difíceis de encontrar :)
Como funciona uma variável estática:
//+------------------------------------------------------------------+ //|Teste EA.mq5 //|Direitos autorais © 2018, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Direitos autorais © 2018, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.000" //+------------------------------------------------------------------+ //| Função de inicialização de especialista| //+------------------------------------------------------------------+ int OnInit() { //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Função de desinicialização de especialista| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Função de tique de especialista| //+------------------------------------------------------------------+ void OnTick() { //--- trabalhamos somente no momento do nascimento da nova barra static datetime PrevBars=0; Print("PrevBars ",PrevBars); datetime time_0=iTime(Symbol(),Period(),0); if(time_0==PrevBars) return; PrevBars=time_0; Print("New bar. PrevBars ",PrevBars); } //+------------------------------------------------------------------+
Imprimir na guia Experts. A primeira entrada para OnTick() é a inicialização de uma variável estática, uma nova barra.
2018.01.08 00:00:00 PrevBars 1970.01.01 00:00:00 2018.01.08 00:00:00 New bar. PrevBars 2018.01.08 00:00:00 2018.01.08 00:00:30 PrevBars 2018.01.08 00:00:00 2018.01.08 00:00:59 PrevBars 2018.01.08 00:00:00 2018.01.08 00:01:00 PrevBars 2018.01.08 00:00:00 2018.01.08 00:01:00 New bar. PrevBars 2018.01.08 00:01:00 2018.01.08 00:01:30 PrevBars 2018.01.08 00:01:00 2018.01.08 00:02:00 PrevBars 2018.01.08 00:01:00
As variáveis DEVEM ser sempre inicializadas. Essa é uma lei não escrita. Aqueles que não a cumprem, mais cedo ou mais tarde, cometem erros muito difíceis de encontrar :)
Como funciona uma variável estática:
Impressão na guia Experts. A primeira entrada para OnTick() é a inicialização de uma variável estática, uma nova barra.
OK, entendi, obrigado pela resposta concisa e muito lúcida.
- 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
Novo artigo Guia prático do MQL5: Analisando propriedades de posição no testador de estratégias do MetaTrader 5 foi publicado:
Apresentaremos uma versão modificada do Expert Advisor a partir fo artigo anterior "Guia prático do MQL5: Propriedades de posição no painel de informações personalizado". Alguns dos assuntos que abordaremos incluem a obtenção de dados das barras, verificação de eventos de uma nova barra no símbolo atual, inclusão de uma classe de negociação da Biblioteca padrão a um arquivo, criação de uma função para buscar por sinais de negociação e uma função para execução das operações de negócio, assim como determinar os eventos de negócio na função OnTrade().
Autor: Anatoli Kazharski