mql5语言的特点、微妙之处以及技巧 - 页 225

 
Andrey Dik #:

你能解释一下吗?

我有时间检查了一下:是的,这一招失败了,可视和非可视的 ChartID()=12345......(测试者的 ChartID 是恒定的)。

但如果没有屏幕,ChartGetInteger(ChartID(),CHART_WIDTH_IN_PIXELS)会给出一个诚实的-1。您可以用它来判断物理情况--是否有输出东西的地方。因为有很多标记,而我们根本不知道 VPS 上有哪些标记

 

另一个突如其来的 MQL 细微差别 - 虚拟方法不能从构造函数中调用。

在代码中

class Manager;
class InfoPanel {
public:
   InfoPanel(Manager *m)    { manager=NULL; if (m!=NULL) m.Attach(&this); /* m.Attach в свою очередь должен дёрнуть виртуальный OnAttach (но не будет) */ };
   ~InfoPanel()   { };
   virtual void OnAttach(Manager *m) { PrintFormat("InfoPanel attach"); if (manager!=NULL) manager.Detach(&this); manager=m;};
   virtual void OnDetach(void) { PrintFormat("InfoPanel detach"); manager=NULL;};
   virtual void Draw(void) { PrintFormat("InfoPanel draw"); };
public:
   Manager *manager;
};
class HiLow: public InfoPanel {
public:
   HiLow(Manager *m):InfoPanel(m) { } ;
   ~HiLow() { };
   virtual void OnAttach(Manager *m) { PrintFormat("HiLow attach"); InfoPanel::OnAttach(m); };
   virtual void OnDetach(void) { PrintFormat("HiLow detach"); };
   virtual void Draw(void) { PrintFormat("HiLow draw"); };
};
class Manager {
public:
   Manager()  { };
   ~Manager() { };
   void Attach(InfoPanel *pan) {
      int id=ArraySize(panels);
      ArrayResize(panels,id+1);
      panels[id]=pan;
      panels[id].OnAttach(&this);
   }
/// some code
}
////
void OnStart()
{
   Manager *man=new Manager();
   HiLow *hilow=new HiLow(man);
   man.Draw();
   man.Detach(hilow);
   delete hilow;
   delete man;
}

你不能这样做 :-))父类的 OnAttach 将在构造函数中调用;而在正常访问过程中,子类的 OnAttach 将在构造函数中调用。


无法理解它,你必须记住它:-)

 
Maxim Kuznetsov #:

MQL 的另一个突如其来的细微差别--虚拟方法不能从构造函数中调用。

在代码中


你不能这样做 :-))父类的 OnAttach 将在构造函数中调用;而子类的 OnAttach 将在正常访问过程中调用。


无法理解它,你必须记住它:-)

为什么无法理解?虚拟方法表中方法指针的初始化在构造函数中进行。首先调用父类的构造函数,然后调用子类的构造函数。因此,在执行父类构造函数的主体时,虚拟方法表中的指针指向基类方法的地址。

PS.这是关于是否应该学习 C++ 的永恒话题。如果你认真学习,挖掘事物的本质,而不是死记硬背,这些东西就会变得不言自明)。

 
Vladimir Simakov #:

为什么无法理解?虚拟方法表中方法指针的初始化在构造函数中进行。首先调用父类的构造函数,然后调用子类的构造函数。因此,在执行父类构造函数的主体时,指针指向虚拟方法表中基类方法的地址。

PS.这是关于是否应该学习 C++ 的永恒话题。如果你认真学习,挖掘事物的本质,而不是死记硬背,这些东西就会变得不言自明)。

在一切皆有可能的脚本之后,"构造函数不能为虚 "的说法有点令人惊讶 :-))

 
Maxim Kuznetsov #:

在一切皆有可能的脚本之后,"构造函数不能为虚 "的说法有点令人惊讶:-)

对于你的 "麻烦",有这样一种解决方案:https://habr.com/ru/post/64369/。

PS.当然不完全相同,但可以作为一个大致的思考方向

Виртуальный конструктор
Виртуальный конструктор
  • 2009.07.13
  • habr.com
Все мы знаем, что в C++ нет такого понятия как виртуальный конструктор , который бы собирал нужный нам объект в зависимости от каких-либо входных параметров на этапе выполнения. Обычно для этих целей используется параметризованный фабричный метод (Factory Method) . Однако мы можем сделать «ход конем» и сымитировать поведение виртуального...
 
