Discussão do artigo "Expert Advisor Universal: Ordens Pendentes e Suporte para Cobertura de Risco (Parte 5)" - página 2

[Excluído]  
Vasiliy Sokolov:
Preconceito em relação aos métodos const. Tornei-me programador em C# - e lá isso não existe, porque a limitação imposta pelo modificador não é eficaz.

Ingenuamente, pensei que esse modificador também informa ao compilador onde criar um código nativo mais otimizado durante a compilação....

Eu mesmo o uso para autocontrole.

[Excluído]  
Vasiliy Sokolov:

O tempo principal no testador de estratégia é gasto no trabalho de sua infraestrutura (rolagem de barra, emulação do ambiente de negociação etc.) O código do Consultor especialista em si leva muito menos tempo.

Por outro lado, a criação de perfis mostrou que os principais métodos que consomem muitos recursos do CSTartegy são os métodos BuyInit, SellInit, BuySupport e SellSupport, ou seja, a própria lógica do Expert Advisor. Todos os outros métodos são compilados com sucesso em um código plano de forma otimizada ou simplesmente cortados se não forem usados. É por isso que a programação OOP de alto nível é justificada.

Observe que, em Expert Advisors mais ou menos complexos com muitas regras e infraestrutura pesada, a programação em uma forma inicialmente plana (sem funções e OOP) levará a erros inevitáveis do programador e, como consequência, o desempenho desse Expert Advisor será ainda menor do que com OOP. Os tempos do assembler acabaram. O compilador há muito tempo derrotou o ser humano em determinadas áreas de otimização. Cabe ao ser humano definir uma arquitetura inicialmente competente e escalonável com um número mínimo de interfaces e boa capacidade de gerenciamento.
.

Sou a favor da OOP com minhas mãos e meus pés. Contanto que apenas soluções de muletas não se escondam atrás dela, como no caso do OnTick com vários símbolos. O que oficialmente os desenvolvedores não consideram uma solução de muleta.
 
Anton Zverev:

Ingenuamente, pensei que esse modificador também informa ao compilador onde criar um código nativo mais otimizado durante a compilação.....

Eu mesmo o uso para autocontrole.

Talvez em C++ e MQL esse seja exatamente o caso, mas... Eu nunca entendi isso.
 
Anton Zverev:
Sou a favor da OOP com minhas mãos e pés. Contanto que apenas as soluções de muletas não estejam escondidas por trás disso, como no caso do OnTick com vários símbolos. O que é oficialmente considerado pelos desenvolvedores como não sendo uma solução de muleta.

Infelizmente, nada pode ser feito aqui no nível do usuário. Embora o OnTick no CStrtategy seja multivalente, sua multivalência também é emulada por meio de muletas. Simplesmente, a cada evento de entrada, o tick de outro instrumento é solicitado e, se tiver sido alterado, um novo evento OnTick é gerado para esse instrumento. A propósito, no FORTS, o CStrategy fornece um OnTick verdadeiramente multimoeda, graças ao evento OnBookEvent. Mas, novamente, isso é uma emulação quando se trabalha no testador.

Outra opção é fornecer ao CStrategy um indicador de recurso. Na inicialização, o CStrategy lança uma instância desse indicador no símbolo necessário e recebe dele o evento de chegada de um novo tique. Em seguida, ele é convertido em CStrategy OnTick. Essa é uma muleta clássica, mas toda a implementação está magistralmente oculta nos bastidores, e qualquer estratégia funciona de forma unificada sem saber como esses ticks foram recebidos.

[Excluído]  
Vasiliy Sokolov:

Infelizmente, nada pode ser feito aqui no nível do usuário. Embora o OnTick no CStrtategy seja multimoeda, sua multimoeda também é emulada por meio de muletas. Simplesmente em cada evento de entrada, o tick de outro instrumento é solicitado e, se tiver sido alterado, um novo evento OnTick é gerado para esse instrumento. A propósito, no FORTS, o CStrategy fornece um OnTick verdadeiramente multimoeda, graças ao evento OnBookEvent. Mas, novamente, isso é uma emulação quando se trabalha no testador.

