Perguntas sobre OOP em MQL5 - página 29

 
Dmitry Fedoseev:

Sim, aqui está outra pergunta que continua a surgir e não tem uma resposta clara. Quando você precisar herdar sua própria classe - o que é melhor fazer, herdá-la ou escrever uma nova versão estendida de sua classe.

Tudo depende da idéia geral do que você quer no final, imho

se você planeja usar a classe em outro lugar, você precisa torná-la completa sem herança

no meu exemplo, a classe CError pode obter GetLastError(), desajustar com uma descrição e retornar o valor (int) do erro. Eu planejo usá-lo em qualquer lugar, de qualquer forma, há apenas um construtor que define a linguagem em uma variável estática e o caso que retorna o texto do erro

Mas há outro método útil - bool ServerDisable(); - define a disponibilidade do servidor (código MT4/МТ5 multiplataforma), função muito boa, parece ser necessário em algum outro lugar no código, mas eu pensei, que eu vou usá-lo para operações comerciais mesmo assim - eu o coloquei na classe COrder

.....

e se eu quiser usá-lo para rastrear? .... - muito espaço para a imaginação, mas no final será usado como um objeto em COrder - onde mais poderia ser usado?


imho, tudo parece incômodo, é mais fácil incluir a biblioteca de funções de serviço com o linker, e o compilador não inclui as peças não utilizadas no executável por si só

toda a classe seria bastante compacta em estilo de procedimento, mostrei um exemplo de função para abrir um pedido que pode armazenar em constantes estáticas o volume de pedidoshttps://www.mql5.com/ru/forum/85652/page17#comment_12805083

 
Dmitry Fedoseev:

É realmente importante ficar dentro dos limites? Se for importante ficar dentro dos limites, você também pode escrever funções.

Eu estava respondendo no contexto de sua mensagem que se você não usar aulas, você terá que se preocupar com assinaturas de chamada inconvenientes. Eu mostrei que você não precisa se preocupar.

 
Alexey Navoykov:
O que me impede de enviar o nome do símbolo ao construtor, tornando a classe flexível e versátil? Você não está considerando a possibilidade de negociação de portfólio como uma questão de princípio?

considerando tudo,

Mas até o momento eu tenho me agarrado à pesquisa - agora estou quase pronto para pesquisar 1000 e 1 maneiras de MM e todos os tipos de truques com sistemas de pedidos ))))

Mas eu ainda acho que não seria muito flexível no final, já escrevi 2 vezes acima que um estilo de procedimento + classes pequenas com funções bem afinadas de tratamento de pedidos seria melhor.

mudarei para testar minhas idéias por enquanto e então verei o que edito frequentemente no código e o que deixo intocado

 
Igor Makanu:

.....

E se eu quiser usá-lo para rastrear? .... Há mais espaço para a imaginação, mas no final ainda será usado como objeto no COrder - onde mais poderia ser usado?


As barras de reboque são separadas porque não têm nada a ver com a lógica principal. Elas podem ou não existir de todo.

***

Barras rebocadoras e outras funções de manutenção similares devem ser feitas como descendentes de uma classe, e suas instâncias devem ser criadas em uma matriz. Se uma função é ativada, uma instância é adicionada à matriz e executada. Se todas as funções estiverem desativadas, o conjunto estará vazio e desnecessário se não for executado. Você pode inserir pelo menos 100 barras de reboque na EA, e isso não afetará a velocidade de sua execução.

 
Alexey Navoykov:
Essa não é a maneira de fazer isso. Você tem que pelo menos chamar tanto Bid() quanto Ask(). Seu código parece apenas uma variável, fazendo parecer que seu valor permanece inalterado, quando na realidade não o é.

infelizmente, sempre foi feito desta maneira, em MT4 ainda é Bid and Ask e nenhum capricho do Criador para arruinar este simples uso e obter os preços atuais ;)

fxsaber:

