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

 
fxsaber:

Isso é um bom truque. O truque é aplicar o padrão à TParent. Nunca tinha visto nada assim antes.

Bem, não é herança múltipla. Na verdade é uma corrente Base -> A -> B -> C -> X. Quem o impede de o usar directamente, se for suficiente?

 
Stanislav Korotky:

Bem, não é herança múltipla. Na verdade é uma corrente Base -> A -> B -> C -> X. Quem o impede de o usar directamente, se for suficiente?

Brevidade.

 
fxsaber:

Brevidade.

Eu não podia concordar mais. IMHO, prescrever diretamente as quatro classes sucessoras seria mais curto e claro.

 
Stanislav Korotky:

Eu não poderia concordar mais aqui. IMHO, prescrever diretamente as quatro classes sucessoras seria mais curto e claro.

Se, de repente, a herança plural for introduzida, basta fazer uma pequena mudança em apenas uma linha

class X : public INHERIT3(A, B, C)  {  };   // Объявляем класс, наследуемый от A, B, C
 
fxsaber:

Se, de repente, for introduzida uma herança múltipla, basta uma pequena substituição em apenas uma linha

É pena que o fórum não tenha um formulário de aposta além das sondagens - como uma sondagem com opções, mas bloqueando alguns "cêntimos" na conta para a resposta. Aqueles que escolherem a opção certa receberão as apostas dos perdedores após o evento ;-). Acho que eles não o iriam apresentar.

 
Stanislav Korotky:

Bem, não é herança múltipla. Na verdade é uma corrente Base -> A -> B -> C -> X. Quem o impede de o usar directamente, se for suficiente?

Sim, mas toda a característica é que todas as classes-fonte são definidas e usadas como modelos. Portanto, esta cadeia pode ser definida em qualquer ordem. Em essência, não há diferença fundamental com a herança múltipla. Como já escrevi, pode haver armadilhas com as aulas. Quanto às interfaces, tudo é idêntico. A única coisa é que vai parecer um pouco crocante, mas aqui todos são livres para decidir se querem verificar ou conduzir )
 

Mais uma coisa que eu gostaria de acrescentar. Uma alternativa completa à herança múltipla (e com opções mais flexíveis) poderia ser implementada através da sobrecarga do operador fantasma. Mas o MQ por alguma razão não adiciona esta funcionalidade de sobrecarga, embora eu já lhes peça para o fazerem há muito tempo. E eu ainda nem ouvi uma resposta concreta deles, eles ignoram-na.

 

Há situações como esta

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Bugs, bugs, perguntas

fxsaber, 2017.07.24 09:27

A EA é compilada sob 1641, onde o histórico de negociação rápida é implementado.

É possível, durante a otimização, chegar ao Agent build 1596, onde a história funciona MUITO devagar e, conseqüentemente, obter uma desaceleração na otimização muitas vezes?

Como um caso mais geral, a otimização na Nuvem às vezes dá resultados diferentes não só em termos de tempo, mas também em termos de cálculos. Às vezes você pode ouvir que o resultado da otimização não coincide com uma única execução.

Isso pode ser devido ao fato de que Agentes envolvidos na otimização e um Agente local envolvido em uma única execução podem ter um número de construção diferente.

E cada construção contém bugs diferentes. Por exemplo, aqui está um bug que é relevante agora, mas que não estava presente nas construções de alguns anos atrás

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Bugs, bugs, perguntas

fxsaber, 2017.07.17 23:08

Mais uma vez o erro HistorySelect no testador. Não parecia tê-lo em 1626. Em 1629 há.

#include <Trade\Trade.mqh>

void OnTick()
{
  static CTrade Trade;

  const datetime NowTime = TimeCurrent();
  
  if (Trade.Buy(1) && Trade.PositionClose(_Symbol) && HistorySelect(NowTime, NowTime))
  {
    Print(HistoryDealsTotal()); // 0 - это при том, что мы открыли и закрыли позицию в NowTime-время
      
    ExpertRemove();
  }
}

Assim, se o seu EA atingir o Agente b1626 durante a otimização, ele pode mostrar um resultado, mas ao executar no Agente local b1641 uma única execução, uma execução completamente diferente.

A partir daí, podemos concluir que antes da otimização, você deve estar ciente de quais construções você quer otimizar sua EA e para quais não é.

Os desenvolvedores forneceram um cortador para os agentes inadequados - INIT_AGENT_NOT_SUITABLE.


Portanto, eu recomendaria escrever um cheque para fazer a correspondência doTerminalInfoInteger(TERMINAL_BUILD) com os valores desejados no OnInit para otimizações baseadas na Nuvem.

Mas é quase impossível saber a lista de cheques que correspondem às suas necessidades, por isso o mais provável é que escreva isto

int OnInit( void )
{
  // Если Агент не совпадает с билдом компиляции, отказываемся от его услуг
  if (TerminalInfoInteger(TERMINAL_BUILD) != __MQLBUILD__)
    return(INIT_AGENT_NOT_SUITABLE);
//....

Mas também é uma má solução. Uma solução mais flexível é passar o seu número de construção para os Agentes durante a optimização.


Em geral, esteja vigilante.


SZY. É possível gerar um relatório comercial da execução de cada agente e obtê-lo de imediato durante a optimização. Isto pode ajudar a entender melhor porque o resultado do Agente Nuvem é diferente do resultado local durante uma única corrida. A geração automática de tais relatórios durante a Otimização e execução única é possível com a ajuda desta biblioteca.

Fórum sobre negociação, sistemas de negociação automatizados e testes de estratégia de negociação

Bugs, bugs, perguntas

Renat Fatkhullin, 2017.07.25 08:26

Periodicamente cortamos construções antigas na clouda, esperando que elas sejam atualizadas, o que passa muito rápido e despercebido.

Isto não é feito em todas as versões, mas dependendo da importância das mudanças feitas.
Report
Report
  • votos: 12
  • 2017.07.19
  • fxsaber
  • www.mql5.com
Библиотека для MetaTrader 4/5, которая позволяет формировать отчеты по истории торгов.
 

Ao depurar (não necessariamente ao depurar), quando se pretende reduzir rapidamente o intervalo de teste no testador, utilizo as seguintes funções

// Выгружает эксперт, если количество сделок в истории больше DealsNum.
void ConditionStopExpert( const int DealsNum = INT_MAX )
{
  if ((DealsNum != INT_MAX) && ::HistorySelect(0, ::TimeCurrent()) && ::HistoryDealsTotal() > DealsNum)
    ::ExpertRemove();

  return;  
}

// Выгружает эксперт, если с момента запуска прошло AmountHours-часов.
void ConditionStopExpert( const double AmountHours )
{
  static datetime FirstTime = ::TimeCurrent();
  
  if (::TimeCurrent() > FirstTime + (datetime)(AmountHours * 3600))
    ::ExpertRemove();

  return;  
}
 
fxsaber:

Ao depurar (não necessariamente depurando), quando é necessário reduzir rapidamente o intervalo de teste no testador, eu uso as seguintes funções

Corrija o código, você tem o número 5 na primeira função, em vez de DealsNum.