Maxim Kuznetsov #:

在一切皆有可能的脚本之后,"构造函数不能为虚 "的说法有点令人惊讶:-)

意料之外?

想象一下,如果调用 HiLow::OnAttach。如果 HiLow 中有新字段,而 OnAttach 会读取这些字段,那么就会出现 "使用未初始化变量 "的情况(因为 HiLow 构造函数尚未开始执行)。

 

POSITION_TIME_UPDATE 仅与更改头寸的手数有关。例如,在任何类型的账户上部分平仓或在净额结算中重新补仓。

更改 SL/TP 水平不会影响 POSITION_TIME_UPDATE。

换句话说,POSITION_TIME_UPDATE 只受交易历史 - 交易中反映的修改影响。SL/TP 水平不属于此类修改,因此不会对其产生影响。


是的,在真实账户中的确如此。

但在创建 Expert Advisor 后,我在测试器中进行了尝试,结果发现在测试器中SL/TP 水平 的修改会影响 POSITION_TIME_UPDATE

下面是日志摘录。

在这里,我用黄色标出了建仓时间,然后(在下一个刻度) 用红色标出了修改(放置)SL 和 TP 的时间。然后,我使用打印检查 POSITION_TIME POSITION_TIME_UPDATE 时间 -它们是不同的

LQ      0       11:54:55.049    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.10 12:00:00   CTrade::OrderSend: market buy 0.20 AUDCAD [done at 0.95325]
CL      0       11:54:55.049    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.10 12:00:00   FnPositionOpen: Тикет открытой сделки: 6; Тикет открытого ордера: 7
PD      0       11:54:55.049    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.10 12:00:00   Order #7  State: ORDER_STATE_FILLED
JN      0       11:54:55.063    Trade   2021.05.10 12:00:01   position modified [#7  buy 0.2 AUDCAD 0.95325 sl: 0.94901 tp: 0.96150]
PM      0       11:54:55.064    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.10 12:00:01   CTrade::OrderSend: modify position #7  AUDCAD (sl: 0.94901, tp: 0.96150) [done]
HP      0       11:54:55.064    Trade   2021.05.10 12:00:01   sell stop 0.2 AUDCAD at 0.94901 tp: 0.94492 (0.95319 / 0.95324 / 0.95319)
HN      0       11:54:55.065    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.10 12:00:01   CTrade::OrderSend: sell stop 0.20 AUDCAD at 0.94901 tp: 0.94492 [done]
GR      0       11:54:55.074    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.10 12:00:02   ================ 1620648000<1620648001

如果 SL 和 TP 在同一秒内修改,POSITION_TIMEPOSITION_TIME_UPDATE 时间当然相同。

RH      0       12:11:44.946    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.07 16:00:00   CTrade::OrderSend: market buy 0.20 AUDCAD [done at 0.95198]
NR      0       12:11:44.946    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.07 16:00:00   FnPositionOpen: Тикет открытой сделки: 5; Тикет открытого ордера: 5
HM      0       12:11:44.946    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.07 16:00:00   Order #5  State: ORDER_STATE_FILLED
KG      0       12:11:44.946    Trade   2021.05.07 16:00:00   position modified [#5  buy 0.2 AUDCAD 0.95198 sl: 0.94537 tp: 0.96496]
CJ      0       12:11:44.947    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.07 16:00:00   CTrade::OrderSend: modify position #5  AUDCAD (sl: 0.94537, tp: 0.96496) [done]
KK      0       12:11:44.956    Trade   2021.05.07 16:00:00   sell stop 0.2 AUDCAD at 0.94537 tp: 0.93890 (0.95195 / 0.95199 / 0.95195)
OE      0       12:11:44.957    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.07 16:00:00   CTrade::OrderSend: sell stop 0.20 AUDCAD at 0.94537 tp: 0.93890 [done]
RK      0       12:11:44.957    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.07 16:00:00   ================ 1620403200<1620403200
 
Andrey Kaunov #:
在测试仪中,SL/TP 水平的变化会影响 POSITION_TIME_UPDATE

感谢您提供的信息!

 
fxsaber #:

当部分执行订单时,ORDER_TIME_SETUP_MSC 字段会发生变化。

因此,DEAL_TIME_ MSC 可能小于其订单的ORDER_TIME_SETUP_MSC

例如


 
请告诉我如何编译目录中的所有文件?