Eu tenho o seguinte esquema onde não tive nenhum problema.

  1. Eu escrevo TC somente para o Testador. Sem registros, manipuladores de erros e outras coisas. O código é muito conciso, compreensível e passível de mudanças, se feito através do OOP (mas não crucial). Já coloquei o exemplo no KB. O bônus é a rápida otimização.
  2. O principal é que ele deve estar disponível para o testador e em blocos independentes. A geração de sinais comerciais - um bloco. Comércio de sinais - outro bloco.
  3. A transferência para a conta real é sempre feita em várias jogadas de uma só vez. O TS é colocado em um ambiente virtual sem nenhuma mudança de código. Vários TS podem ser colocados em um ambiente ou cada TS em seu próprio ambiente, então o OOP se torna especialmente conveniente. Depois pegamos uma copiadora (o mercado está cheio delas, por isso as pessoas são boas em fotocopiadoras-logic), que simplesmente copia negócios/encomendas do ambiente virtual para o real.
  4. Com este esquema, escrever TS é rápido e fácil. A transferência para o real (o que é realmente raro) é sempre feita de maneira uniforme, rápida e clara.

estamos falando deste código?https://www.mql5.com/ru/code/22770

realmente gosto da implementação. muito bom para testador e otimizador, provavelmente vou usá-lo como base, o código é curto e legível, para ser honesto estou surpreso de ler seu código, você tem um estilo de escrita muito mais sofisticado, eu normalmente ligo e jogo, eu sei que não consigo entender a lógica

 
Igor Makanu:

infelizmente, sempre foi assim, na MT4 continua a ser o Bid and Ask e nenhum capricho do criador destrói este simples uso e a obtenção dos preços atuais ;)

Mas seus valores são invariáveis dentro do processamento do evento atual (a menos que você chame à força o RefreshRates, é claro). Portanto, são variáveis, não funções. E suas funções se parecem com variáveis

 

Dê aos FPs uma tarefa real de gerenciar e processar conjuntos de centenas de megabytes ou gigabytes de dados e todo seu modelo de mensagem de conto de fadas (os dados são imutáveis) irá para o inferno.

Estes são teóricos, mesmo a tempo de sair das tarefas do mundo real e transmitir em seu universo fictício :) as histórias de telecomunicações são passes de dados burros.

Na verdade, a única chance de combater a complexidade é embalá-la em objetos.
 
Alexey Navoykov:

Mas seus valores permanecem inalterados dentro do processamento do evento atual (a menos que você chame à força o RefreshRates). Portanto, são variáveis, não funções. E suas funções se parecem com variáveis

Eu nem sei como explicar o problema discutido em seu exemplo, vou tentar explicá-lo humanamente - para mim, como pessoa que teve o primeiro Pentium-90 PC, custa ver que para obter um uso conveniente, uma chamada de função extra, que implica colocar valores de registros na pilha, será acrescentada... e ...aqui vamos nós.

Eu sei que agora tudo está em cache repetidamente no nível do processador, e suspeito que os desenvolvedores de compiladores tornarão a "chamada de função a partir da chamada de função" mais eficiente

então seu exemplo deve ser parecido com este:

#define  Ask(dummy) SymbolInfoDouble(_Symbol,SYMBOL_ASK)
#define  Bid(dummy) SymbolInfoDouble(_Symbol,SYMBOL_BID)

void OnStart()
  {
   Print("Ask = ",Ask());
   Print("Bid = ",Bid());
  }

Ou assim:

#define  Ask(symbol_) SymbolInfoDouble(symbol_,SYMBOL_ASK)
#define  Bid(symbol_) SymbolInfoDouble(symbol_,SYMBOL_BID)

void OnStart()
  {
   Print("Ask = ",Ask(_Symbol));
   Print("Bid = ",Bid(_Symbol));
  }
 
Dmitry Fedoseev:

Vasiliy, este artigo seria muito útil para você - não se torturar espremendo o OOP por causa do OOP.

Tenho uma idéia da estrutura funcional da MT. Quase não haverá OOP lá. Somente funções, "mônadas" e outras pseudo funcionalidades FP. Estou escrevendo tudo entre aspas, uma vez que é impossível fazer FP de pleno direito em MQL.

 
Dmitry Fedoseev:

Os comentários são desnecessários.

não gostam tanto um do outro, ou talvez seja o oposto de 2 gays procurando uma saída para si mesmos)

A propósito, eu gostei de seus artigos, os do perito são coxo, fracos, mas eu gosto tanto quanto ele,

e eu não sou gay.