Erreurs, bugs, questions - page 1697

 
Vladimir Pastushak:

Merci.

Alexey, votre exemple ne fonctionne pas, les méthodes du parent sont toujours vidées dans l'héritier, qui ne devrait pas être vidé.


Ça ne devrait pas être comme ça, pouvez-vous lancer le code ?

Lesdonnées qui étaient protégées et publiquesdans le parent seront protégées lors de l'héritage protégé.

	          
 
  1. Nous réglons l'indicateur sur un graphique NONE avec nos mains.
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_plots   1
    
    double Buffer[];
    
    int handle = INVALID_HANDLE;
    
    void OnInit()
    {
      ::SetIndexBuffer(0, Buffer, INDICATOR_DATA);
      
      handle = ChartIndicatorGet(0, 1, ChartIndicatorName(0, 1, 0));  
    }
    
    #define  TOSTRING(A) #A + " = " + (string)A + "\n"
    
    int OnCalculate( const int rates_total,
                     const int prev_calculated,
                     const datetime &time[],
                     const double &open[],
                     const double &high[],
                     const double &low[],
                     const double &close[],
                     const long &tick_volume[],
                     const long &volume[],
                     const int &spread[] )
    {
      if (handle != INVALID_HANDLE)
      {
        Buffer[rates_total - 1] = MathRand();
        
        double BufferCopy[];
        
        if (CopyBuffer(handle, 0, 0, 1, BufferCopy) > 0)
          Print(TOSTRING(BufferCopy[0]) + TOSTRING(Buffer[rates_total - 1]));
      }
      
      return(rates_total);
    }
  2. Retirer l'indicateur de la carte à la main.
  3. Dans le journal, nous voyons que l'indicateur continue à fonctionner. Vous pouvez fermer tous les graphiques dans le terminal, mais l'exécution se poursuivra. Et ça n'aidera pas, bien sûr,
    void OnDeinit( const int Reason )
    {
      if (handle != INVALID_HANDLE)  
        IndicatorRelease(handle);
      
      return;
    }
  4. Le redémarrage du terminal arrête l'exécution de l'indicateur.
  5. Combien d'indicateurs peuvent être inactifs et nous ne les connaissons même pas ? Il n'y a pas de contrôle du tout.
 
fxsaber:
  1. Réglage manuel de l'indicateur NULL sur le graphique
  2. Retirer l'indicateur de la carte à la main.
  3. Dans le journal, nous voyons que l'indicateur continue à fonctionner. Vous pouvez fermer tous les graphiques dans le terminal, mais il sera toujours exécuté.
  4. Le redémarrage du terminal arrête l'exécution de l'indicateur.
  5. Combien d'indicateurs peuvent être inactifs et nous n'en avons même pas entendu parler ? Il n'y a pas de contrôle du tout.

Il est impossible de lire et de regarder les codes avec#define et avec ::

Veuillez réécrire les codes dans le style du MQL5 commun.

 
fxsaber:
  1. Réglage manuel de l'indicateur NULL sur le graphique
  2. Retirer l'indicateur de la carte à la main.
  3. Dans le journal, nous voyons que l'indicateur continue à fonctionner. Vous pouvez fermer tous les graphiques dans le terminal, mais il sera toujours exécuté.
  4. Le redémarrage du terminal arrête l'exécution de l'indicateur.
  5. Combien d'indicateurs peuvent être exécutés en mode veille et nous n'en avons même pas entendu parler ? Il n'y a pas de contrôle du tout.
L'ajout de la vérification _StopFlag n'est pas utile ?
 
Karputov Vladimir:

Il est impossible de lire et de regarder les codes avec#define et avec ::

Veuillez réécrire les codes dans le style commun MQL5.

C'est le style MQL5. Veuillez étudier ce qu'est #define et ce qu'est : :.
 
