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

 
En principe, c'est le cas, l'erreur vient probablement du fait que le handle de mon indicateur est créé dans la fonction OnTick et que les données sont copiées immédiatement sur le même tick. J'ai compris pendant la nuit, maintenant je vais essayer de transférer les poignées des indicateurs à la fonction OnInit.
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
sss20192:
L'erreur se situe dans le handle de l'indicateur créé dans la fonction OnTick et les données sont copiées sur le même tick. J'ai compris pendant la nuit, maintenant je vais essayer de transférer les poignées des indicateurs à la fonction OnInit.

Ça n'a pas marché. Voici le code maintenant


#property version   "1.00"

input int                  InpFastEMA=12;                // Fast EMA period
input int                  InpSlowEMA=26;                // Slow EMA period
input int                  InpSignalMA=9;                // Signal MA period
input ENUM_APPLIED_PRICE   InpAppliedPrice=PRICE_CLOSE;  // Applied price
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int Handle1, Handle2, Handle3;
double MacdArray[];

int OnInit()
  {
//---
  Handle1 = iMACD(_Symbol, PERIOD_M5, InpFastEMA, InpSlowEMA, InpSignalMA, InpAppliedPrice);
  Handle2 = iMACD(_Symbol, PERIOD_M15, InpFastEMA, InpSlowEMA, InpSignalMA, InpAppliedPrice);
  Handle3 = iMACD(_Symbol, PERIOD_H1, InpFastEMA, InpSlowEMA, InpSignalMA, InpAppliedPrice);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
        CopyBuffer(Handle1, 0, 1, 1, MacdArray);
        Print(MacdArray[0], " ", GetLastError());
        
        CopyBuffer(Handle2, 0, 1, 1, MacdArray);
        Print(MacdArray[0], " ", GetLastError());
        
        CopyBuffer(Handle3, 0, 1, 1, MacdArray);
        Print(MacdArray[0], " ", GetLastError());
  }
//+------------------------------------------------------------------+

Les messages suivants apparaissent dans le journal

2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988e-005 0

2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988e-005 0

2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988e-005 0

Et c'est toujours comme ça. Il ne semble pas y avoir d'erreur de copie.

 
sss20192: Cela n'a pas aidé. Voici le code

Mais jusqu'à présent, vous n'avez pas de vérification de la création réussie des poignées, ni de vérification du calcul réussi des indicateurs et de la copie. L'idée de déplacer l'initialisation des handles vers OnInit() est correcte.

De plus, ajoutez la ligne Print(MacdArray[0]) au début de OnTick() - pour voir quelle valeur merdique est contenue dans le tableau avant de commencer à copier les tampons.

A ajouter. Bien sûr, l'utilisation de GetLastError() après la fonction elle-même peut être une particularité du style de programmation. Si je ne me trompe pas, une valeur nulle de GetLastError() ne signifie pas toujours que la fonction a fonctionné avec succès.

 
Yedelkin:
Mais jusqu'à présent, vous n'avez pas de vérification de la création réussie des poignées, ni de vérification du calcul réussi des indicateurs et de la copie. L'idée de déplacer l'initialisation des handles vers OnInit() est correcte.
Mais seulement pour la première fois. Si, à un autre endroit du programme, il s'avère qu'une poignée n'est pas valide, nous devons essayer de l'obtenir à nouveau. Par conséquent, nous ne pouvons pas dire que le code écrit pour obtenir les handles dans OnInit() résoudra complètement le problème et sera 100% correct. ))
 
J'ai vérifié combien de données ont été copiées avec la fonction CopyBuffer, elle écrit toujours 1. Et il n'y a pas d'erreur, mais les données sont toujours fausses.
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyBuffer - Документация по MQL5
 

tol64

Yedelkin : L'idée de déplacer l'initialisation des handles vers OnInit() est bonne.

Mais seulement pour la première fois. Si, à un autre endroit du programme, il s'avère qu'une poignée n'est pas valide, vous devez essayer de l'obtenir à nouveau. Par conséquent, nous ne pouvons pas dire que le code écrit pour obtenir les handles dans OnInit() résoudra complètement le problème et sera 100% correct. ))

Voulez-vous dire que l'idée de déplacer l'initialisation des handles de OnTick() à OnInit() est mauvaise en soi ?
 
sss20192:
J'ai vérifié combien de données ont été copiées avec la fonction CopyBuffer, elle écrit toujours 1. Et il n'y a pas d'erreur, mais les données sont toujours fausses.

J'ai ce résultat de ce code dans le testeur :

//---

La seule chose que j'ai faite avant le test a été de convertir les valeurs de l'indicateur avant la sortie dans le journal :

Print(DoubleToString(MacdArray[0],Digits())," ",GetLastError());
 
Yedelkin:
Êtes-vous en train de dire que l'idée de déplacer l'initialisation du gestionnaire vers OnInit() depuis OnTick() est mauvaise en soi ?
Si c'est seulement dans OnInit() et nulle part ailleurs, alors oui - c'est faux. La première fois que nous essayons d'obtenir un handle dans OnInit(). Ensuite, avant chaque tentative d'obtention des données de l'indicateur, nous vérifions si la poignée est valide. S'il est valide, nous obtenons les données, sinon, nous essayons à nouveau d'obtenir l'identifiant.
 
tol64:

J'ai obtenu ce résultat avec ce code dans le testeur :

//---

La seule chose que j'ai faite avant le test a été de convertir simplement les valeurs de l'indicateur avant de les sortir dans le journal :

Ooh, c'est génial ! Merci beaucoup ! Troisième jour de résolution du problème)
 
tol64:
Yedelkin: Êtes-vous en train de dire que l'idée de déplacer l'initialisation des handles de OnTick() à OnInit() est mauvaise en soi ?
Si c'est seulement dans OnInit() et nulle part ailleurs, oui - faux. La première fois que nous essayons d'obtenir un handle dans OnInit(). Ensuite, avant chaque tentative d'obtention des données de l'indicateur, nous vérifions si la poignée est valide. S'il est valide, nous obtenons les données, sinon, nous essayons à nouveau d'obtenir l'identifiant.

Et sans "si" ? Et par rapport à cette situation particulière ? Le handle de l'indicateur a été créé dans la fonction OnTick lors de chaque tick, et les données sont copiées lors du même tick. Cela signifie que le même manche d'indicateur a été demandé à chaque fois, sans contrôle de validité/invalidité. Dans ce contexte, allez-vous continuer à soutenir que l'idée de transférer l'initialisation des handles de OnTick() à OnInit() est mauvaise en soi ?

PS. Il semble que vous ayez aidé l'homme, donc la question peut être considérée comme épuisée.