Erreurs, bugs, questions - page 2225

 
Nikolai Semko:

Ça ne servira à rien. Surtout si la minuterie est déjà en marche avant d'être activée dans la classe, par exemple à des intervalles de quelques heures ou jours. Alors une telle classe ruinera toute la logique du programme.

Idéalement, tout travail avec le timer doit être enveloppé dans une classe, et toutes les parties d'un programme où le timer est nécessaire, doivent l'utiliser à travers cette classe.

Sinon, il est impossible d'en assurer le suivi.

 
Andrey Khatimlianskii:

Idéalement, tout le travail de minuterie devrait être enveloppé dans une classe, et toutes les parties du programme qui ont besoin d'une minuterie devraient l'utiliser à travers cette classe.

Sinon, il est impossible d'en assurer le suivi.

avec sagesse

 
Nikolai Semko:

sensible

Il serait logique de faire cela au niveau de la plate-forme et de nous permettre d'utiliser plusieurs minuteries pour différents besoins.)

 
Andrey Khatimlianskii:

Idéalement, tout le travail de minuterie devrait être enveloppé dans une classe, et toutes les parties du programme qui ont besoin d'une minuterie devraient l'utiliser à travers cette classe.

Sinon, vous ne serez pas en mesure d'en assurer le suivi.

Et dans cette classe, vous pouvez désactiver les fonctions OnTimer, EventSetMillisecondTimer, EventSetTimer, EventKillTimer, comme l'a fait Faber dans Init_Sync.mqh. Et puis le contrôle total. Bonne idée. Merci.

 
Nikolai Semko:

Vous pouvez ajouter OnTimer, EventSetMillisecondTimer, EventSetTimer, EventKillTimer à cette classe, comme Faber l'a fait dans Init_Sync.mqh. Et puis le contrôle total. Bonne idée. Merci.

J'ai hâte de voir KB ;)

 
Andrey Khatimlianskii:

Il serait logique de faire cela au niveau de la plateforme et de nous permettre de faire fonctionner plusieurs minuteries pour des besoins différents).

Bien...
Ce serait beaucoup plus facile. Mais les moyens faciles sont pour les gars, et les maris ne cherchent pas les moyens faciles :))

 
Andrey Khatimlianskii:

J'attends avec impatience le QB ;)

J'espère pouvoir mettre la main dessus un jour...

 
Dmitri Custurov:

J'ai essayé à la fois le feng shui et ceci - le résultat est le même. Le fait est que tout fonctionne 99% du temps, et j'ai besoin de 100%. Pour l'instant, l'essentiel pour moi est de trouver la bonne logique, et je pourrai faire la beauté plus tard.

J'ai oublié d'ajouter seulement que l'erreur mentionnée ci-dessus apparaît dans le testeur. Lorsque je l'ouvre sur un graphique, je ne le remarque pas ou je dois simplement attendre l'extremum requis où l'erreur se reproduira.

Les vrais doivent être comparés correctement

/*!
   \brief   Сравнение вещественных double
   \return true в случае равно, иначе false
*/
bool CompDouble(const double a_one,const double a_two) {
   if(fabs(a_one - a_two) <= DBL_EPSILON * fmax(fabs(a_one), fabs(a_two)))
      return true;    // числа равны с относительной точностью DBL_EPSILON
//---
   return false;
}
/*!
   \brief   Сравнение вещественных float
   \return true в случае равно, иначе false
*/
bool CompFloat(const float a_one,const float a_two) {
   if(fabs(a_one - a_two) <= FLT_EPSILON * fmax(fabs(a_one), fabs(a_two)))
      return true;    // числа равны с относительной точностью FLT_EPSILON
//---
   return false;
}
 
Merci pour le conseil. Ça marche. J'étais déjà inquiet au sujet de OrderSelect.
 
Andrey Khatimlianskii:

En attente dans le KB ;)

La solution s'est avérée beaucoup plus simple que je ne le pensais.

Un exemple d'indicateur, dans lequel vous pouvez connaître l'état de la minuterie. Il suffit d'ajouter une ligne #include <Timer.mqh> et OnTimer() sous contrôle.

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#include  <Timer.mqh>

int OnInit()
  {
   if(iTimer.On) Print("Таймер включен, период таймера = "+IntegerToString(iTimer.curPer)+" миллисеккунд"); else Print("Таймер выключен");
   EventSetMillisecondTimer(2201);
   return(INIT_SUCCEEDED);
  }
////////////////////////////////////////////  
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   return(rates_total);
  }
///////////////////////////////////////////// 
void OnTimer()
  {
   if(iTimer.On) Print("Таймер включен, период таймера = "+IntegerToString(iTimer.curPer)+" миллисеккунд"); else Print("Таймер выключен");
   EventKillTimer();
   if(iTimer.On) Print("Таймер включен, период таймера = "+IntegerToString(iTimer.curPer)+" миллисеккунд"); else Print("Таймер выключен");
  }

Et voici le cours lui-même :

//+------------------------------------------------------------------+
//|                                                        Timer.mqh |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                         https://www.mql5.com/ru/users/nikolay7ko |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Nikolay Semko"
#property link      "https://www.mql5.com/ru/users/nikolay7ko"
#property link      "SemkoNV@bk.ru"  

///////////////////////////////////////////////////////////////////////////
class CTimer
  {
public:
                     CTimer() {curPer=0; On=false;}
                    ~CTimer() {}
   bool              On;
   int               curPer;
   void              AddNewProgTimerSec(int per){EventSetTimer(per); curPer=per*1000; On=true;}
   void              AddNewProgTimerMilliSec(int per) {EventSetMillisecondTimer(per); curPer=per; On=true;}
   void              KillProgTimer() {EventKillTimer(); curPer=0; On=false;}
  };
///////////////////////////////////////////////////////////////////////////
static CTimer iTimer;

#define EventSetMillisecondTimer iTimer.AddNewProgTimerMilliSec
#define EventSetTimer iTimer.AddNewProgTimerSec
#define EventKillTimer iTimer.KillProgTimer
Le résultat :
2018.07.12 21:10:37.177	TestСTimer (EURUSD.m,M5)	Таймер выключен
2018.07.12 21:10:39.385	TestСTimer (EURUSD.m,M5)	Таймер включен, период таймера = 2201 миллисеккунд
2018.07.12 21:10:39.385	TestСTimer (EURUSD.m,M5)	Таймер выключен
Dossiers :
Timer.mqh  3 kb