Infelizmente, essa abordagem perde os ticks.

Outra opção é fornecer ao CStrategy um indicador de recursos. Na inicialização, o CStrategy lança uma instância desse indicador no símbolo necessário e recebe dele o evento de chegada de um novo tique. Em seguida, ele é convertido em CStrategy OnTick. Essa é uma variante clássica de muleta, mas toda a implementação está magistralmente oculta nos bastidores, e qualquer estratégia funciona de forma unificada sem saber como esses ticks foram recebidos.

Sim, essa variante foi aprovada pelos desenvolvedores. Mas, na minha opinião, ela parece terrivelmente complicada quando você considera como os recursos de um testador otimizado são desperdiçados em uma tarefa que é a mais simples para outras plataformas. A OOP certamente esconde a muleta com maestria.
 
Anton Zverev:

Infelizmente, essa abordagem não tem êxito.

Sim, essa opção é aprovada pelos desenvolvedores. Mas, na minha opinião, ela parece terrivelmente mutiladora se considerarmos como os recursos de um testador otimizado são gastos na tarefa mais simples de outras plataformas. A OOP certamente esconde a muleta com maestria.
Bem, não é tão ruim assim. Porque os indicadores em MQL são muito rápidos e funcionam em seu próprio thread. Acontece que lançamos um mini listener que nos sinaliza sobre a chegada de um novo evento. Vou pensar sobre essa implementação nas próximas partes do artigo.
 
Eu li na diagonal, artigos muito úteis, dificilmente consigo lê-los - talvez eu tenha perdido algo, estou interessado em pingentes, mas muitos dados estão faltando no impulso, por favor, aponte o dedo... ou tenho que inseri-los eu mesmo?????
'Ask' - function not defined    Impulse.mqh     51      20
'Ask' - function not defined    Impulse.mqh     51      28
'PendingOrders' - undeclared identifier Impulse.mqh     56      16
'GetOrder' - object pointer expected    Impulse.mqh     58      44
'IsMain' - member function not defined  Impulse.mqh     59      34
'Modify' - member function not defined  Impulse.mqh     66      19
'Delete' - member function not defined  Impulse.mqh     69      19
'Bid' - function not defined    Impulse.mqh     85      20
'Bid' - function not defined    Impulse.mqh     85      28
'PendingOrders' - undeclared identifier Impulse.mqh     90      16
'GetOrder' - object pointer expected    Impulse.mqh     92      44
'IsMain' - member function not defined  Impulse.mqh     93      34
'Modify' - member function not defined  Impulse.mqh     100     19
'Delete' - member function not defined  Impulse.mqh     103     19
'Bid' - function not defined    Impulse.mqh     118     23
'Bid' - function not defined    Impulse.mqh     118     31
'Bid' - function not defined    Impulse.mqh     124     7
'Ask' - function not defined    Impulse.mqh     136     23
'Ask' - function not defined    Impulse.mqh     136     31
'Ask' - function not defined    Impulse.mqh     142     7
20 error(s), 0 warning(s)               21      1
 
Сергей Криушин:
Eu li na diagonal, artigos muito úteis, dificilmente consigo lê-los - talvez eu tenha perdido algo, estou interessado em pingentes, mas muitos dados estão faltando no impulso, por favor, aponte o dedo... ou tenho que inseri-los eu mesmo????
Boa tarde. Por favor, atualize o mecanismo de negociação para a versão mais recente. Ele está anexado à quinta parte do artigo.
 
Сергей Криушин:
Eu li na diagonal, artigos muito úteis, dificilmente consigo lê-los - talvez eu tenha perdido algo, estou interessado em pingentes, mas muitos dados estão faltando no impulso, por favor, aponte o dedo... ou tenho que inseri-los eu mesmo????
Se você não entender alguma coisa, pode fazer perguntas neste tópico.
 
Vasiliy Sokolov:
Se você não entender alguma coisa, pode fazer perguntas neste tópico.
Não funciona - essas linhas não estão no próprio Impulse....