学童的EOP。 - 页 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头寸以魔法 "0 "打开--即第二个对象 "交易 "打开它。

然后我们看到,这两个物体以相反的顺序被摧毁:首先是第二个物体(魔法为 "0"),然后是第一个物体(魔法为 "123")。

 
Alexey Viktorov:

是吗?难道它不创建一个新的、独立的对象吗?

是的,它将创建一个新的CTrade 类的实例

更有甚者,在退出 void OnTick() 将调用 CTrade 的析构器,在下一个 OnTick()时将再次调用 CTrade 的构造器。

 
Igor Makanu:

是的,将有一个新的Trade 类的实例

如果退出 void OnTick(),将调用 CTrade 的析构器,而下一个 OnTick() 将再次调用 CTrade 的构造器

是的,我在阿特姆的回答后立即意识到了这一点。

关于交易、自动交易系统和策略测试的论坛

学童的OOP。

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的任务范围很窄,需要通过OOP来解决。在我看来,这种语言本身不过是C++中的OOP或其他什么东西。而这种OOP是以标准库的形式提供的。对这个OOP,建议增加,否则我不会说,另一个OOP。然后再走一步...说得很对,术士虽然生气,但仁者见仁智者见智,对于我的任务来说,OOP就像一个狗的转盘。而且,如果这个没有问题的问题可以用程序化的方式解决,那么通过OOP的方式设置一个问题和随后的实现有什么好处呢?

例如,从 fxsaber`a 获取 .mqh,为 MT5 和 MT4 写代码。也许有人需要它,但看看是谁。对那些不想或绝对不能掌握mql5的人来说。或者从Nikolay......我忘了他的名字,采取iCanvas。它似乎是一个有用的库,但要理解它并不容易,而且没有任何文档,甚至连一个最小的描述都没有。这不是抱怨,对不起,尼古拉,这是一个事实。因此,当我决定尝试写一个图形标签时,不参考标准库或尼古拉的库来写就比较容易。

实际上,Alexey,你可以从KB中的描述页中获得关于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 "正面 "做的快。这是它的主要特点和优势。当然,形成图表、数字、评论也确实比较容易。

我还想补充一点,Alexey,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:

实际上,Alexey,你可以从KB描述页中获得关于iCanvas的足够信息。https://www.mql5.com/ru/code/22164你必须仔细研究代码中的注释。所 有函数的含义从它们的名称中可以直观地看出。

尼古拉,不要理会我的话。在研究编程的人中,像我这样的人太少了,如果我不是唯一的一个,那就根本不值得关注他们了。

对我来说,要学习代码中的注释,你首先要学习阿格里茨基))。

如果我有迫切的需要,我可以花时间并翻译所有的评论,尝试理解机器翻译并进行更正。 但没有这种需要。

 
Alexey Viktorov:

例如,从 fxsaber`a 取出 .mqh,为 MT5 以及 MT4 写代码。也许有人需要它,但看看谁...那些不想或绝对不能掌握mql5的人。

我想我对MQL5很了解,但我对交易库有需求。我说的不是MT4风格,而是MT5的交易库,使用起来会很舒服和快速。而且这个库在实际交易中没有任何错误。

由于公共领域没有这样的库(我也不知道它是否存在),我不得不自己开发一个。为此,我必须决定,我将以一套交易功能形式发明什么样的工具。借用了MT4套装,作为一个相当好的套装。作为奖励,这使得不把文件写到图书馆并研究它成为可能。还有其他好东西。

因此,MQL5的知识在用户中有时处于很高的水平。