Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1883

 

Eu queria contornar a necessidade de redimensionar manualmente a matriz dinâmica simplesmente atribuindo-a como um buffer indicador. Mas não posso me livrar do ArrayResize() como se fosse um conjunto dinâmico de buffer indicador cujo tamanho deveria ser monitorado pelo próprio terminal e que não deveria ser redimensionado manualmente:

https://www.mql5.com/ru/docs/series/bufferdirection:

Индикаторный буфер представляет из себя динамический массив типа double, размером которого управляет клиентский терминал с тем, чтобы он всегда соответствовал количеству баров, на которых индикатор рассчитывается. Обычный динамический массив типа double назначается в качестве индикаторного буфера с помощью функции SetIndexBuffer(). Для индикаторных буферов не требуется задавать размер с помощью функции ArrayResize(), исполняющая система терминала сама позаботится об этом.

Vamos a https://www.mql5.com/ru/docs/array/arrayisdynamic, corremos o código e de repente descobrimos isso:

2022.01.24 21:25:27.543 t (NZDUSD,D1) 3. Verificação do buffer indicador:

2022.01.24 21:25:27.543 t (NZDUSD,D1) Tamanho antes do lançamento da memória = 7278

2022.01.24 21:25:27.543 t (NZDUSD,D1) Esta é uma matriz dinâmica = Nenhuma

2022.01.24 21:25:27.543 t (NZDUSD,D1) Tamanho após o lançamento da memória = 0

ao mesmo tempo:

double ExtBuff[];      // индикаторный буфер
SetIndexBuffer(0,ExtBuff);

Eu olho no livro - eu vejo um figo. Ou fomos enganados durante todo este tempo?

Ou talvez seja dinâmico uma vez (na primeira inicialização) e depois é só isso?

 
x572intraday #:

Não consigo me livrar do ArrayResize(), que é supostamente um conjunto dinâmico de buffer indicador cujo tamanho deve ser monitorado pelo próprio terminal e que supostamente não precisa ser redimensionado manualmente:

https://www.mql5.com/ru/docs/series/bufferdirection:

Vamos a https://www.mql5.com/ru/docs/array/arrayisdynamic, corremos o código e de repente descobrimos isso:

Ao mesmo tempo:

Eu olho no livro - eu vejo um figo. Ou fomos enganados durante todo este tempo?

Ou talvez seja dinâmico uma vez (na primeira inicialização) e depois é só isso?

22:23:17.002 EURCAD dinâmico,H1: + +

0 22:23:17.002 EURCAD dinâmico,H1: 1. Verificação de uma matriz dinâmica:

0 22:23:17.002 EURCAD,H1 dinâmico: Tamanho antes do lançamento da memória = 100

0 22:23:17.002 EURCAD,H1 Dinâmico: Este é o Dynamic Array = Sim

0 22:23:17.002 EURCAD,H1 dinâmico: Tamanho após memória livre = 0

0 22:23:17.002 EURCAD dinâmico,H1: 2. Verificação da matriz estática:

0 22:23:17.002 EURCAD,H1 dinâmico: Tamanho antes da memória livre = 100

0 22:23:17.002 EURCAD dinâmico,H1: Esta é uma matriz dinâmica = Nenhuma

0 22:23:17.002 EURCAD,H1 dinâmico: Tamanho após memória livre = 0

0 22:23:17.002 EURCAD dinâmico,H1: 3. Verificar o buffer indicador:

0 22:23:17.002 EURCAD,H1 dinâmico: Tamanho antes da memória livre = 2725

0 22:23:17.002 EURCAD dinâmico,H1: Esta é uma matriz dinâmica = Sim

0 22:23:17.002 EURCAD,H1 dinâmico: Tamanho após o lançamento da memória = 0

0 22:23:24.754 EURCAD,H1 dinâmico: razão uninit 1

0 22:23:24.758 Indicador personalizado EURCAD,H1 dinâmico: removido

Esta é a 4.

 
x572intraday #:

Eu queria contornar a necessidade de redimensionar manualmente a matriz dinâmica simplesmente atribuindo-a como um buffer indicador. Mas não posso me livrar do ArrayResize() como se fosse um conjunto dinâmico de buffer indicador cujo tamanho deveria ser monitorado pelo próprio terminal e que não deveria ser redimensionado manualmente:

