Erreurs, bugs, questions - page 1679

 
Sergei Vladimirov:
Il doit être invoqué dans les descendants. )
Le but est précisément de ne pas avoir à le faire. Voir mon exemple.
 
fxsaber:
Le but est précisément de ne pas avoir à le faire. Voir mon exemple.
Votre exemple est juste différent, mais le point est le même - le descendant surcharge une méthode virtuelle de la classe de base. Ok, bien, c'est clair pour tout le monde.
 

Erreur dans les tampons indicateurs

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

class BUFFER
{
public:
  double Buffer[];
  
  BUFFER()
  {
    ::SetIndexBuffer(0, this.Buffer);
  }
};

BUFFER* Buf;

void OnInit()
{
  Buf = new BUFFER;
}

void OnDeinit( const int Reason )
{
  delete(Buf);
}

void Restart()
{
  OnDeinit(REASON_PARAMETERS);
  OnInit();
}

#define  PRINT(A) Print(#A + " = " + (string)A);

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[] )
{
  static bool Flag = false;
  
  if (Flag)
    Restart();
  
  Flag = true;
  
  PRINT(ArraySize(Buf.Buffer));
  
  Buf.Buffer[0] = 0; // array out of range
  
  return(rates_total);
}

Résultat dans le journal

2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      array out of range in 'Test.mq5' (56,13)
2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 0
2016.09.12 17:21:54.828 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 2067

Le débogueur s'entête à dire que Buf.Buffer est TOUJOURS un tableau dynamique[0],I. C'est un tampon indicateur. Mais d'une taille nulle, comme il s'avère.

Il s'avère que le débogueur écrit plus dans le journal que la version. Le communiqué ne fait pas état de telles choses

2016.09.12 17:25:08.706 Test (RTS-9.16,M1)      Indicator buffer #0  detached
Est-il possible de définir le tampon de l'indicateur dans MT5 une seule fois ?
 

Pourquoi les complications, si ce n'est pas un secret ? En dehors de l'intérêt de la recherche, bien sûr.

Au lieu de cela (ce qui, soit dit en passant, est faux en principe, car la réinitialisation peut être nécessaire pendant le fonctionnement, et pas seulement au démarrage) :

  static bool Flag = false;
  
  if (Flag)
    Restart();
  
  Flag = true;

Comme ça :

if(prev_calculated == 0)
   ArrayInitialize(Buf.Buffer, 0.0);
 
Sergei Vladimirov:

Pourquoi les complications, si ce n'est pas un secret ? En dehors de l'intérêt de la recherche, bien sûr.

J'ai des cas où un tableau dynamique, fixé comme un tampon indicateur, est supprimé. Ensuite, vous devez à nouveau créer un tableau dynamique et l'affecter comme tampon d'indicateur. Le débogueur montre qu'il est affecté. Mais seule sa taille est nulle. Il s'agit d'une erreur.

Le problème est ancien, en fait.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Comment masquer le message "Indicator buffer #x detached" (tampon indicateur #x détaché)

Konstantin Ivanov, 2015.02.17 21:18

Dans mon indicateur, je stocke les tableaux-buffers dans des instances de l'objet.
Lors de la suppression d'un objet dans OnDeinit(), un message est affiché pour tous les tableaux liés aux tampons (SetIndexBuffer()) :

"Indicateur tampon #x détaché"

Comment détacher un tableau d'un tampon sans ce message ?
Ou comment cacher ce message ?

J'ai trouvé la branche http://forum.mql4.com/63975, mais l'option suggérée pour sauvegarder les tampons dans un contexte global ne fonctionne pas pour moi.


L'option permettant de sauvegarder les tampons dans un contexte global ne fonctionne pas non plus pour moi. Il est intéressant de noter qu'il fonctionne dans MT4.

 

article Un guide pas à pas pour écrire des EAs en MQL5 pour les débutants Il y a du code :


N'est-il pas nécessaire de diviser à trois chiffres ?

 
Aleksey Rodionov:

article Un guide pas à pas pour écrire des EAs en MQL5 pour les débutants Il y a du code :


N'est-il pas nécessaire de diviser à trois chiffres ?

Il s'agit d'un rudiment laissé par l'EURUSD (5 chiffres) et l'USDJPY (3 chiffres). Il n'y a pas d'erreur, mais il est préférable de ne pas le faire, surtout pour les débutants.
 
Je dois définir une interface unique pour toutes les classes héritées. Il devrait toujours avoir la méthode Init. Mais Init est comme un constructeur dupliqué, donc les variantes des paramètres d'entrée ne peuvent pas être définies à l'avance. Comment spécifier une telle interface ?
 
MK, pourquoi ne pas rendre la syntaxe suivante acceptable pour les fonctions importées:
#import ...
 int send(SOCKET s, void &buf[], int len, int flags);
 int send(SOCKET s, void &buf, int len, int flags);
#import

Maintenant, on doit faire des choses moches :

#import ...
 int send(SOCKET s, char &buf[], int len, int flags);
 int send(SOCKET s, int &buf, int len, int flags);
 int send(SOCKET s, char &buf, int len, int flags);
 int send(SOCKET s, Cpoint &buf[], int len, int flags);
 ...
#import

Je ne le suggère pas pour les fonctions internes en ligne, mais pour les fonctions importées, cela devrait être sûr.

 

Dans le journal de bord.

2016.09.12 22:20:37.728 Books   invalid book item[RTS-9.16,buy,99040.00000,-4]
BCS-MetaTrader5, réel, 1415. C'est arrivé en passant d'un compte de démonstration à un compte réel. Aucun conseiller expert ou indicateur n'a été exécuté. La fenêtre de la Dummy était ouverte.