Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 440

 

Hola 2015.09.17_19:07 GMT+3 .He establecido las dimensiones de las matrices dinámicas en el programa EA. Y el compilador da errores: "coma esperada". Y si hay una variable en el texto del programa, -- da advertencias: "la variable tal o cual oculta la declaración de la variable a nivel global". No lo entiendo. Todo parece correcto, como en la Ayuda. Aquí hay algunos fragmentos de código:

//--- matriz de precios máximos de barras

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

//---

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

//--- establecer los tamaños de los arrays con reserva (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);

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

//| Función de desinicialización experta |

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

void OnDeinit(const int reason)

//--- массив максимальных цен баров
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)
  {El compilador genera errores

{

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

Hola 2015.09.17_19:07 GMT+3 .He establecido las dimensiones de las matrices dinámicas en el programa EA. Y el compilador da errores: "coma esperada". Y si en el texto del programa hay

  1. No puedes declarar arrays con nombres High[] y Low[], porque son nombres reservados del sistema de arrays-series.
  2. Escritura incorrecta de ArrayResize. Debería ser así:
    //--- устанавливаю размеры массивов с запасом (reserve)
    ArrayResize(mrate,16,9);
    ArrayResize(maVal,16,9);
    ArrayResize(fVal,3,2);
    ArrayResize(zVal,3);
  3. Y la configuración de la bandera de series de tiempo para un array se vería así:
    //--- массив максимальных цен баров
    ArraySetAsSeries(High,true);
    //---  
    ArraySetAsSeries(Low,true);
 
2015.09.17_19:45 GMT+3. Adjuntando un archivo .png por si acaso:
Archivos adjuntos:
 
Karputov Vladimir:
  1. No puedes declarar arrays con nombres High[] y Low[], porque son nombres de sistema reservados para arrays timeseries.
  2. Escritura incorrecta de ArrayResize. Debería escribirse así:
Gracias. Has respondido muy rápido. Salgo a las 8:00 P.M. Veré el resto más tarde. 19:54 MSC.
 
Karputov Vladimir:
Si te refieres a mi código - entonces sí, mi código está comprobando si hay una nueva barra.
Me interesa el código que he adjuntado, quiero entender lo que hace.
 
-Aleks-:
Me interesa el código que he adjuntado, quiero entender lo que hace.

El código que has dado no hace nada, o más bien no funciona. Error:

if(TimeN==0)
      TimeN=TimeC;

Esta condición sólo funcionará una vez: la primera vez que ejecute el programa. En este punto, la variable estática será inicializada.

La condición de abajo no tiene sentido comprobarla en absoluto ya que la variable TimeN en su código será igual al cero eterno (o más bien la fecha del 1 de enero de 1970) y este cero eterno se comparará con la variable TimeC que es igual a la hora de apertura de la barra actual):

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

El código que has dado no hace nada, o más bien no funciona. Error:

Esta condición sólo funcionará una vez: la primera vez que ejecute el programa. En este punto, la variable estática será inicializada.

La condición de abajo no tiene sentido comprobarla en absoluto ya que la variable TimeN en su código será igual al cero eterno (o más bien será la fecha del 1 de enero de 1970) y este cero eterno se comparará con la variable TimeC que es igual al tiempo de apertura de la barra actual):

Ahora me pregunto por qué debería haberlo escrito... en el Asesor Experto.

Gracias por la aclaración.

 
Karputov Vladimir:

Si la nueva barra está en el marco temporal M1, entonces imprime el mensaje:

Resulta que no di el código completo, el 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);

  } 

En ese caso funciona, ¿no?
 
-Aleks-:

Resulta que no di el código completo, el 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);

  } 

En ese caso, funciona, ¿no?
¿Has intentado compilar este código? Aquí hay un error: la variable TimeN está declarada en OnInit() y al salir de OnInit(), esta variable será destruida. Por eso hay un error en la función OnTick()
'TimeN' - undeclared identifier

Aquí está el código de trabajo:

//+------------------------------------------------------------------+
//|                                                         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:
¿Has intentado compilar este código? Aquí hay un error: la variable TimeN está declarada en OnInit() y al salir de OnInit() esta variable será destruida, por lo que se produce un error en la función OnTick()

Aquí está el código de trabajo:

Escribí static datetime TimeN=0; en el área antes deint OnInit() - donde se declaran las variables externas y otras.