https://www.mql5.com/ru/docs/series/bufferdirection:

Vamos a https://www.mql5.com/ru/docs/array/arrayisdynamic, corremos o código e de repente descobrimos isso:

Ao mesmo tempo:

Eu olho no livro - eu vejo um figo. Ou fomos enganados todo esse tempo?

Ou talvez seja uma vez dinâmico (na primeira inicialização) e depois é só isso?

sim, então é isso :-)

...após SetIndexBuffer é impossível usar o ArrayResize e do ponto de vista do programa, o array é estático, com um tamanho pré-definido (controlado externamente)

 
Alekseu Fedotov #:

22:23:17.002 EURCAD dinâmico,H1: + +

0 22:23:17.002 EURCAD dinâmico,H1: 1. Verificação de uma matriz dinâmica:

0 22:23:17.002 EURCAD,H1 dinâmico: Tamanho antes do lançamento da memória = 100

0 22:23:17.002 EURCAD,H1 Dinâmico: Este é o Dynamic Array = Sim

0 22:23:17.002 EURCAD,H1 dinâmico: Tamanho após memória livre = 0

0 22:23:17.002 EURCAD dinâmico,H1: 2. Verificação da matriz estática:

0 22:23:17.002 EURCAD,H1 dinâmico: Tamanho antes da memória livre = 100

0 22:23:17.002 EURCAD dinâmico,H1: Esta é uma matriz dinâmica = Nenhuma

0 22:23:17.002 EURCAD,H1 dinâmico: Tamanho após memória livre = 0

0 22:23:17.002 EURCAD dinâmico,H1: 3. Verificar o buffer indicador:

0 22:23:17.002 EURCAD,H1 dinâmico: Tamanho antes da memória livre = 2725

0 22:23:17.002 EURCAD dinâmico,H1: Esta é uma matriz dinâmica = Sim

0 22:23:17.002 EURCAD,H1 dinâmico: Tamanho após o lançamento da memória = 0

0 22:23:24.754 EURCAD,H1 dinâmico: razão uninit 1

0 22:23:24.758 Indicador personalizado EURCAD,H1 dinâmico: removido

Esta é a 4.

Fantástico! O que é esta magia? Acabei de verificar o EURCAD,H1 - novamente não.

E o que é 4? Há apenas três pontos no exemplo.

 
x572intraday #:

Fantástico! Qual é a magia? Acabei de verificar no EURCAD,H1 - "Não" novamente.

E o que é 4? Há apenas três pontos no exemplo.

Terminal MT4

 
x572intraday #:

Fantástico! O que é esta magia? Acabei de verificar no EURCAD,H1 - "Não" novamente.

E o que é 4? Há apenas três pontos no exemplo.

0 23:33:06.088 teste (EURUSD,D1) +============================+

0 23:33:06.088 teste (EURUSD,D1) 1. Verificação da matriz dinâmica:

0 23:33:06.088 teste (EURUSD,D1) Tamanho antes do lançamento da memória = 100

0 23:33:06.088 teste (EURUSD,D1) Esta é uma matriz dinâmica = Sim

0 23:33:06.088 teste (EURUSD,D1) Tamanho após o lançamento da memória = 0

0 23:33:06.088 teste (EURUSD,D1) 2. Teste estático da matriz:

0 23:33:06.088 teste (EURUSD,D1) Tamanho antes da memória livre = 100

0 23:33:06.088 test (EURUSD,D1) Esta é uma matriz dinâmica = Nenhuma

0 23:33:06.088 teste (EURUSD,D1) Tamanho após o lançamento da memória = 100

0 23:33:06.088 teste (EURUSD,D1) 3. Verificar buffer indicador:

0 23:33:06.088 teste (EURUSD,D1) Tamanho antes da memória livre = 1054

0 23:33:06.088 test (EURUSD,D1) Esta é uma matriz dinâmica = Nenhuma

0 23:33:06.088 teste (EURUSD,D1) Tamanho após o lançamento da memória = 0


Terminal MT5, sem pensamentos.

 
x572intraday #:

Eu queria contornar a necessidade de redimensionar manualmente a matriz dinâmica simplesmente atribuindo-a como um buffer indicador. Mas não posso me livrar do ArrayResize() como se fosse um conjunto dinâmico de buffer indicador cujo tamanho deveria ser monitorado pelo próprio terminal e que não deveria ser redimensionado manualmente:

https://www.mql5.com/ru/docs/series/bufferdirection:

Vamos a https://www.mql5.com/ru/docs/array/arrayisdynamic, corremos o código e de repente descobrimos isso:

Ao mesmo tempo:

Eu olho no livro - eu vejo um figo. Ou fomos enganados durante todo este tempo?

Ou talvez seja dinâmico uma vez (na primeira inicialização) e depois é só isso?

A matriz tampão é dinâmica. Na MQL, as matrizes dinâmicas têm sinais de objetos, tanto quanto eu entendi enquanto trabalhava com eles (como em idiomas de nível ultra-alto). Mas se você declarar uma matriz dinâmica como um buffer (usando SetIndexBuffer), esta área de memória se tornará reservada. É por isso que a maioria das funções padrão não pode mudar seu tamanho. Eu às vezes uso conjuntos de objetos como amortecedores indicadores. E se o fizer, a memória de tais arrays é liberada no destruidor do objeto. Assim, é permitida a liberação de memória tampão indicador pela própria aplicação(ou objeto). Mas isso não significa que a matriz possa ser liberada durante a operação do indicador. Tudo deve ser feito com sabedoria.

 

Tarde

Você pode me aconselhar, estou tentando escrever um Consultor Especialista, e quando eu testo acontece uma coisa estranha...

Eu tenho uma função

CalcAngleTrend(NormalizeDouble((a[0]-a[1]), MA_DIGITS));

double CalcAngleTrend(double d)
 {
  double a = (double) ((atan(d*pow(10,_Digits-2)))*(180/M_PI)*coefAngle);
Print("d: ", d);
  return(NormalizeDouble(a, ANGLE_DIGITS));
 }

Qual é a situação, eu corro uma instância da EA em um gráfico, e corro a segunda no modo de depuração no mesmo gráfico com o MT4
Os dados de entrada para a função são os mesmos, mas os dados de saída são diferentes!!!? Eu simplesmente não entendo algo, parece que...(

Это выдает запущеный вариант:

2022.01.25 15:01:12.880 USDJPY,M5: d: 0.0014887
2022.01.25 15:01:12.880 USDJPY,M5: d: -0.0060861
2022.01.25 15:01:12.880 USDJPY,M5: Angle Slow: +1.70580000
2022.01.25 15:01:12.880 USDJPY,M5: Angle Fast: -6.96560000

это в режиме отладки:

2022.01.25 15:01:14.330 USDJPY,M5: d: 0.0014887
2022.01.25 15:01:14.330 USDJPY,M5: d: -0.0060861
2022.01.25 15:01:14.330 USDJPY,M5: Angle Slow: +4.26450000
2022.01.25 15:01:14.330 USDJPY,M5: Angle Fast: -17.41390000

me aconselhe qual o caminho a ser seguido para obter informações!!!

PS: calculou a diferença de exatamente 2,5 vezes a produção
 
Владимир Казаков escrever um Consultor Especialista, e quando eu testo acontece uma coisa estranha...

Eu tenho uma função

Qual é a situação, eu corro uma instância da EA em um gráfico, e corro a segunda no modo de depuração no mesmo gráfico com o MT4
Os dados de entrada para a função são os mesmos, mas os dados de saída são diferentes!!!? Eu simplesmente não entendo algo, parece que...(

você pode me dizer qual o caminho a ser percorrido para obter informações?!

PS: calculou a diferença de exatamente 2,5 vezes a produção

É tudo uma questão de fórmula para calcular o ângulo. No código pode ser visto que para seu cálculo utilizou apenas uma coordenada e algum coeficiente, cuja finalidade não é clara. O que é isto? Por favor, elabore os dados que você está utilizando para calcular o ângulo.

 
É possível ter várias listas de relógios (visões gerais do mercado) em Metatrader? Por exemplo, um para os índices, outro para as ações
Razão: