Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 440

 

Ciao 2015.09.17_19:07 GMT+3 .Ho impostato le dimensioni degli array dinamici nel programma EA. E il compilatore dà errori: "virgola prevista". E se c'è una variabile nel testo del programma, -- dà avvertimenti: "la variabile tale-e-quella tale nasconde la dichiarazione della variabile a livello globale". Non capisco. Tutto sembra essere corretto, come in Help. Ecco alcuni frammenti di codice:

//--- array di prezzi massimi delle barre

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

//---

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

//--- impostare le dimensioni dell'array con riserva (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);

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

//| Funzione di deinizializzazione esperto |

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

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)
  {Il compilatore genera errori

{

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

Ciao 2015.09.17_19:07 GMT+3 .Ho impostato le dimensioni degli array dinamici nel programma EA. E il compilatore dà errori: "virgola prevista". E se nel testo del programma c'è

  1. Non potete dichiarare array con i nomi High[] e Low[], perché questi sono nomi di sistema riservati di arrays-timeseries.
  2. Scrittura errata di ArrayResize. Dovrebbe essere così:
    //--- устанавливаю размеры массивов с запасом (reserve)
    ArrayResize(mrate,16,9);
    ArrayResize(maVal,16,9);
    ArrayResize(fVal,3,2);
    ArrayResize(zVal,3);
  3. E l'impostazione del flag della serie temporale per un array sarebbe così:
    //--- массив максимальных цен баров
    ArraySetAsSeries(High,true);
    //---  
    ArraySetAsSeries(Low,true);
 
2015.09.17_19:45 GMT+3. Allegando un file .png solo nel caso in cui:
 
Karputov Vladimir:
  1. Non potete dichiarare array con i nomi High[] e Low[], perché questi sono nomi di sistema riservati per le serie temporali di array.
  2. Scrittura errata di ArrayResize. Dovrebbe essere scritto in questo modo:
Grazie! Hai risposto così rapidamente. Sono fuori alle 20:00. Guarderò il resto più tardi. 19:54 MSC.
 
Karputov Vladimir:
Se intendi il mio codice - allora sì, il mio codice sta controllando la presenza di una nuova barra.
Sono interessato al codice che ho allegato - voglio capire cosa fa.
 
-Aleks-:
Sono interessato al codice che ho allegato - voglio capire cosa fa.

Il codice che hai dato non fa nulla, o meglio non funziona. Errore:

if(TimeN==0)
      TimeN=TimeC;

Questa condizione funzionerà solo una volta - la prima volta che si esegue il programma. A questo punto, la variabile statica sarà inizializzata.

La condizione qui sotto non ha alcun senso da controllare poiché la variabile TimeN nel vostro codice sarà uguale all'eterno zero (ovvero la data 1 gennaio 1970) e questo eterno zero sarà confrontato con la variabile TimeC che è uguale al tempo di apertura della barra corrente):

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

Il codice che hai dato non fa nulla, o meglio non funziona. Errore:

Questa condizione funzionerà solo una volta - la prima volta che si esegue il programma. A questo punto, la variabile statica sarà inizializzata.

La condizione qui sotto non ha alcun senso da controllare poiché la variabile TimeN nel vostro codice sarà uguale all'eterno zero (o meglio sarà la data 1 gennaio 1970) e questo eterno zero sarà confrontato con la variabile TimeC che è uguale al tempo di apertura della barra corrente):

Ora mi chiedo perché avrei dovuto scriverlo... in Expert Advisor.

Grazie per il chiarimento!

 
Karputov Vladimir:

Se la nuova barra è sul timeframe M1, allora stampa il messaggio:

Si scopre che non ho dato il codice completo, quello corretto 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);

  } 

In questo caso funziona, giusto?
 
-Aleks-:

Si scopre che non ho dato il codice completo, il codice corretto 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);

  } 

In questo caso, funziona, giusto?
Hai provato a compilare questo codice? C'è un errore qui: la variabile TimeN è dichiarata in OnInit() e quando si esce da OnInit(), questa variabile sarà distrutta. Ecco perché c'è un errore nella funzione OnTick()
'TimeN' - undeclared identifier

Ecco il codice funzionante:

//+------------------------------------------------------------------+
//|                                                         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:
Hai provato a compilare questo codice? C'è un errore qui: la variabile TimeN è dichiarata in OnInit() e questa variabile sarà distrutta all'uscita da OnInit(). Pertanto, si verifica un errore nella funzione OnTick()

Ecco il codice funzionante:

Ho scritto static datetime TimeN=0; nell'area prima diint OnInit() - dove sono dichiarate le variabili esterne e le altre variabili.