Особенности языка 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 родительского класса ; А при обычном обращении - дочернего.


это нельзя понять, это надо запомнить :-)

 
Maxim Kuznetsov #:

Ещё внезапный нюанс MQL - виртуальные методы не вызываются из конструкторов. 

в коде 


вот так вот нельзя :-) Из конструктора будет вызываться 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 еще не начала выполняться).

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.09.22 20:43

POSITION_TIME_UPDATE имеет отношение только в изменению лота позиции. Например, частичное закрытие позиции на любом типе счета или доливка на неттинге.

Изменения же SL/TP-уровней на POSITION_TIME_UPDATE не влияют.

Перефразировав, на POSITION_TIME_UPDATE влияют только модификации, имеющие отражение в Истории торгов - сделки. SL/TP-уровни к таким модификациям не относятся, поэтому не влияют.


Да, действительно, на реальном счёте так и есть.

Но собрав советник, пробую его в тестере, и выясняется что в тестере изменение  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 своего ордера.

Пример.


 
Подскажите, пожалуйста, как откомпилировать все файлы в директории?
Причина обращения: