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

 
Roman:

OK, deixe-me reformular a frase. Dentro de mql é aproximadamente possível, dependendo da freqüência do relógio do processador.
E quanto ao PWM? -Um sinal de pulso de freqüência constante e ciclo de trabalho variável.
Isso não estabelece uma constante?

Primeiro, leia qual é a função do WinAPI Sleep, e o que ele realmente faz

O PS Windows não é um sistema em tempo real

 
Slava:

Primeiro, leia sobre qual é a função do WinAPI Sleep e o que ele realmente faz

O PS Windows não é um sistema em tempo real

O que a WinAPI Sleep tem a ver com isso?
Quando falamos de deslizamento de microssegundos
Individualmente, para seu processador você pode determinar a freqüência do temporizador e calcular o número de repetições.
Então, você pode escrever seu próprio MicrosecondCount em mql, mas qual é o objetivo? O padrão é suficiente.

MT5 и скорость в боевом исполнении
MT5 и скорость в боевом исполнении
  • 2020.10.10
  • www.mql5.com
MT5 - шустрая платформа. Но есть узкие горлышки, которые сводят на нет все старания быстрой торговли...
 
Roman:

Ahem, tenho vergonha de perguntar, o que o WinAPI Sleep tem a ver com isso?
Quando falamos de deslizamento de microssegundos
Individualmente, para seu processador, você pode definir a freqüência do temporizador e calcular o número de repetições.
Então, você pode escrever seu próprio MicrosecondCount em mql, mas qual é o objetivo? O padrão é suficiente.

Seu próprio deslizamento pendente sem mudança de contexto irá consumir seu núcleo 100%.

Este é um método de programação assustador. Deus proíba que tal código vaze para o mercado.

 
Renat Fatkhullin:

Seu deslizamento de espera sem mudança de contexto irá consumir seu núcleo 100%.

É um método de programação horrível. Deus proíba que tal código vaze para o mercado.

E ninguém negou isso hardcore ))
Se você mostrar um exemplo de mudança de contexto, talvez você possa melhorar?

Aqui está a carga de CPU para µsSLEEP (µsRange), no VirtualBox com apenas 2 núcleos, 4 roscas.
Os mineiros fazem pior do que isso ))

cp

 

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

Bibliotecas: Sequência

fxsaber, 2020.10.13 12:54

Um exemplo de um EA que irá matar a maioria dos VPS.
#include <fxsaber\Sequence.mqh> // https://www.mql5.com/ru/code/31446

#define  PRINT(A) Print(#A + " = " + (string)(A))

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

void OnInit()
{
  SEQUENCE Sequence; // Последовательный запуск расчетов
  
//  if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.
  {
    MqlTick Ticks[];
    
    PRINT(CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, (long)inFrom * 1000));
    PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
    
    Sleep(10000); // Ждем освобождения CopyTicks-данных.
  }
}


Estou executando-o em poucos gráficos de símbolos diferentes. Usei este roteiro com inAmount = 5 para automatizar esta ação.


Resultado.

