Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 225

 
Andrey Dik #:

Cosa significa? Può spiegarlo meglio?

Ho avuto il tempo di controllare: sì, il trucco è fallito, ChartID()=12345 per visuale e non visuale... (tale ChartID costante del tester).

Ma ChartGetInteger(ChartID(),CHART_WIDTH_IN_PIXELS) dà un onesto -1 se non c'è uno schermo. È possibile utilizzarlo per determinare la fisica, ovvero se c'è un posto per l'output di qualcosa o meno. Poiché ci sono molti flag, e non sappiamo affatto cosa ci sia su VPS

 

Un'altra sfumatura improvvisa di MQL: i metodi virtuali non vengono chiamati dai costruttori.

nel codice

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

non si può fare così :-)) OnAttach della classe genitore sarà chiamato dal costruttore; e durante il normale accesso - della classe figlio.


Non sipuò capire, bisogna memorizzarlo:-)

 
Maxim Kuznetsov #:

Un'altra sfumatura improvvisa di MQL: i metodi virtuali non vengono richiamati dai costruttori.

nel codice


non si può fare così :-)) OnAttach della classe genitore sarà chiamato dal costruttore; e durante il normale accesso - della classe figlio.


non si può capire, bisogna memorizzarlo:-)

Perché è impossibile da capire? L'inizializzazione di un puntatore a un metodo nella tabella dei metodi virtuali avviene nel costruttore. Il costruttore della classe madre viene chiamato per primo, poi il costruttore del successore. Di conseguenza, quando viene eseguito il corpo del costruttore della classe padre, nella tabella dei metodi virtuali il puntatore punta all'indirizzo del metodo della classe base.

PS. Questo è per l'eterno cholivar sull'opportunità di imparare il C++. Se lo si studia, scavando fino all'essenza delle cose e non facendo il pieno, queste cose diventano evidenti).

 
Vladimir Simakov #:

Perché è impossibile da capire? L'inizializzazione di un puntatore a un metodo nella tabella dei metodi virtuali avviene nel costruttore. Il costruttore della classe genitore viene chiamato per primo, quindi il costruttore del successore. Di conseguenza, quando viene eseguito il corpo del costruttore della classe genitore, il puntatore punta all'indirizzo del metodo della classe base nella tabella dei metodi virtuali.

PS. Questo è per l'eterno cholivar sull'opportunità di imparare il C++. Se lo si studia, scavando fino all'essenza delle cose e non facendo il pieno, queste cose diventano evidenti).

Dopo gli script, dove tutto è possibile, è un po' sorprendente che "un costruttore non può essere virtuale" :-))

 
Maxim Kuznetsov #:

dopo gli script, dove tutto è possibile, è un po' sorprendente che "un costruttore non può essere virtuale" :-)

Per il vostro "problema", c'è una soluzione: https: //habr.com/ru/post/64369/.

PS. Non esattamente la stessa cosa, naturalmente, ma come direzione generale di pensiero

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

dopo gli script, dove tutto è possibile, è un po' sorprendente che "un costruttore non può essere virtuale" :-)

inaspettato?

Immaginate se venisse chiamato HiLow::OnAttach. Se ci fossero nuovi campi in HiLow e OnAttach li leggesse, ci sarebbe un "utilizzo di variabili non inizializzate" (perché il costruttore di HiLow non ha ancora iniziato l'esecuzione).

 

POSITION_TIME_UPDATE è rilevante solo nella modifica del lotto di una posizione. Ad esempio, la chiusura parziale di una posizione su qualsiasi tipo di conto o un refill su netting.

Le modifiche dei livelli SL/TP non influiscono su POSITION_TIME_UPDATE.

Per parafrasare, POSITION_TIME_UPDATE è influenzato solo dalle modifiche che si riflettono nella Trading History - trades. I livelli SL/TP non fanno parte di tali modifiche, quindi non le influenzano.


Sì, in effetti è così su un conto reale.

Ma dopo aver creato l'Expert Advisor, l'ho provato nel tester e ho scoperto che nel tester le modifiche dei livelli SL/TP influenzano POSITION_TIME_UPDATE.

Ecco un estratto dei log.

Qui ho evidenziato in giallo il momento dell'apertura della posizione e poi (al tick successivo) in rosso il momento della modifica (posizionamento) di SL e TP. Poi controllo i tempi POSITION_TIME e POSITION_TIME_UPDATE usando la stampa -sono diversi.

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

Se la modifica di SL e TP avviene nello stesso secondo, i tempi POSITION_TIME e POSITION_TIME_UPDATE sono ovviamente gli stessi.

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 #:
nel tester, le modifiche dei livelli SL/TP influenzano POSITION_TIME_UPDATE

Grazie per le informazioni!

 
fxsaber #:

Il campo ORDER_TIME_SETUP_MSC cambia quando gli ordini vengono eseguiti parzialmente.

Di conseguenza, DEAL_TIME_MSC può essere inferiore a ORDER_TIME_SETUP_MSC dell'ordine.

Esempio.


 
Potreste dirmi come compilare tutti i file della directory?
Motivazione: