mql5言語の特徴、微妙なニュアンスとテクニック - ページ 225

 
Andrey Dik #:

どういう意味ですか?

はい、トリックは失敗しました、ビジュアルとノンビジュアルのChartID()=12345...(テスターの定数ChartID)。

しかし、ChartGetInteger(ChartID(),CHART_WIDTH_IN_PIXELS)は、スクリーンがなければ正直に-1を与える。これを使用して、物理学、つまり何かを出力する場所があるかどうかを判断することができます。多くのフラグがあり、VPS上に何があるのかまったくわからないからだ。

 

仮想メソッドはコンストラクターからは呼び出されない。

コードでは

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はコンストラクタから呼び出されます。


理解できないなら、暗記するしか ない :-)

 
Maxim Kuznetsov #:

MQLのもうひとつの突発的なニュアンス--仮想メソッドはコンストラクターからは呼び出されない。

コードでは


コードではこうはできない :-))親クラスのOnAttachはコンストラクタから呼び出されます。


理解できないなら、暗記するしか ない :-)

なぜ理解できないのか?仮想メソッドのテーブルにあるメソッドへのポインタの初期化はコンストラクタで行われる。親クラスのコンストラクタが最初に呼ばれ、次に後継クラスのコンストラクタが呼ばれる。従って、親クラスのコンストラクタ本体が実行されると、仮想メソッドのテーブルでは、ポインタは基底クラスのメソッドのアドレスを指すことになります。

PS.これは、C++を学ぶべきかどうかという永遠のコリヴァーに対するものだ。詰め込みではなく、物事の本質を掘り下げながら勉強すれば、そのようなことは自明になる)。

 
Vladimir Simakov #:

なぜ理解できないのか?仮想メソッドの表にあるメソッドへのポインタの初期化はコンストラクタの中で行われる。まず親クラスのコンストラクタが呼ばれ、次に後継クラスのコンストラクタが呼ばれます。したがって、親クラスのコンストラクタ本体が実行されると、ポインタは仮想メソッド表の基底クラスのメソッドのアドレスを指す。

PS.これは、C++を学ぶべきかどうかという永遠のコリヴァーに対するものだ。詰め込みではなく、物事の本質を掘り下げて勉強すれば、そんなことは自明の理になる)。

なんでもありのスクリプトの後で、「コンストラクタが仮想化できない」というのはちょっと驚きだ :-))

 
Maxim Kuznetsov #:

あらゆることが可能なスクリプトの後で、「コンストラクタを仮想にできない」というのはちょっと驚きだ。)

https://habr.com/ru/post/64369/

追記。もちろん、まったく同じではありませんが、一般的な考え方の方向性として

Виртуальный конструктор
Виртуальный конструктор
  • 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_TIMEと POSITION_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 よりも小さくなることがある。


 
ディレクトリ内のすべてのファイルをコンパイルする方法を教えてください。