Características da linguagem mql5, subtilezas e técnicas - página 225

 
Andrey Dik #:

O que isso significa? Você pode falar mais sobre isso?

Tive tempo de verificar: sim, o truque falhou, ChartID()=12345 para visual e não visual... (um ChartID tão constante do testador).

Mas ChartGetInteger(ChartID(),CHART_WIDTH_IN_PIXELS) dá um honesto -1 se não houver tela. Você pode usá-lo para determinar a física - se há um lugar para gerar algo ou não. Como há muitos sinalizadores, não sabemos o que há no VPS

 

Outra nuance repentina do MQL - os métodos virtuais não são chamados a partir de construtores.

no código

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

você não pode fazer assim :-)) OnAttach da classe pai será chamado a partir do construtor; e durante o acesso normal - da classe filha.


Não dápara entender, é preciso memorizar:-)

 
Maxim Kuznetsov #:

Outra nuance repentina da MQL - os métodos virtuais não são chamados a partir de construtores.

no código


você não pode fazer isso dessa forma :-)) OnAttach da classe pai será chamado a partir do construtor; e durante o acesso normal - da classe filha.


você não consegueentender, precisa memorizar:-)

Por que é impossível entender? A inicialização de um ponteiro para um método na tabela de métodos virtuais ocorre no construtor. O construtor da classe pai é chamado primeiro, depois o construtor da classe sucessora. Assim, quando o corpo do construtor da classe pai é executado, na tabela de métodos virtuais o ponteiro aponta para o endereço do método da classe base.

PS. Isso é para a eterna discussão sobre se você deve ou não aprender C++. Se você estudar o assunto, buscando a essência das coisas, e não se aprofundar, essas coisas se tornarão evidentes).

 
Vladimir Simakov #:

Por que é impossível entender? A inicialização de um ponteiro para um método na tabela de métodos virtuais ocorre no construtor. O construtor da classe principal é chamado primeiro, depois o construtor da sucessora. Assim, quando o corpo do construtor da classe pai é executado, o ponteiro aponta para o endereço do método da classe base na tabela de métodos virtuais.

PS. Isso é para o eterno cholivar sobre se você deve aprender C++. Se você estudar o assunto, buscando a essência das coisas, e não se aprofundar, essas coisas se tornarão evidentes).

Depois dos scripts, onde tudo é possível, é um pouco surpreendente que "um construtor não possa ser virtual" :-))

 
Maxim Kuznetsov #:

Depois dos scripts, onde tudo é possível, é um pouco surpreendente que "um construtor não possa ser virtual" :-)

Para seu "problema", existe uma solução: https: //habr.com/ru/post/64369/.

PS. Não é exatamente a mesma coisa, é claro, mas como uma direção geral de pensamento

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

Depois dos scripts, onde tudo é possível, é um pouco surpreendente que "um construtor não possa ser virtual" :-)

inesperado?

Imagine se HiLow::OnAttach fosse chamado. Se houvesse novos campos em HiLow e OnAttach os lesse, haveria "uso de variáveis não inicializadas" (porque o construtor de HiLow ainda não começou a ser executado).

 

POSITION_TIME_UPDATE é relevante apenas na alteração do lote de uma posição. Por exemplo, o fechamento parcial de uma posição em qualquer tipo de conta ou uma recarga na compensação.

As alterações nos níveis de SL/TP não afetam o POSITION_TIME_UPDATE.

Parafraseando, o POSITION_TIME_UPDATE é afetado somente por modificações refletidas no Histórico de negociação - negociações. Os níveis SL/TP não pertencem a essas modificações, portanto, não as afetam.


Sim, de fato, é assim em uma conta real.

Mas depois de criar o Expert Advisor, eu o testei no testador e descobri que , no testador, as modificações de SL/TP-levels afetam POSITION_TIME_UPDATE.

Aqui está um trecho dos registros.

Aqui, destaquei o momento da abertura da posição em amarelo e, em seguida (no próximo tick), em vermelho, o momento da modificação (colocação) do SL e do TP nela. Em seguida, verifico os tempos POSITION_TIME e POSITION_TIME_UPDATE usando a impressão -eles são diferentes.

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

Quando a modificação de SL e TP ocorre no mesmo segundo, os tempos de POSITION_TIME e POSITION_TIME_UPDATE são, obviamente, os mesmos.

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 #:
no testador, as alterações nos níveis de SL/TP afetam POSITION_TIME_UPDATE

Obrigado pela informação!

 
fxsaber #:

O campo ORDER_TIME_SETUP_MSC é alterado quando as ordens são parcialmente executadas.

Como consequência, o DEAL_TIME_MSC pode ser menor que o ORDER_TIME_SETUP_MSC de sua ordem.

Exemplo.


 
Você poderia me dizer como compilar todos os arquivos do diretório?