ООП для школьников. - страница 18

 
Alexey Viktorov:

Да? А разве не создаёт новый, независимый объект?

Сейчас проверим - вставлю такие строки:

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

а также

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


и проверочный скрипт:

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


Результат:

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


Создался один объект, затем ВТОРОЙ (оказалось пересоздания нет - создаётся новый), позиций BUY открывается с magic "0" - то есть её открыл второй объект "trade".

Затем видно, что уничтожаются два объекта в обратном порядке: сначала второй (с magic "0"), а затем первый (с magic "123").

 
Alexey Viktorov:

Да? А разве не создаёт новый, независимый объект?

да, будет новый экземпляр класса CTrade

области видимости как у обычной переменной, и даже более при выходе из  void OnTick() будет вызван деструктор CTrade , а при следующем OnTick() будет опять вызван конструктор CTrade 

 
Igor Makanu:

да, будет новый экземпляр класса CTrade

области видимости как у обычной переменной, и даже более при выходе из  void OnTick() будет вызван деструктор CTrade , а при следующем OnTick() будет опять вызван конструктор CTrade 

Да я понял это сразу после ответа Артёма.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

ООП для школьников.

Artyom Trishkin, 2019.10.08 20:23

Всё точно так же, как и с переменными.

И фокус:

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

На мой взгляд, в mql очень узок набор задач которые надо решать посредством ООП. Сам язык, мне кажется, ничто иное как ООП на С++ или ещё чего-то. И в это ООП предлагается ООП в виде стандартной библиотеки. А к этому ООП от ООП предлагается впендюрить, иначе не скажешь, ещё ООП. А потом ещё одну ступень... Правильно сказал Колдун, хоть и злой, но доброжелательный, для моих задач ООП как собаке поворотка. И какой прок от постановки задачи и последующей реализации её посредством ООП если эту задачу без проблем можно решить в процедурном стиле.

Вот к примеру взять .mqh от fxsaber`a для написания кодов для МТ5 так-же как для МТ4. Может кому-то это и надо, но посмотрите кому... Тому кто не хочет или абсолютно не может освоить mql5. Или взять iCanvas у Николая ..., забыл фамилию, ну вы поняли. Вроде-бы полезная библиотека, но в ней разобраться не просто, а никакой документации, хотя-бы маломальского описания нет. Это не претензия, извини Николай, это факт. Так-что когда я решил попробовать написание графической метки, мне оказалось проще написать не обращаясь ни к стандартной библиотеке, ни к библиотеке Николая.

На самом деле, Алексей, информации про iCanvas можно достаточно почерпнуть на странице описания в КБ. https://www.mql5.com/ru/code/22164. Нужно внимательно изучить комментарии в коде. Смысл всех функций интуитивно понятен из их имен.

   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

Но, возможно, ты и прав. Надо записать видео с написанием какого-нибудь простого, но полезного индикатора с использованием iCanvas и объяснить наглядно некоторые особенности данного класса. Нюансы все же есть.

Правда, если честно, то, как написан iCanvas, мне сейчас самому жутко не нравиться. Хочется его скомкать, выкинуть в корзину и написать заново более правильным стилем.

70% кода в этой библиотеке - это ускорение некоторых штатных функций, которые нужны для работы с координатами и доступом к данным.

Поэтому, если применять этот класс, то графика будет быстрее, чем если это делать "в лоб" с CCanvas. В этом его главная фишка и преимущество. Ну и, конечно, реально проще с ним формировать графики, фигуры, комментарии.

Хочется еще добавить, Алексей, что цель публикаций многих в CodeBase, в том числе fxsaber и моих публикаций - это бескорыстное "просто поделиться - кому нужно, тот разберется". Поэтому часто тратить время на подробные инструкции просто влом.

Тем более на форуме я много публиковал кототкие и наглядные примеры с применением iCanvas.
Вот, например:
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:

На самом деле, Алексей, информации про iCanvas можно достаточно почерпнуть на странице описания в КБ. https://www.mql5.com/ru/code/22164. Нужно внимательно изучить комментарии в коде. Смысл всех функций интуитивно понятен из их имен.

Николай, не обращай на мои слова никакого внимания. Таких как я среди изучающих программирование, если я не один, то их так мало, что вообще не сто́ит на них обращать внимание.

Для меня чтобы изучить комментарии в коде, надо сначала изучить аглицкий язык.)))

Была-бы острая необходимость, можно было-бы потратить время и перевести все комментарии, постараться понять машинный перевод и подправить. Но ведь нет такой необходимости.

 
Alexey Viktorov:

Вот к примеру взять .mqh от fxsaber`a для написания кодов для МТ5 так-же как для МТ4. Может кому-то это и надо, но посмотрите кому... Тому кто не хочет или абсолютно не может освоить mql5.

Наверное, неплохо знаю MQL5, но есть потребность в торговой библиотеке. Речь не про MT4-style, а про торговую библиотеку для MT5, с которой будет удобно и быстро работать. И в которой нет багов на реальных торгах.

Поскольку такой библиотеки не было (и есть ли - не знаю) в паблике, пришлось ваять свою. Для этого нужно было определиться, какой велосипед в виде набора торговых функций изобретать. Позаимствовал MT4-набор, как довольно неплохой. Что бонусом дало возможность не писать документацию к библиотеке и изучать ее. Ну и другие плюшки.

Так что знание MQL5 иногда на высоком уровне у пользователей.

 
#ifndef TEST_H_
#define TEST_H_


namespace TEST
{
   //----------------------------------------
   template < typename T >
   class CBase
   {
   public:
      typedef vector<T>   TypeVector;
      typedef vector<T>   TypeMatrix;
                
   }; 

   //----------------------------------------
   template < typename T > 
   class CTest : public CBase<T>
   {
   public:
      //using TypeVector = typename CBase<T>::TypeVector;
      //using TypeMatrix = typename CBase<T>::TypeMatrix;
                
                
   };


}//namespace TEST

#endif


Подскажите, в mql5 как-то надо переопределять пользовательские типы в дочернем классе?
Наподобие как указано в закомментированных строках С++ нотации.
Но ключевого слова using нет в mql5.

Или пользовательские типы базового класса, автоматом должны наследоваться во все дочерние классы?
Если наследоваться не должны, то как правильно тогда переопределить?


 
Roman #:


Подскажите, в mql5 как-то надо переопределять пользовательские типы в дочернем классе?
Наподобие как указано в закомментированных строках С++ нотации.
Но ключевого слова using нет в mql5.

Или пользовательские типы базового класса, автоматом должны наследоваться во все дочерние классы?
Если наследоваться не должны, то как правильно тогда переопределить?


      typedef vector<T>   TypeVector;
      typedef vector<T>   TypeMatrix;

В MQL это не работает.

В Вашем примере и typedef и using просто вводят псевдонимы для существующих типов.

Причина обращения: