Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 225

 
Andrey Dik #:

Was bedeutet das? Können Sie das näher erläutern?

Ich hatte Zeit zu prüfen: ja, der Trick ist fehlgeschlagen, ChartID()=12345 für visuelle und nicht-visuelle...(so eine konstante ChartID des Testers).

Aber ChartGetInteger(ChartID(),CHART_WIDTH_IN_PIXELS) gibt eine ehrliche -1, wenn es keinen Bildschirm gibt. Sie können es verwenden, um die Physik zu bestimmen - ob es einen Platz gibt, um etwas auszugeben oder nicht. Denn es gibt eine Menge Flags, und wir wissen nicht, was auf dem VPS überhaupt vorhanden ist

 

Eine weitere plötzliche MQL-Nuance - virtuelle Methoden werden nicht von Konstruktoren aufgerufen.

im Code

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;
}

kann man das nicht so machen :-)) OnAttach der Elternklasse wird vom Konstruktor aufgerufen; und während des normalen Zugriffs - von der Kindklasse.


mankann es nicht verstehen, man muss es sich merken:-)

 
Maxim Kuznetsov #:

Eine weitere plötzliche Nuance von MQL - virtuelle Methoden werden nicht von Konstruktoren aufgerufen.

im Code


kann man das nicht so machen :-)) OnAttach der Elternklasse wird vom Konstruktor aufgerufen ; Und beim normalen Zugriff - der Kindklasse.


mankann es nicht verstehen, man muss es sich merken:-)

Warum ist es nicht zu verstehen? Die Initialisierung eines Zeigers auf eine Methode in der Tabelle der virtuellen Methoden findet im Konstruktor statt. Zuerst wird der Konstruktor der Elternklasse aufgerufen, dann der Konstruktor des Nachfolgers. Wenn also der Körper des Konstruktors der Elternklasse ausgeführt wird, zeigt der Zeiger in der Tabelle der virtuellen Methoden auf die Adresse der Methode der Basisklasse.

PS. Dies ist für den ewigen Cholivar, ob man C++ lernen sollte. Wenn man es studiert, zum Kern der Dinge vordringt und nicht paukt, werden solche Dinge selbstverständlich).

 
Vladimir Simakov #:

Warum ist das unmöglich zu verstehen? Die Initialisierung eines Zeigers auf eine Methode in der Tabelle der virtuellen Methoden findet im Konstruktor statt. Zuerst wird der Konstruktor der Elternklasse aufgerufen, dann der Konstruktor des Nachfolgers. Dementsprechend zeigt der Zeiger auf die Adresse der Basisklassenmethode in der Tabelle der virtuellen Methoden, wenn der Körper des Konstruktors der Elternklasse ausgeführt wird.

PS. Dies ist für den ewigen Cholivar, ob man C++ lernen sollte. Wenn man es studiert, zum Kern der Dinge vordringt und nicht paukt, werden solche Dinge selbstverständlich).

Nach den Skripten, wo alles möglich ist, ist es ein bisschen überraschend, dass "ein Konstruktor nicht virtuell sein kann" :-))

 
Maxim Kuznetsov #:

nach Skripten, in denen alles möglich ist, ist es ein wenig überraschend, dass "ein Konstruktor nicht virtuell sein kann" :-)

Für Ihr "Problem" gibt es eine solche Lösung: https: //habr.com/ru/post/64369/.

PS. Natürlich nicht genau dasselbe, aber als allgemeine Denkrichtung

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

nach Skripten, in denen alles möglich ist, ist es ein wenig überraschend, dass "ein Konstruktor nicht virtuell sein kann" :-)

unerwartet?

Stellen Sie sich vor, HiLow::OnAttach würde aufgerufen. Wenn es neue Felder in HiLow gäbe und OnAttach sie lesen würde, gäbe es "Verwendung von nicht initialisierten Variablen" (weil der HiLow-Konstruktor noch nicht mit der Ausführung begonnen hat).

 

POSITION_TIME_UPDATE ist nur bei der Änderung des Lots einer Position relevant. Zum Beispiel bei der teilweisen Schließung einer Position auf einem beliebigen Konto oder bei einer Auffüllung durch Netting.

Änderungen der SL/TP-Levels haben keinen Einfluss auf POSITION_TIME_UPDATE.

Mit anderen Worten: POSITION_TIME_UPDATE wird nur von Änderungen beeinflusst, die sich in der Trading History - Trades widerspiegeln. SL/TP-Levels gehören nicht zu solchen Änderungen, also haben sie keinen Einfluss darauf.


Ja, in der Tat, es ist so auf einem realen Konto.

Aber nachdem ich den Expert Advisor erstellt habe, probiere ich ihn im Testprogramm aus, und es stellt sich heraus, dass im Testprogramm die Änderungen der SL/TP-Levels POSITION_TIME_UPDATE beeinflussen.

Hier ist ein Auszug aus den Protokollen.

Hier habe ich den Zeitpunkt der Positionseröffnung gelb hervorgehoben, und dann (beim nächsten Tick) in rot den Zeitpunkt der Änderung (Platzierung) von SL und TP dazu. Dann überprüfe ich die Zeitpunkte POSITION_TIME und POSITION_TIME_UPDATE mit dem Druck -sie sind unterschiedlich.

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

Wenn die Änderung von SL und TP innerhalb derselben Sekunde erfolgt, sind die Zeiten von POSITION_TIME und POSITION_TIME_UPDATE natürlich gleich.

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 #:
im Prüfgerät wirken sich Änderungen der SL/TP-Ebenen auf POSITION_TIME_UPDATE aus

Vielen Dank für die Informationen!

 
fxsaber #:

Das Feld ORDER_TIME_SETUP_MSC ändert sich, wenn Aufträge teilweise ausgeführt werden.

Infolgedessen kann DEAL_TIME_MSC kleiner sein als ORDER_TIME_SETUP_MSC des jeweiligen Auftrags.

Beispiel.


 
Könnten Sie mir bitte sagen, wie ich alle Dateien in diesem Verzeichnis kompilieren kann?