O POE para crianças em idade escolar. - página 18

 
Alexey Viktorov:

Sim? Ele não cria um objeto novo e independente?

Vamos verificar agora - vou inserir linhas como esta:

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

bem 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));


e um roteiro de teste:

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


Um objeto é criado, depois um SEGUNDO objeto (acontece que não há recreação - um novo objeto é criado), a posição COMPRA é aberta com o mágico "0" - ou seja, o segundo objeto "comércio" o abre.

Depois vemos que os dois objetos são destruídos em ordem inversa: primeiro o segundo (com magia "0") e depois o primeiro (com magia "123").

 
Alexey Viktorov:

Sim? Ele não cria um objeto novo e independente?

Sim, será uma nova instância da classeCTrade

eainda mais, o CTrade destructor será chamadona saída do OnTick() vazio e no próximo OnTick() o CTrade construtor será chamado novamente

 
Igor Makanu:

sim, haverá uma nova instância da classeCTrade

Se o OnTick() vazio sair, o destruidor do CTrade será chamado, e o próximo OnTick() chamará novamente o construtor do CTrade.

Sim, eu percebi que imediatamente após a resposta da Artem.

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

OOP para crianças em idade escolar.

Artyom Trishkin, 2019.10.08 20:23

É exatamente o mesmo que com as variáveis.

E o foco:

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

Na minha opinião, a mql tem um conjunto muito estreito de tarefas que precisam ser resolvidas através do OOP. O idioma em si me parece ser nada mais do que um OOP em C++ ou algo assim. E este OOP é oferecido na forma de uma biblioteca padrão. E a este OOP é sugerido acrescentar, caso contrário eu não diria, outro OOP. E depois outro passo... Disse Warlock, embora zangado, mas benevolente, para minhas tarefas OOP é como uma mesa giratória para cães. E de que adianta colocar um problema e sua posterior realização por meio do OOP se este problema sem problemas pode ser resolvido em estilo processual.

Aqui, por exemplo, para pegar .mqh do fxsaber`a para escrever códigos para MT5, bem como para MT4. Talvez alguém precise disso, mas veja quem. Aqueles que não querem ou absolutamente não podem dominar o mql5. Ou tome iCanvas de Nikolay ... Esqueci seu sobrenome. Parece ser uma biblioteca útil, mas não é fácil entendê-la, e não há documentação, mesmo uma pequena descrição. Não é uma reclamação, desculpe Nikolay, é um fato. Assim, quando decidi tentar escrever uma etiqueta gráfica, foi mais fácil escrevê-la sem referência à biblioteca padrão ou à biblioteca do Nikolai.

Na verdade, Alexey, você pode obter informações suficientes sobre iCanvas a partir da página de descrição em KB.https://www.mql5.com/ru/code/22164. Você precisa estudar cuidadosamente os comentários do código. O significado de todas as funções é intuitivo a partir de seus nomes.

   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

Mas talvez você esteja certo. Eu deveria gravar um vídeo de escrita de algum indicador simples, mas útil, usando iCanvas e explicar visualmente algumas características desta classe. Ainda existem algumas sutilezas.

Francamente falando, não gosto como o iCanvas está escrito neste momento. Quero amassá-lo, jogá-lo no lixo e reescrevê-lo em um estilo mais correto.

70% do código desta biblioteca é sobre a aceleração de algumas das funções regulares que são necessárias para lidar com coordenadas e acesso aos dados.

Portanto, se você aplicar esta classe, os gráficos serão mais rápidos do que se você o fizer "de frente" com CCanvas. Essa é sua principal característica e vantagem. E, é claro, é realmente mais fácil formar gráficos, figuras, comentários.

Gostaria também de acrescentar, Alexey, que o propósito de muitas publicações na CodeBase, incluindo o fxsaber e minhas publicações é um altruísta "só para compartilhar - quem precisa, irá entendê-lo". Assim, muitas vezes gastar tempo com instruções detalhadas é simplesmente uma chatice.

Especialmente no fórum, postei muitos exemplos curtos e ilustrativos usando o iCanvas.
Aqui, por exemplo:
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:

Na verdade, Alexey, você pode obter informações suficientes sobre o iCanvas na página de descrição da KB. https://www.mql5.com/ru/code/22164 Você tem que estudar cuidadosamente os comentários do código. O significado de todas as funções é intuitivamente claro a partir de seus nomes.

Nikolai, não preste atenção às minhas palavras. Há tão poucas pessoas como eu entre aqueles que estudam programação, se eu não sou o único, que não vale a pena prestar atenção neles.

Para que eu possa aprender os comentários em código, é preciso primeiro aprender Aglitsky)).

Se eu tivesse uma necessidade urgente eu poderia gastar tempo e traduzir todos os comentários, tentar entender a tradução automática e fazer correções. Mas não há tal necessidade.

 
Alexey Viktorov:

Por exemplo, pegue .mqh do fxsaber`a para escrever códigos para MT5, bem como para MT4. Talvez alguém precise disso, mas olha quem... Aqueles que não querem ou absolutamente não podem dominar o mql5.

Acho que conheço muito bem a MQL5, mas tenho necessidade de uma biblioteca comercial. Não estou falando do estilo MT4, mas de uma biblioteca comercial para o MT5, que seria confortável e rápida de se trabalhar. E esta biblioteca não tem bugs durante o comércio real.

Como tal biblioteca não estava disponível (e não sei se ela existe) no domínio público, tive que desenvolver minha própria biblioteca. Para isso, eu tinha que decidir que tipo de ferramenta na forma de um conjuntode funções comerciais eu iria inventar. Tomou emprestado o conjunto MT4, como um conjunto muito bom. O que, como bônus, tornou possível não escrever a documentação para a biblioteca e estudá-la. E outras guloseimas.

Portanto, o conhecimento da MQL5 às vezes está em um alto nível entre os usuários.