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

 
Renat Akhtyamov:
Cavalheiros do programa...
Leia primeiro sobre alocação de memória no computador, depois como e por que meios é feita, depois como limpar e ler de e para não é difícil. Pelo menos sugestões mais razoáveis para os desenvolvedores são possíveis

Você não saberia disso no mt4 ?
Você mesmo usa o Ask Bid pré-definido ?
Em mt5 para toda aestrutura MqlTick eles estão faltando por alguma razão.
Chame a função, preencha a estrutura e só então obtenha o valor.
Ou imediatamente obter o valor, há alguma diferença?

Ou não está na minha direção?
Você deve ao menos indicar para quem você está escrevendo ))

 
Roman:

Variáveis pré-definidas, para o tick atual, provavelmente seriam melhores.

Os desenvolvedores já explicaram anteriormente que existe uma limitação fundamental ao acesso direto

void f()
{
        MqlTick t1 = _Tick;
        MqlTick t2 = _Tick;
}

e em geral, t1 não é igual a t2. Além disso, os valores de campo dentro de ambos t1 e t2 podem acabar se referindo a diferentes carrapatos

 
A100:

Os desenvolvedores já explicaram anteriormente que existe uma limitação fundamental ao acesso direto

e em geral t1 não é igual a t2. Além disso, os valores de campo dentro de t1 e t2 podem se referir a diferentes carrapatos, embora sejam campos ligados (eles devem se referir ao mesmo carrapato).

Brr, qual é a limitação fundamental?
A estrutura em seu exemplo é desnecessária, não precisa ser preenchida.

Um valor veio do soquete e foi escrito na variável _Ask, _Bid, etc., de acordo com a estrutura.
_Ask != _Ask na sua opinião?
Uma restrição ocorre se você preencher a estrutura, o que leva algum tempo.
Você não precisa preenchê-lo, mas dê_Ask, _Bid, etc. diretamente.

 
Roman:

Brr, qual é a principal limitação?
A estrutura em seu exemplo é desnecessária aqui, não precisa ser preenchida.

void f()
{
        double ask1 = _Ask;
        double ask2 = _Ask;
}

Você pode reescrevê-lo sem estrutura. No caso geral, perguntar1 não é igual a perguntar2

 
A100:

Você também pode reescrevê-lo sem a estrutura. No caso geral, perguntar1 não é igual a perguntar2

Isto é, são solicitações ao ambiente não-síncrono, e a resposta é recebida pelo estado atual do ambiente? E OnTick está pegando o tique atual e trabalhando na EA, mas ao mesmo tempo os pedidos pela estrutura do tique quando a EA está trabalhando podem obter respostas a partir dos próximos tiquetaques?

 
A100:

Você também pode reescrevê-lo sem a estrutura. Em geral, pedir1 não é igual a pedir2

Assim você não precisa usar 100500 dígitos, onde o último dígito de um número real difere 0,0000000000000000000001
Para cada variável um dígito diferente, para o preço dobrar no máximo 8.

 
Renat Fatkhullin:

Lançado o beta 2652, de importância:

  • interrupções de compilação melhoradas (em 22%)
  • acesso ao SymbolInfoTick com uma velocidade dramática.

22% bom.

SymbolInfoTick - na minha máquina de casa, notei de perto que não alertava. No entanto, fez um filtro desses alertas no Diário de Bordo e viu que havia muito mais do que os 2650 emitidos durante o mesmo período vinte e quatro horas atrás.

Enviou ambos os logs para o PM.

 
Valeriy Yastremskiy:

Isto é, são solicitações a um ambiente não-síncrono, e a resposta é baseada no estado atual do ambiente? E OnTick está pegando o tick atual e trabalhando na EA, mas as solicitações pela estrutura do tick quando a EA está trabalhando pode obter respostas a partir dos próximos tick?

Sim.

 
Renat Fatkhullin:

Para trabalho em massa, coloque mais memória.

4gb (preço de 20 euros) está longe de ser bom em 2020 quando se trata de análise e pesquisa.

Estamos falando de uma chamada única para CopyTicks. É feito para fazer um backtest virtual destes carrapatos no OnInit, e depois para continuar em tempo real, alimentando apenas carrapatos frescos.

Como um compromisso, proponho liberar a memória no Terminal imediatamente após os CopyTicks terem sido chamados no OnInit. Então não temos que introduzir uma função de resfriamento forçado para o CopyTicks.

Neste momento, a versão de esfriamento do sono é muito mudo. Mas eu mostrei acima como esta muleta salva a memória.


Agora acontece que 20 Expert Advisors correm rápido mesmo em VPS lentos. Mas iniciá-los é um problema sério.


Aqui está um Expert Advisor que mostra o problema.

// Демонстрация 10-ти секундного удержания в памяти ненужных данных CopyTicks.
#define  PRINT(A) Print(#A + " = " + (string)(A))

input datetime inFrom = D'2020.06.01'; // С какой даты анализировать историю

int OnInit()
{
  MqlTick Ticks[];
  
  Print("Before CopyTicks:");
  PRINT(MQLInfoInteger(MQL_MEMORY_USED));     
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
  
  PRINT(CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, (long)inFrom * 1000));
  ArrayFree(Ticks);
  
  Print("After CopyTicks:");
  
  for (int i = 0; i < 10; i++)
  {
    PRINT(i);
    PRINT(MQLInfoInteger(MQL_MEMORY_USED));    
    PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
    
    Sleep(1000);
  }
  
  return(INIT_FAILED);
}


Resultado.

2020.10.14 08:49:24.016 Before CopyTicks:
2020.10.14 08:49:24.016 MQLInfoInteger(MQL_MEMORY_USED) = 0
2020.10.14 08:49:24.031 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 864
2020.10.14 08:49:25.399 CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 14372119
2020.10.14 08:49:25.465 After CopyTicks:
2020.10.14 08:49:25.465 i = 0
2020.10.14 08:49:25.465 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:25.499 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:26.594 i = 1
2020.10.14 08:49:26.594 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:26.630 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:27.729 i = 2
2020.10.14 08:49:27.729 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:27.762 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:28.852 i = 3
2020.10.14 08:49:28.852 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:28.884 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:29.977 i = 4
2020.10.14 08:49:29.977 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:30.009 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:31.102 i = 5
2020.10.14 08:49:31.102 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:31.136 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:32.224 i = 6
2020.10.14 08:49:32.225 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:32.257 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:33.348 i = 7
2020.10.14 08:49:33.348 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:33.381 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:34.468 i = 8
2020.10.14 08:49:34.468 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:34.501 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:35.593 i = 9
2020.10.14 08:49:35.593 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:35.605 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 860
 
fxsaber:

22% - multa.

SymbolInfoTick - na máquina doméstica notei a olho nu que não havia alertas. No entanto, fez um filtro desses alertas no Diário de Bordo e viu que havia muito mais do que os 2650 emitidos durante o mesmo período vinte e quatro horas atrás.

Enviou ambos os logs para o PM.

Aceleração por um fator de dez em casos de acesso paralelo em massa.

Para outros casos somente atualização de processador, memória e sistema operacional.