Alexey Kozitsyn:
L'ajout d'un contrôle _StopFlag n'est pas utile ?
Où l'ajouter et comment peut-il être utile, du moins en théorie. C'est un bug du terminal. Et c'est un bug sérieux. J'ai eu de la chance - je vois dans le journal que l'indicateur fonctionne. Cependant, il y a beaucoup d'indicateurs qui fonctionnent dans le terminal sans aucune information à leur sujet. Mais le sujet se pose, et pourquoi mon CPU est si chargé sur un terminal vide ?
 
fxsaber:
C'est le style de MQL5. Veuillez étudier ce qu'est #define et ce qu'est : :.
Ce n'est pas ce que je veux dire. Le ": :" n'est pas du tout nécessaire dans vos exemples - c'est peut-être votre habitude, mais il n'est pas du tout nécessaire ici. Le code peut être écrit normalement sans #defane également. Essayez juste de le réécrire et voyez si quelque chose devient clair.
 
Karputov Vladimir:
Ce n'est pas ce que je veux dire. ": :" n'est pas du tout nécessaire dans vos exemples - c'est peut-être votre habitude, mais il n'est pas du tout nécessaire ici. Le code peut très bien être écrit sans #defane. Essayez juste de le réécrire et voyez si quelque chose devient clair.

Je n'avais ": :" qu'à un seul endroit. Et je n'écris pas de codes à partir de rien. En règle générale, je retire quelque chose de mes codes. Voici :: : il y en avait un par copier-coller. Je n'y avais jamais prêté attention, mais je l'ai supprimée car elle permet de se sentir mieux.

Mais ce n'est pas une question de principe que de ne pas supprimer #define. 99% du code peut être écrit sans lui. Ce n'est pas l'occasion de le retirer.

Et il y a 1% (relativement) où vous ne pouvez pas vous passer de #define !

 
fxsaber:

Je n'avais ": :" qu'à un seul endroit. Et je n'écris pas de codes à partir de rien. En règle générale, je retire quelque chose de mes codes. Voici :: : il y en avait un par copier-coller. Je n'y avais jamais prêté attention, mais je l'ai supprimée car elle permet de se sentir mieux.

Mais ce n'est pas une question de principe que de ne pas supprimer #define. 99% du code peut être écrit sans lui. Ce n'est pas l'occasion de le retirer.

Et il y a 1% (conditionnel) où vous ne pouvez pas vous passer de #define !

Si vous ne copiez pas le tampon :

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];

int handle=INVALID_HANDLE;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);

   handle=ChartIndicatorGet(0,1,ChartIndicatorName(0,1,0));
  }

#define  TOSTRING(A) #A + " = " + (string)A + "\n"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(handle!=INVALID_HANDLE)
     {
      Buffer[rates_total-1]=MathRand();

      double BufferCopy[];
      Print(__FUNCTION__);
      //if(CopyBuffer(handle,0,0,1,BufferCopy)>0)
      //   Print(TOSTRING(BufferCopy[0])+TOSTRING(Buffer[rates_total-1]));
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int Reason)
  {
   Print("#1 OnDeinit");
   if(handle!=INVALID_HANDLE)
     {
      Print("#2 OnDeinit");
      IndicatorRelease(handle);
      Print("#3 OnDeinit");
     }
   Print("#4 OnDeinit");
   return;
  }
//+------------------------------------------------------------------+

alors l'indicateur termine son travail avec succès

2016.09.23 12:11:12.655 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.737 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.737 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.737 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.747 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:13.406 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:13.406 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:13.406 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:14.794 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:15.747 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:16.936 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #1 OnDeinit
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #2 OnDeinit
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #3 OnDeinit
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #4 OnDeinit
 
Vladimir Pastushak:

Pourtant, les méthodes du parent sont vidées dans l'héritier, qui ne devrait pas être vidé.

Ils "décrochent", mais il y aura une erreur de compilation lorsque vous essayerez de les appeler.
Raison: