El EOP para escolares. - página 18

 
Alexey Viktorov:

¿Sí? ¿No crea un objeto nuevo e independiente?

Comprobemos ahora: insertaré líneas como ésta:

//+------------------------------------------------------------------+
//| 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));
  }

así como

//+------------------------------------------------------------------+
//| 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));


y un script de prueba:

//+------------------------------------------------------------------+
//|                                                         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);
  }
//+------------------------------------------------------------------+


Resultado:

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


Se crea un objeto, luego un SEGUNDO (resulta que no hay recreación - se crea uno nuevo), se abre la posición BUY con magia "0" - es decir, el segundo objeto "trade" lo abrió.

Entonces vemos que los dos objetos se destruyen en orden inverso: primero el segundo (con magia "0") y luego el primero (con magia "123").

 
Alexey Viktorov:

¿Sí? ¿No crea un objeto nuevo e independiente?

sí, será una nueva instancia de la claseCTrade

yaún más, el destructor de CTrade será llamadoal salir del void OnTick() y en el siguiente OnTick() el constructor de CTrade será llamado de nuevo

 
Igor Makanu:

sí, habrá una nueva instancia de la claseCTrade

Si se sale del void OnTick(), se llamará al destructor de CTrade, y en el siguiente OnTick() se volverá a llamar al constructor de CTrade.

Sí, me di cuenta inmediatamente después de la respuesta de Artem.

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

OOP para escolares.

Artyom Trishkin, 2019.10.08 20:23

Es exactamente lo mismo que con las variables.

Y el enfoque:

#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:

En mi opinión, mql tiene un conjunto muy estrecho de tareas que necesitan ser resueltas a través de OOP. El lenguaje en sí me parece que no es más que un OOP en C++ o algo así. Y esta POO se ofrece en forma de biblioteca estándar. Y a esta OOP se sugiere añadir, si no, no diría, otra OOP. Y luego otro paso... Bien dicho Warlock, aunque enfadado, pero benévolo, para mis tareas OOP es como un plato giratorio para perros. Y de qué sirve plantear un problema y su posterior realización mediante POO si ese problema sin problemas se puede resolver en estilo procedimental.

Aquí por ejemplo para tomar .mqh de fxsaber`a para escribir códigos para MT5 así como para MT4. Tal vez alguien lo necesite, pero mira quién. Los que no quieren o no pueden dominar mql5. O tomar el iCanvas de Nikolay... olvido su apellido. Parece ser una biblioteca útil, pero no es fácil entenderla, y no hay documentación, ni siquiera una mínima descripción. No es una queja, lo siento Nikolay, es un hecho. Así que, cuando decidí intentar escribir una etiqueta gráfica, fue más fácil escribirla sin referencia a la biblioteca estándar ni a la biblioteca de Nikolai.

En realidad, Alexey, puedes obtener suficiente información sobre iCanvas en la página de descripción en KB.https://www.mql5.com/ru/code/22164. Hay que estudiar bien los comentarios del código. El significado de todas las funciones se intuye a partir de sus nombres.

   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

Pero puede que tengas razón. Debería grabar un vídeo escribiendo algún indicador sencillo pero útil usando iCanvas y explicar visualmente algunas características de esta clase. Todavía hay algunas sutilezas.

Francamente, no me gusta cómo está escrito iCanvas ahora mismo. Quiero arrugarlo, tirarlo a la basura y reescribirlo con un estilo más correcto.

El 70% del código de esta biblioteca consiste en acelerar algunas de las funciones regulares que se necesitan para manejar las coordenadas y el acceso a los datos.

Así, si aplicas esta clase, los gráficos serán más rápidos que si lo haces "de frente" con CCanvas. Esa es su principal característica y ventaja. Y, por supuesto, es realmente más fácil formar gráficos, figuras, comentarios.

También me gustaría añadir, Alexey, que el propósito de muchas publicaciones en CodeBase, incluyendo fxsaber y mis publicaciones es un desinteresado "sólo para compartir - quien lo necesite, lo entenderá". Así que, a menudo, dedicar tiempo a las instrucciones detalladas es simplemente un fastidio.

Especialmente en el foro, he publicado muchos ejemplos cortos e ilustrativos utilizando iCanvas.
Aquí, por ejemplo:
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 realidad, Alexey, puedes obtener suficiente información sobre iCanvas en la página de descripción de KB. https://www.mql5.com/ru/code/22164 Hay que estudiar bien los comentarios del código. El significado de todas las funciones se deduce intuitivamente de sus nombres.

Nikolai, no prestes atención a mis palabras. Hay tan poca gente como yo entre los que estudian programación, si es que no soy el único, que no merece la pena prestarles ninguna atención.

Para aprender los comentarios en el código, primero hay que aprender Aglitsky)).

Si tuviera una necesidad urgente, podría dedicar tiempo a traducir todos los comentarios, tratar de entender la traducción automática y hacer correcciones. Pero no hay tal necesidad.

 
Alexey Viktorov:

Por ejemplo, tome .mqh de fxsaber`a para escribir códigos para MT5 así como para MT4. Tal vez alguien lo necesite, pero mira quién... Los que no quieren o no pueden dominar mql5.

Creo que conozco MQL5 bastante bien, pero tengo la necesidad de una biblioteca de comercio. No me refiero a un estilo MT4, sino a una librería de trading para MT5, que sea cómoda y rápida de trabajar. Y esta librería no tiene fallos durante el comercio real.

Como esa biblioteca no estaba disponible (y no sé si existe) en el dominio público, tuve que desarrollar la mía propia. Para ello tuve que decidir qué tipo de herramienta en forma de conjuntode funciones comerciales iba a inventar. Pedir prestado el conjunto de MT4, como uno bastante bueno. Lo que, como ventaja, permitió no escribir la documentación a la biblioteca y estudiarla. Y otras cosas buenas.

Así que el conocimiento de MQL5 es a veces de alto nivel entre los usuarios.