2020.10.13 13:26:53.199 Test9 (AUDCAD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5406953
2020.10.13 13:26:53.326 Test9 (AUDCAD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 2838
2020.10.13 13:26:53.528 Test9 (EURCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 3430958
2020.10.13 13:26:53.807 Test9 (EURCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3144
2020.10.13 13:26:53.924 Test9 (EURUSD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4244747
2020.10.13 13:26:54.214 Test9 (EURUSD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3464
2020.10.13 13:26:54.344 Test9 (AUDCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4327679
2020.10.13 13:26:54.702 Test9 (AUDCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3797
2020.10.13 13:26:54.864 Test9 (GBPCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5340006
2020.10.13 13:26:55.457 Test9 (GBPCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 4308
2020.10.13 13:26:55.666 Test9 (EURAUD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 7730155
2020.10.13 13:26:55.756 Test9 (EURAUD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 4316

O Terminal requer mais de 4 Gb de memória para operar estes seis Conselheiros Especializados. Por favor, note que é necessário apenas para inicialização, não para a operação destes EAs. Imagine que você inicia o terminal com os Expert Advisors pendurados nele. Se você não tem 4 Gb de RAM disponíveis - é quase um desastre.


Agora vamos remover o comentário desta linha no código fonte.

  if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.

Assim, possibilitamos a inicialização seqüencial de Expert Advisors.


Vejamos o resultado (após a recompilação).

2020.10.13 13:27:24.002 Test9 (AUDCAD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5406980
2020.10.13 13:27:24.021 Test9 (AUDCAD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1234
2020.10.13 13:27:35.407 Test9 (EURUSD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4244772
2020.10.13 13:27:35.422 Test9 (EURUSD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1095
2020.10.13 13:27:46.886 Test9 (GBPCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5340072
2020.10.13 13:27:46.905 Test9 (GBPCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1224
2020.10.13 13:27:58.293 Test9 (AUDCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4327724
2020.10.13 13:27:58.310 Test9 (AUDCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1114
2020.10.13 13:28:09.683 Test9 (EURCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 3430999
2020.10.13 13:28:09.696 Test9 (EURCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1015
2020.10.13 13:28:21.339 Test9 (EURAUD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 7730313
2020.10.13 13:28:21.363 Test9 (EURAUD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1519


No início do Expert Advisors, conseguimos reduzir o consumo de memória do Terminal em mais de 2,5 Gb. A probabilidade de falhas de VPS (e computadores domésticos fracos) diminuiu significativamente.


Esta é a aparência de ambas as corridas na dinâmica.

O lançamento sequencial esticou a inicialização geral a tempo, mas conseguiu evitar que o Terminal consumisse enormes quantidades de RAM.


Osgráficos superior e inferior mostram claramente o processo de inicialização paralela (pico alto esquerdo) e seis inicializações consecutivas (seis picos médios).


ZZY Durante os experimentos, uma nuance desagradável com Sleep veio à tona - veja o código fonte.


Peço para, de alguma forma, permitir a liberação da memória pela força após o uso de CopyTicks. Não criar tais muletas para dormir.

 
Favor recomendar a maneira mais barata de consultar o histórico do tick em um determinado intervalo.
 
fxsaber:
Por favor, recomende a maneira mais barata de solicitar o histórico de carrapatos em um determinado intervalo.

parece-me que você não está procurando um barato, mas uma maneira de liberar a memória rapidamente

como uma opção a ser verificada:

- envolva a matriz dinâmica MqlTick Ticks[] na classe e crie um objeto com novo (isto é, também objeto dinâmico), apague-o quando você não precisar dele

- o mesmo, mas com estrutura, mas em âmbito local ( ou função ou bloco local { } - ou loop com uma iteração ? ), as estruturas não funcionam tão bem quanto as classes - eu reescrevi a maioria do meu código EA afastando-me das classes e substituindo-as por estruturas de dados, a velocidade de otimização aumentou significativamente - talvez seja um efeito subjetivo - talvez novas construções sejam mais rápidas

- tente adicionar ArrayFree() ao destruidor

 
Igor Makanu:

Eu não acho que você esteja procurando um barato, mas uma maneira de liberar a memória rapidamente

O Terminal não libera a memória. As variáveis MQL não têm nada a ver com isso.

 
fxsaber:

O terminal não está liberando a memória. As variáveis MQL não têm nada a ver com isso.

e se você forçar o tamanho = 1 ?

e se você fizer^

MqlTick  Tick[];
MqlTick  ZeroTick[1] = {0};
.....
ArrayResize(Tick,1);
ArrayCopy(Tick,ZeroTick)
 
Igor Makanu:

e se

Depois de chamar o CopyTicks, o terminal retém todos os dados na memória por alguns segundos. Só no caso de alguém querer reler um pedaço da história do tick.

Ou seja, a quantidade de memória assim consumida pelo terminal não depende do tamanho das variáveis MQL.


A tarefa é forçar o Terminal a liberar a memória.