MT5 e velocidade em ação - página 78

 
Valeriy Yastremskiy:

Entenda corretamente que a memória do terminal está empilhada com a memória do programa terminal do mcl, tix e outros.

Não. Simplesmente CopyTicks armazena o cache de carrapatos solicitados por 10 segundos. Por exemplo, 3 Gb de memória solicitada, o Terminal irá armazenar esses 3 Gb mais em cache. O Terminal total consumirá 6 GB. Se você fizer ArrayFree e solicitar 3 Gb para outro símbolo, o terminal consumirá 9 Gb. E assim por diante.

 
Valeriy Yastremskiy:

Entenda corretamente que a memória do terminal é adicionada à memória dos programas terminais mcl, tix e outros.

É claro.
 
Necessidade de fazer um roteiro que crie um símbolo personalizado com base no histórico de vários símbolos por fórmula
MqlTick Formula( const MqlTick &Symbol1_Tick
                 const MqlTick &Symbol2_Tick,
                 const MqlTick &Symbol3_Tick,
                 const MqlTick &Symbol4_Tick,
                 const MqlTick &Symbol5_Tick );

Parece que 100 MB de RAM deveriam ser suficientes para esta tarefa, mesmo para um bilhão de carrapatos. Mas no MT5 você não pode resolver esta tarefa através do CopyTicks.

Aqui está a muleta:

  1. CopyTicks é chamado para cada símbolo separadamente (e necessariamente com a espera para liberação do cache após cada chamada), escrevendo o histórico do tick em seus arquivos correspondentes via FileSave.
  2. Depois vem a leitura de carrapatos desses arquivos e a chamada de Fórmula para eles.

Sim, é uma muleta assustadora, mas não há outras opções. Portanto, você não pode trabalhar com CopyTicks diretamente. É necessário utilizar os arquivos de arquivos dos carrapatos.


O maior consumo de memória estará na p.1. mesmo com a condição de expectativa de liberação do cache após cada chamada. Neste caso, a p.2. funcionará gratuitamente!

 

Estou negociando em 8 pares ao mesmo tempo, com vários Expert Advisors em cada par. E embora em termos de recursos tenha boa aparência, o uso de memória não é superior a 25%, a CPU não é carregada mais de 10%, os atrasos são perceptíveis, como se um novo gráfico se abrisse por alguns segundos, assim como em geral a comercialização. Talvez existam algumas melhores práticas, pelo menos no abstrato, como embalar tudo e fazer com que funcione mais rápido? Eu sei que você está virtualizando vários Expert Advisors em um só. Quais são as armadilhas? Como tem sido implementado o envio de ordens comerciais? A que devo prestar atenção?

P.S. I eu mesmo uso sincronização através do Virtual e comércio através do MT4Orders, 1 EA por gráfico.

 
fxsaber:

Da mesma forma. Leve seu VPS. Os operadores de mercado não podem trabalhar nisso.

ZS Seria bom se livrar dos soluços que vêm ocorrendo há meses. Execute este script em uma máquina com RAM infinita. Por exemplo, não posso carregar carrapatos de 1 de junho apenas um caractere de cada vez. Ele apenas pendura o CopyTicks com consumo zero de recursos.

Despeje o terminal quando ele "pendurar". Vamos ver qual é a causa.

 
traveller00:

Estou negociando em 8 pares ao mesmo tempo, com vários Expert Advisors em cada par. E embora em termos de recursos tenha boa aparência, o uso de memória não é superior a 25%, a CPU não é carregada mais de 10%, os atrasos são perceptíveis, como se um novo gráfico se abrisse por alguns segundos, assim como em geral a comercialização. Talvez existam algumas melhores práticas, pelo menos no abstrato, como embalar tudo e fazer com que funcione mais rápido?

Use um novo MT4Orders (onde o manuseio do histórico é acelerado após a criação deste ramo) e faça um instantâneo do ambiente atual: pedidos e posições. Eu tenho tudo voando.

Eu sei que você está virtualizando vários Expert Advisors em um só. Quais são as armadilhas? Como tem sido implementado o envio de ordens comerciais? A que devo prestar atenção?

Estou usando o OrderSend sincronizado, mas estou desativando as verificações do MT5.

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Bibliotecas: MT4Orders

fxsaber, 2020.09.29 08:45

Com esta linha.

MT4ORDERS::OrderSend_MaxPause = 0; // Отключение проверки корректности работы MT5-OrderSend.

pode ser usado para desativar tudo. Pode ser útil em caso de histórico de negociação lento do MT5, pois o MT4Orders verifica a correção (e até corrige) do MT5-OrderSend por vezes através de referência a este histórico.

Eu não recomendo fazer isso.


Cada conjunto (conjunto de parâmetros de entrada) recebe seu próprio Virtual. O sincronizador passa por todos os Virtuals e faz a sincronização para cada um deles. Ele precisa fazer isso em loop, não a partir do primeiro Virtual.

Após qualquer chamada OrderSend (dentro do sincronizador) um instantâneo é necessariamente feito e novos tiquetaques são adicionados (a todos os Virtuais) que vieram durante o tempo de execução OrderSend. Isto é, depois de qualquer pausa hipotética, fazemos tudo fresco.

