Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 440

 

Olá 2015.09.17_19:07 GMT+3 .Estabeleci as dimensões das matrizes dinâmicas no programa EA. E o compilador dá erros: "vírgula esperada". E se houver uma variável no texto do programa, -- dá avisos: "a variável suce-e-suprime a declaração de variável a nível global". Não percebo. Tudo parece estar correcto, como na Ajuda. Aqui estão alguns trechos de código:

//--- gama de preços máximos de barras

bool ArraySetAsSeries(double &High[],bool);

//---

bool ArraySetAsSeries(double &Low[],bool);

//--- definir os tamanhos da matriz com reserva (reserva)

int ArrayResize(double &mrate[],int 16,int 9);

int ArrayResize(double &maVal[],int 16,int 9);

int ArrayResize(double &fVal[],int 3,int 2);

int ArrayResize(double &zVal[],int 3,int 0);

int ArrayResize(double &High[],int 1,int 0);

int ArrayResize(double &Low[],int 1,int 0);

//+------------------------------------------------------------------+

//| Função de desinicialização de peritos |

//+------------------------------------------------------------------+

nulo OnDeinit(const int razão)

//--- массив максимальных цен баров
bool ArraySetAsSeries(double &High[],bool);
//---  
bool ArraySetAsSeries(double &Low[],bool);
//--- устанавливаю размеры массивов с запасом (reserve)
int  ArrayResize(double &mrate[],int 16,int 9);
int  ArrayResize(double &maVal[],int 16,int 9);
int  ArrayResize(double &fVal[],int 3,int 2);
int  ArrayResize(double &zVal[],int 3,int 0);
int  ArrayResize(double &High[],int 1,int 0);
int  ArrayResize(double &Low[],int 1,int 0);  
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {O compilador gera erros

{

 
Николай Никитюк:

Olá 2015.09.17_19:07 GMT+3 .Estabeleci as dimensões das matrizes dinâmicas no programa EA. E o compilador dá erros: "vírgula esperada". E se no texto do programa houver

  1. Não se podem declarar arrays com nomes High[] e Low[], porque estes são nomes reservados do sistema de arrays-timeseries.
  2. Ortografia incorrecta de ArrayResize. Deve ser assim:
    //--- устанавливаю размеры массивов с запасом (reserve)
    ArrayResize(mrate,16,9);
    ArrayResize(maVal,16,9);
    ArrayResize(fVal,3,2);
    ArrayResize(zVal,3);
  3. E colocar a bandeira da série cronológica para uma matriz pareceria com isto:
    //--- массив максимальных цен баров
    ArraySetAsSeries(High,true);
    //---  
    ArraySetAsSeries(Low,true);
 
2015.09.17_19:45 GMT+3. Anexar um ficheiro .png só para o caso de :
Arquivos anexados:
 
Karputov Vladimir:
  1. Não se podem declarar arrays com nomes High[] e Low[], porque estes são nomes de sistema reservados para arrays timeseries.
  2. Ortografia incorrecta de ArrayResize. Deve ser escrito desta forma:
Obrigado! Respondeu tão rapidamente. Saio às 20:00 horas. Verei o resto mais tarde. 19:54 MSC.
 
Karputov Vladimir:
Se se refere ao meu código - então sim, o meu código está a verificar a existência de uma nova barra.
Estou interessado no código que anexei - quero compreender o que ele faz.
 
-Aleks-:
Estou interessado no código que anexei - quero compreender o que ele faz.

O código que deu não faz nada, ou melhor, não funciona. Erro:

if(TimeN==0)
      TimeN=TimeC;

Esta condição só funcionará uma vez - a primeira vez que executar o programa. Neste momento, a variável estática será inicializada.

A condição abaixo não faz qualquer sentido verificar, uma vez que a variável TimeN no seu código será igual ao zero eterno (ou melhor, a data de 1 de Janeiro de 1970) e este zero eterno será comparado com a variável TimeC que é igual ao tempo em que a barra actual abre):

   if(TimeN==TimeC)
      return;
 
Karputov Vladimir:

O código que deu não faz nada, ou melhor, não funciona. Erro:

Esta condição só funcionará uma vez - a primeira vez que executar o programa. Neste momento, a variável estática será inicializada.

A condição abaixo não faz sentido verificar de todo, uma vez que a variável TimeN no seu código será igual ao zero eterno (ou melhor, será a data de 1 de Janeiro de 1970) e este zero eterno será comparado com a variável TimeC que é igual ao tempo de abertura da barra actual):

Agora pergunto-me porque deveria tê-lo escrito... em Consultor Especialista.

Obrigado pelo esclarecimento!

 
Karputov Vladimir:

Se o novo compasso estiver no prazo M1, então imprima a mensagem:

Acontece que eu não dei o código completo, o correcto foi

 

int init()

  { 

   static datetime TimeN=0;

   return(INIT_SUCCEEDED);

  }

 

int start()

  { 

   datetime TimeC=iTime(NULL,TF,0);

   if(TimeN==0)TimeN=TimeC;

   if(TimeN==TimeC) return(0);

   TimeN=TimeC;

  // Код программы исполняется при появлении нового бара

   return(INIT_SUCCEEDED);

  } 

Nesse caso funciona, certo?
 
-Aleks-:

Acontece que eu não dei o código completo, o código correcto era

 

int init()

  { 

   static datetime TimeN=0;

   return(INIT_SUCCEEDED);

  }

 

int start()

  { 

   datetime TimeC=iTime(NULL,TF,0);

   if(TimeN==0)TimeN=TimeC;

   if(TimeN==TimeC) return(0);

   TimeN=TimeC;

  // Код программы исполняется при появлении нового бара

   return(INIT_SUCCEEDED);

  } 

Nesse caso, funciona, certo?
Já tentou compilar este código? Existe aqui um erro: a variável TimeN é declarada em OnInit() e quando se sai de OnInit(), esta variável será destruída. É por isso que existe um erro na função OnTick()
'TimeN' - undeclared identifier

Aqui está o código de trabalho:

//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   static datetime TimeN;
   datetime TimeC=iTime(NULL,PERIOD_M1,0);
   if(TimeN==TimeC)
      return;
   TimeN=TimeC;
// новый бар, выполняем код
   Print("New bar");
   return;
  }
//+------------------------------------------------------------------+
 
Karputov Vladimir:
Já tentou compilar este código? Há aqui um erro: a variável TimeN é declarada em OnInit() e à saída de OnInit() esta variável será destruída. Portanto, ocorre um erro na função OnTick()

Aqui está o código de trabalho:

Escrevi datatime estática TimeN=0; na área antes deint OnInit() - onde são declaradas variáveis externas e outras variáveis.