Questions des débutants MQL5 MT5 MetaTrader 5 - page 440

 

Bonjour 2015.09.17_19:07 GMT+3 .J'ai défini les dimensions des tableaux dynamiques dans le programme EA. Et le compilateur donne des erreurs : "virgule attendue". Et s'il y a une variable dans le texte du programme, -- donne des avertissements : "la variable telle ou telle cache la déclaration de la variable au niveau global". Je ne comprends pas. Tout semble être correct, comme dans l'aide. Voici quelques extraits de code :

//--- tableau des prix maximaux des barres

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

//---

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

//--- définir les tailles des tableaux avec reserve (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) ;

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

//| Fonction de désinitialisation experte |

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

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)
  {Le compilateur génère des erreurs

{

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

Bonjour 2015.09.17_19:07 GMT+3 .J'ai défini les dimensions des tableaux dynamiques dans le programme EA. Et le compilateur donne des erreurs : "virgule attendue". Et si dans le texte du programme il y a

  1. Vous ne pouvez pas déclarer de tableaux avec les noms High[] et Low[], car il s'agit de noms système réservés aux tableaux-timeseries.
  2. Mauvaise orthographe de ArrayResize. Ça devrait être comme ça :
    //--- устанавливаю размеры массивов с запасом (reserve)
    ArrayResize(mrate,16,9);
    ArrayResize(maVal,16,9);
    ArrayResize(fVal,3,2);
    ArrayResize(zVal,3);
  3. Et la définition de l'indicateur timeseries pour un tableau ressemblerait à ceci :
    //--- массив максимальных цен баров
    ArraySetAsSeries(High,true);
    //---  
    ArraySetAsSeries(Low,true);
 
2015.09.17_19:45 GMT+3. Je joins un fichier .png juste au cas où :
Dossiers :
 
Karputov Vladimir:
  1. Vous ne pouvez pas déclarer de tableaux avec les noms High[] et Low[], car il s'agit de noms système réservés aux tableaux de séries chronologiques.
  2. Mauvaise orthographe de ArrayResize. Il devrait être écrit de cette façon :
Merci ! Vous avez répondu si rapidement. Je suis dehors à 20 heures. Je regarderai le reste plus tard. 19:54 MSC.
 
Karputov Vladimir:
Si vous voulez dire mon code - alors oui, mon code vérifie la présence d'une nouvelle barre.
Je suis intéressé par le code que j'ai joint - je veux comprendre ce qu'il fait.
 
-Aleks-:
Je suis intéressé par le code que j'ai joint - je veux comprendre ce qu'il fait.

Le code que vous avez donné ne fait rien, ou plutôt il ne fonctionne pas. Erreur :

if(TimeN==0)
      TimeN=TimeC;

Cette condition ne fonctionnera qu'une seule fois - la première fois que vous exécutez le programme. À ce stade, la variable statique sera initialisée.

La condition ci-dessous n'a aucun sens à vérifier puisque la variable TimeN dans votre code sera égale au zéro éternel (ou plutôt à la date du 1er janvier 1970) et ce zéro éternel sera comparé à la variable TimeC qui est égale à l'heure d'ouverture de la barre actuelle) :

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

Le code que vous avez donné ne fait rien, ou plutôt il ne fonctionne pas. Erreur :

Cette condition ne fonctionnera qu'une seule fois - la première fois que vous exécutez le programme. À ce stade, la variable statique sera initialisée.

La condition ci-dessous n'a aucun sens à vérifier puisque la variable TimeN dans votre code sera égale au zéro éternel (ou plutôt ce sera la date du 1er janvier 1970) et ce zéro éternel sera comparé à la variable TimeC qui est égale au temps d'ouverture de la barre actuelle) :

Maintenant je me demande pourquoi j'aurais dû l'écrire... dans le conseiller expert.

Merci pour cette précision !

 
Karputov Vladimir:

Si la nouvelle barre est sur l'échelle de temps M1, alors imprimez le message :

Il s'avère que je n'ai pas donné le code complet, le code correct était

 

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);

  } 

Dans ce cas, ça marche, non ?
 
-Aleks-:

Il s'avère que je n'ai pas donné le code complet, le code correct était

 

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);

  } 

Dans ce cas, ça marche, non ?
Avez-vous essayé de compiler ce code ? Il y a une erreur ici : la variable TimeN est déclarée dans OnInit() et lorsque vous quittez OnInit(), cette variable sera détruite. C'est pourquoi il y a une erreur dans la fonction OnTick()
'TimeN' - undeclared identifier

Voici le code de travail :

//+------------------------------------------------------------------+
//|                                                         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:
Avez-vous essayé de compiler ce code ? Il y a une erreur ici : la variable TimeN est déclarée dans OnInit() et cette variable sera détruite à la sortie de OnInit(). Par conséquent, une erreur se produit dans la fonction OnTick()

Voici le code de travail :

J'ai écrit static datetime TimeN=0 ; dans la zone précédantint OnInit() - où les variables externes et autres sont déclarées.

Raison: