Caractéristiques du langage mql5, subtilités et techniques - page 225

 
Andrey Dik #:

Pouvez-vous nous en dire plus à ce sujet ?

J'ai eu le temps de vérifier : oui, l'astuce a échoué, ChartID()=12345 pour le visuel et le non-visuel...(tel un ChartID constant du testeur).

Mais ChartGetInteger(ChartID(),CHART_WIDTH_IN_PIXELS) donne honnêtement -1 s'il n'y a pas d'écran. Vous pouvez l'utiliser pour déterminer la physique - s'il y a un endroit pour sortir quelque chose ou non. Parce qu'il y a beaucoup de drapeaux, et que nous ne savons pas du tout ce qu'il y a sur le VPS.

 

Une autre nuance soudaine de MQL - les méthodes virtuelles ne sont pas appelées à partir des constructeurs.

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

on ne peut pas faire comme ça :-)) OnAttach de la classe mère sera appelée depuis le constructeur ; et pendant l'accès normal - de la classe enfant.


Vous ne pouvez pas lecomprendre, vous devez le mémoriser:-)

 
Maxim Kuznetsov #:

Autre nuance soudaine de MQL : les méthodes virtuelles ne sont pas appelées à partir des constructeurs.

dans le code


on ne peut pas faire comme ça :-)) OnAttach de la classe mère sera appelé à partir du constructeur ; et pendant l'accès normal - de la classe enfant.


Vous ne pouvez pas lecomprendre, vous devez le mémoriser:-)

Pourquoi est-ce impossible à comprendre ? L'initialisation d'un pointeur sur une méthode de la table des méthodes virtuelles se fait dans le constructeur. Le constructeur de la classe mère est appelé en premier, puis le constructeur du successeur. Par conséquent, lorsque le corps du constructeur de la classe parente est exécuté, dans la table des méthodes virtuelles, le pointeur pointe vers l'adresse de la méthode de la classe de base.

PS. Ceci est pour l'éternel cholivar sur la question de savoir si vous devriez apprendre le C++. Si vous l'étudiez, en allant à l'essentiel et non en bachotant, de telles choses deviennent évidentes).

 
Vladimir Simakov #:

Pourquoi est-ce impossible à comprendre ? L'initialisation d'un pointeur sur une méthode de la table des méthodes virtuelles a lieu dans le constructeur. Le constructeur de la classe mère est appelé en premier, puis celui de la classe successeur. Par conséquent, lorsque le corps du constructeur de la classe parente est exécuté, le pointeur pointe sur l'adresse de la méthode de la classe de base dans la table des méthodes virtuelles.

PS. Ceci est pour l'éternel cholivar sur la question de savoir si vous devriez apprendre le C++. Si vous l'étudiez, en creusant l'essence des choses et non en bachotant, de telles choses deviennent évidentes).

Après les scripts, où tout est possible, il est un peu surprenant qu'"un constructeur ne puisse pas être virtuel" :-))

 
Maxim Kuznetsov #:

après les scripts, où tout est possible, il est un peu surprenant qu'"un constructeur ne puisse pas être virtuel" :-)

Pour votre "problème", il existe une solution : https://habr.com/ru/post/64369/.

PS. Ce n'est pas exactement la même chose, bien sûr, mais c'est une piste de réflexion générale

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

après les scripts, où tout est possible, il est un peu surprenant que "un constructeur ne puisse pas être virtuel" :-)

inattendu ?

Imaginez que HiLow::OnAttach soit appelé. S'il y avait de nouveaux champs dans HiLow et que OnAttach les lisait, il y aurait "utilisation de variables non initialisées" (parce que le constructeur de HiLow n'a pas encore commencé à s'exécuter).

 

POSITION_TIME_UPDATE n'est pertinent que dans la modification du lot d'une position. Par exemple, la clôture partielle d'une position sur tout type de compte ou une recharge sur la compensation.

Les modifications des niveaux SL/TP n'affectent pas POSITION_TIME_UPDATE.

En d'autres termes, POSITION_TIME_UPDATE n'est affecté que par les modifications reflétées dans l'historique des transactions. Les niveaux SL/TP ne font pas partie de ces modifications et ne les affectent donc pas.


Oui, en effet, c'est le cas sur un compte réel.

Mais après avoir construit l'Expert Advisor, je l'ai essayé dans le testeur, et il s'avère que dans le testeur, les modifications des niveaux SL/TP affectent POSITION_TIME_UPDATE.

Voici un extrait des journaux.

Ici, j'ai surligné en jaune l'heure d'ouverture de la position, puis (au prochain tick) en rouge l'heure de modification (placement) du SL et du TP. Je vérifie ensuite les heures POSITION_TIME et POSITION_TIME_UPDATE à l'aide de l'impression -elles sont différentes.

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

Lorsque la modification du SL et du TP se fait dans la même seconde, les temps POSITION_TIME et POSITION_TIME_UPDATE sont bien sûr les mêmes.

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 #:
dans le testeur, les changements de niveaux SL/TP affectent POSITION_TIME_UPDATE

Merci pour l'information !

 
fxsaber #:

Le champ ORDER_TIME_SETUP_MSC est modifié lorsque les ordres sont partiellement exécutés.

Par conséquent, DEAL_TIME_MSC peut être inférieur à ORDER_TIME_SETUP_MSC de son ordre.

Exemple.


 
Pourriez-vous me dire comment compiler tous les fichiers du répertoire ?