L'EOP pour les écoliers. - page 18

 
Alexey Viktorov:

Oui ? Cela ne crée-t-il pas un nouvel objet indépendant ?

Vérifions maintenant - je vais insérer des lignes comme ceci :

//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CTrade::CTrade(void) : m_async_mode(false),
   m_magic(0),
   m_deviation(10),
   m_type_filling(ORDER_FILLING_FOK),
   m_log_level(LOG_LEVEL_ERRORS)

  {
   SetMarginMode();
//--- initialize protected data
   ClearStructures();
//--- check programm mode
   if(MQL5InfoInteger(MQL5_TESTING))
      m_log_level=LOG_LEVEL_ALL;
   if(MQL5InfoInteger(MQL5_OPTIMIZATION))
      m_log_level=LOG_LEVEL_NO;
//---
   Print(__FUNCTION__,", magic ",IntegerToString(m_magic));
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CTrade::~CTrade(void)
  {
//---
   Print(__FUNCTION__,", magic ",IntegerToString(m_magic));
  }

ainsi que

//+------------------------------------------------------------------+
//| Buy operation                                                    |
//+------------------------------------------------------------------+
bool CTrade::Buy(const double volume,const string symbol=NULL,double price=0.0,const double sl=0.0,const double tp=0.0,const string comment="")
  {
//---
   Print(__FUNCTION__,", magic ",IntegerToString(m_magic));


et un script de test :

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
CTrade trade;   // Объект № 1 в глобальной области программы
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   trade.SetExpertMagicNumber(123);
//---
   CTrade trade;
   trade.Buy(0.1);
  }
//+------------------------------------------------------------------+


Résultat :

2019.10.09 11:25:44.645 Test_ru (EURUSD,H1)     CTrade::CTrade, magic 0
2019.10.09 11:25:44.645 Test_ru (EURUSD,H1)     CTrade::CTrade, magic 0
2019.10.09 11:25:44.645 Test_ru (EURUSD,H1)     CTrade::Buy, magic 0
2019.10.09 11:25:44.645 Test_ru (EURUSD,H1)     CTrade::OrderSend: instant buy 0.10 EURUSD at 1.09862 [auto trading disabled by client]
2019.10.09 11:25:44.645 Test_ru (EURUSD,H1)     CTrade::~CTrade, magic 0
2019.10.09 11:25:44.645 Test_ru (EURUSD,H1)     CTrade::~CTrade, magic 123


Un objet est créé, puis un SECOND (il s'avère qu'il n'y a pas de recréation - un nouveau est créé), la position BUY est ouverte avec la magie "0" - c'est-à-dire que le second objet "trade" l'a ouverte.

On constate alors que les deux objets sont détruits dans l'ordre inverse : d'abord le second (avec la magie "0") puis le premier (avec la magie "123").

 
Alexey Viktorov:

Oui ? Cela ne crée-t-il pas un nouvel objet indépendant ?

Oui, il s'agira d'une nouvelle instance de la classeCTrade.

etmême plus, le destructeur de CTrade sera appeléà la sortie de void OnTick() et au prochain OnTick() le constructeur de CTrade sera appelé à nouveau.

 
Igor Makanu:

oui, il y aura une nouvelle instance de la classeCTrade

Si le void OnTick() est quitté, le destructeur de CTrade sera appelé, et le prochain OnTick() appellera à nouveau le constructeur de CTrade.

Oui, je m'en suis rendu compte immédiatement après la réponse d'Artem.

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

OOP pour les écoliers.

Artyom Trishkin, 2019.10.08 20:23

C'est exactement la même chose qu'avec les variables.

Et la concentration :

#include <Trade\Trade.mqh>
CTrade trade;   // Объект trade в глобальной области программы

int OnInit()
{
 trade.SetExpertMagicNumber(123);
}

void OnTick()
{
 CTrade *trade_ptr=GetPointer(trade);  // Указатель на объект trade
 trade_ptr.Buy(0.1);
}

 
Alexey Viktorov:

À mon avis, mql a un ensemble très restreint de tâches qui doivent être résolues par la POO. Le langage lui-même me semble n'être rien de plus qu'un OOP en C++ ou autre. Et cette POO est proposée sous la forme d'une bibliothèque standard. Et à cette OOP, il est suggéré d'ajouter, sinon je ne dirais pas, une autre OOP. Et puis une autre étape... Bien dit Warlock, bien que fâché, mais bienveillant, pour mes tâches OOP est comme une platine de chien. Et à quoi bon définir un problème et sa réalisation ultérieure au moyen de la POO si ce problème sans problème peut être résolu en style procédural.

Ici par exemple prendre .mqh de fxsaber`a pour écrire des codes pour MT5 ainsi que pour MT4. Peut-être que quelqu'un en a besoin, mais regarde qui. Ceux qui ne veulent ou ne peuvent absolument pas maîtriser le mql5. Ou prenez iCanvas de Nikolay ... j'ai oublié son nom de famille. Il semble que ce soit une bibliothèque utile, mais il n'est pas facile de la comprendre, et il n'y a pas de documentation, même une petite description. Ce n'est pas une plainte, désolé Nikolay, c'est un fait. Ainsi, lorsque j'ai décidé d'essayer d'écrire une étiquette graphique, il était plus facile de l'écrire sans faire référence à la bibliothèque standard ou à la bibliothèque de Nikolaï.

En fait, Alexey, tu peux obtenir suffisamment d'informations sur iCanvas en consultant la page de description de KB.https://www.mql5.com/ru/code/22164. Vous devez étudier attentivement les commentaires du code. La signification de toutes les fonctions est intuitive à partir de leur nom.

   double            X(double bar);        // The X coordinate by the bar number. The bar number must be of type double, otherwise, the bar will be interpreted as time.
   double            X(datetime Time);     // The X coordinate by the time.
   double            Y(double Price);      // The Y coordinate by the price.
   double            Price(int y);         // Price by the Y coordinate
   double            Bar(int x);           // bar number by coordinate X                                                                      
   datetime          TimePos(int x);       // time by coordinate X 
   double            Close(int x);     
   double            Open(int x);    
   double            High(int x);     
   double            Low(int x);     
 
   void              Comm(string text);                 // Print comment
   void              TextPosition(int x,int y);         // Setting the XY position for comment output in pixels
   void              TextPosition(double x,double y);   // Setting the XY position for outputting comments as a percentage of the width and height of the window
   void              CurentFont(string FontName="Courier New",int size=18,int LineStep=20,color clr=clrDarkOrchid,double transp=1.0);  // Set font options for comment. LineStep - step between lines. transp - transparency from 0 to 1
   void              LineD(double x1,double y1,double x2,double y2,const uint clr); // тоже самое что и Line в CCanvas, только без глюков и с double координатами
   int               TextPosX;      // Position X for comment text
   int               TextPosY;      // Position Y for comment text
   int               StepTextLine;  // line spacing for comment
   uint              TextColor;     // Font color for comment

Mais tu pourrais avoir raison. Je devrais enregistrer une vidéo de l'écriture d'un indicateur simple mais utile en utilisant iCanvas et expliquer visuellement certaines caractéristiques de cette classe. Il y a encore quelques subtilités.

Pour être franc, je n'aime pas la façon dont iCanvas est écrit actuellement. Je veux le froisser, le jeter à la poubelle et le réécrire dans un style plus correct.

70% du code de cette bibliothèque consiste à accélérer certaines des fonctions régulières nécessaires pour gérer les coordonnées et l'accès aux données.

Ainsi, si vous appliquez cette classe, les graphiques seront plus rapides que si vous le faites "de front" avec CCanvas. C'est sa principale caractéristique et son avantage. Et, bien sûr, il est vraiment plus facile de former des graphiques, des figures, des commentaires.

Je voudrais également ajouter, Alexey, que l'objectif de nombreuses publications dans CodeBase, y compris fxsaber et mes publications est un désintéressement "juste pour partager - qui en a besoin, le comprendra". Si souvent, passer du temps sur des instructions détaillées est tout simplement une perte de temps.

Dans le forum notamment, j'ai posté de nombreux exemples courts et illustratifs utilisant iCanvas.
Ici, par exemple :
https://www.mql5.com/ru/code/25929

https://www.mql5.com/ru/code/25113

https://www.mql5.com/ru/code/25414

https://www.mql5.com/en/code/24798

https://www.mql5.com/ru/forum/227736/page41#comment_13259627

https://www.mql5.com/ru/forum/227736/page24#comment_12836622

https://www.mql5.com/en/forum/323629#comment_13442470

https://www.mql5.com/ru/forum/321704#comment_13131995

https://www.mql5.com/ru/forum/317257/page3#comment_12341593

https://www.mql5.com/en/forum/229521/page2#comment_10258148


Easy Canvas
Easy Canvas
  • www.mql5.com
Данная библиотека и класс iCanvas упростит написание программ с применением Canvas. Вот пример простого индикатора с применением данной библиотеки и его демонстрация. Обратите внимание, что в данном примере в теле индикатора отсутствует функция обработки событий OnChartEvent. Но она также может и присутствовать. Особенности данной библиотеки...
 
Nikolai Semko:

En fait, Alexey, tu peux obtenir suffisamment d'informations sur iCanvas en consultant la page de description de la KB. https://www.mql5.com/ru/code/22164 Vous devez étudier attentivement les commentaires du code. La signification de toutes les fonctions est intuitivement claire à partir de leur nom.

Nikolaï, ne prête pas attention à mes paroles. Il y a si peu de gens comme moi parmi ceux qui étudient la programmation, si je ne suis pas le seul, que cela ne vaut pas la peine de leur prêter attention du tout.

Pour moi, pour apprendre les commentaires en code, il faut d'abord apprendre Aglitsky)).

Si j'avais un besoin urgent, je pourrais passer du temps et traduire tous les commentaires, essayer de comprendre la traduction automatique et faire des corrections. Mais ce n'est pas nécessaire.

 
Alexey Viktorov:

Par exemple, prenez le .mqh de fxsaber`a pour écrire des codes pour MT5 ainsi que pour MT4. Peut-être que quelqu'un en a besoin, mais regardez qui... Ceux qui ne veulent pas ou ne peuvent absolument pas maîtriser le mql5.

Je pense que je connais assez bien MQL5, mais j'ai besoin d'une bibliothèque de trading. Je ne parle pas du style MT4, mais d'une bibliothèque de trading pour MT5, qui serait confortable et rapide à utiliser. Et cette bibliothèque ne présente pas de bogues pendant les transactions réelles.

Comme une telle bibliothèque n'était pas disponible (et je ne sais pas si elle existe) dans le domaine public, j'ai dû développer la mienne. À cette fin, j'ai dû décider quel type d'outil, sous la forme d'un ensemble defonctions commerciales, j'allais inventer. J'ai emprunté le jeu MT4, qui est assez bon. Ce qui, en prime, a permis de ne pas écrire la documentation à la bibliothèque et de l'étudier. Et d'autres goodies.

Ainsi, la connaissance de MQL5 est parfois à un niveau élevé parmi les utilisateurs.