Os carrapatos frescos são tirados somente via CopyTicks a cada vez. Sem SymbolInfoTick para rolar. Certifique-se de que se CopyTicks_LastTick.time_msc < SymbolInfoTick.time_msc (isso acontece com freqüência, mesmo que as chamadas sejam uma após a outra (em qualquer seqüência), então o sincronizador não está habilitado. Caso contrário, você pode encontrar que o limite de tempo real é executado, mas o limite de tempo virtual não é. E haverá problemas com a sincronização.

Eu faço instantâneos através de VIRTUAL::Snapshot. Além da velocidade óbvia, ele também permite separar seu símbolo do resto - somente seu símbolo chega lá. Isto dá ainda mais velocidade. Além disso, não só a história é desativada na foto,

#define  VIRTUAL_SNAPSHOT_WITHOUT_HISTORY // Отказ от снепшота истории для повышения производительности

mas também campos (marcados abaixo), que requerem acesso ao histórico.

#define  MACROS(A) this.##A = ::Order##A();

  bool ORDERS::Copy( const bool WithoutHistory = false )
  {
    MACROS(CloseTimeMsc)

    if (WithoutHistory && !this.CloseTimeMsc) // Для исторических ордеров оставляем все без изменений.
    {
      const string Str = NULL;
      this.comment = Str;

      this.Commission = 0;
      this.OpenPriceRequest = this.OpenPrice;
    }
    else // В MT4Orders требуется обращение к истории.
    {
      const string Str = ::OrderComment();
      this.comment = Str;

      MACROS(Commission)
      MACROS(OpenPriceRequest)
    }

Anteriormente eu também verifiquei se o LastDeal.time_msc não era maior que o LastTick.time_msc. Se esta condição não foi cumprida, recusei a sincronização por razões óbvias. Mas tal verificação consome muitos recursos (funciona com a história), então eu recusei.


Comércio em função - OnTick.


Provavelmente enumerei os principais.

 

Síncrono, presumo, não apenasOrderSend, mas todas as ordens comerciais, incluindo modificação, exclusão, etc.?


SymbolInfoTick não é jogado para fora, porque a ordem dos carrapatos pode dar errado? E o CopyTicks está exatamente na ordem correta.


Acontece que o SymbolInfoTick é necessário apenas para verificar o tempo e isso é tudo? Todos os negócios, etc., são corrigidos apenas porCopyTicks?


Há algum sentido em tentar embalar vários EAs em 1 em 1 tabela? Nada impossível, mas tentando entender se vale a pena a maçada e a reescrita ou se o lucro será mínimo?

 
traveller00:

Faz sentido tentar empacotar vários EAs em 1 em 1 tabela? Nada impossível, mas tentar descobrir se vale a pena a maçada e a reescrita ou se o lucro será mínimo?

De onde viria o lucro? Todos estarão esperando por qualquer um deles ao negociar.

E há apenas menos paralelismo.

A menos que você possa manter um cache de pedidos para todos, mas o benefício é questionável...

 
Anton:

Despeje o terminal quando ele "desliga". Veja o que está causando isso.

O código não está reproduzindo o problema o suficiente para você? Ou não está se reproduzindo?

 
traveller00:

Síncrono, presumo, não apenasOrderSend, mas todas as ordens comerciais incluindo modificação, exclusão, etc.?

Eu quis dizer MT5-OrderSend.

SymbolInfoTick não é aprovado, porque a ordem dos carrapatos pode ser estragada? E CopyTicks vai tudo exatamente na ordem correta.

Porque haverá buracos.

Então, o SymbolInfoTick é necessário apenas para verificação do tempo, só isso?

Sim.

Todo o comércio, etc., será feito somente porCopyTicks?

Somente.

Faz sentido tentar embalar vários EAs em 1 em 1 tabela? Nada impossível, mas tentar descobrir se vale a pena a maçada e a reescrita ou se o lucro será mínimo?

Isto é uma grande ajuda para mim.


Cada simples passe (em modo de teste único) no final escreve seus passos para o mesmo arquivo. Assim, depois de olhar alguns passes após a Otimização, recebo um arquivo com os dados desses passes. Depois os filtrei neste arquivo, deixando apenas o que parece bom. E eu simplesmente seleciono este arquivo usando o FileSelectDialog ao iniciar o robô. Assim, ele comercializa a carteira.


Acontece que a Otimização leva 20 minutos. Pré-visualização dos passes - 3 minutos. Seu filtro - 3 minutos. Lançamento do robô em operação - segundos. O robô não precisa ser compilado. Acompanhamento de versões e gráficos - de forma semelhante.

Na inicialização, posso ver o Relatório de cada conjunto. A qualquer momento eu posso ver o status do virtual e seu nome a partir do real, e a tecla de atalho HTML-Report detalhada tanto para o virtual quanto para o real. Tanto para um único conjunto, quanto para todo o portfólio.


Como as estatísticas comerciais dos Virtuals são especialmente escritas rapidamente, é possível comparar rapidamente conjuntos no local (a partir do teclado).

Arquivos anexados:
clip0184.gif  64 kb
Razão: