Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1466

 

Boa tarde. Ao escrever um Expert Advisor no Mql5, encontrei um problema. Há um array com valores de abertura de candlesticks para o ano. Em cada candlestick desse array, preciso criar um array de n-candles, digamos 30, para verificar os altos e baixos. Algo como um indicador Zigzag.

Escrevi este código, que apresenta um erro: "matriz fora do intervalo" ou os valores de máximo e mínimo em toda a matriz, mas não no período necessário de 30 velas.

for(int i=0; i<ArraySize(opens); i++)
  {
    if(i+30<=ArraySize(opens))
      {
       double maximum=0;
       double minimum=9;
       for(int j=0; j<30; j++)
        {
         maximum = ArrayMaximum(opens, i, i+j);
         minimum = ArrayMaximum(opens, i, i+j);
        }
     }
  }

Talvez eu precise criar outra matriz para verificar nas funções ArrayMaximum() e ArrayMinimum(), mas estou confuso com os loops aninhados e o tamanho da matriz.

Por favor, me dê uma dica.

 
Dmitry Ivanushko #:
if(i+30<=ArraySize(opens))
if(i+30<ArraySize(opens))

Aqui está a saída fora da matriz

 
if(i+30<ArraySize(opens))

Esse erro se deve à falta de atenção. Corrigi-lo não resolve o problema.

Como posso criar uma matriz de 30 preços de abertura de candlestick para pesquisar máximos e mínimos nela?

 
Dmitry Ivanushko #:
ArrayMaximum
ArrayMaximum

Retorna índice do valor máximo, não o preço.

//+------------------------------------------------------------------+
int indexMax[];
int indexMin[];
int sizeArray = ArraySize(opens);
int size = 0;
int n = 30;

for(int i = n; i < sizeArray; i + n)
  {
   ArrayResize(indexMax, size + 1);
   indexMax[size] = ArrayMaximum(opens, i - n, i);
   indexMin[size] = ArrayMinimum(opens, i - n, i);
   size++;
  }
//+------------------------------------------------------------------+

Não verifiquei, mas parece ser a maneira de obter índices de mínimos e máximos de aberturas de candlestick (aberturas).

Embora você também possa obter o preço de uma só vez, mas não os índices.

double PriseMin = opens[ArrayMinimum(opens, i - n, i)];
 
for(int i = n; i < sizeArray; i + n)

Não encontrei em lugar algum um exemplo de loop mql com uma etapa. Isso simplifica toda a questão.

Somente o ChatGPT me aconselhou a escrever dessa forma:

for(int i = n; i < sizeArray; i += n)

Vou fazer mais experimentos. O código funciona. Obrigado.

O erro "array out of range" ocorre se você não fizer o ArrayResize.

 
Dmitry Ivanushko #:

Esse erro se deve à falta de atenção. A correção não resolve o problema.

Como posso criar uma matriz de 30 preços de abertura de candlestick para pesquisar máximos e mínimos nela?

Qual é o problema? Declare uma matriz temp[] e copie 30 elementos para ela e procure o índice do valor mínimo/máximo. E se, no final, for menor que 30, ele copiará quantos restarem. E, nesse caso, eu preferiria usar um loop while().

 
Alexey Viktorov #:
Qual é o problema? Declare uma matriz temp[] e copie 30 elementos para ela e procure o índice do valor mínimo/máximo. E se, no final, for menor que 30, ele copiará quantos ainda restam. E, nesse caso, eu preferiria usar um loop while().

Sim, você pode fazer isso. Não estou pensando direito, por isso estou pedindo conselhos.

 
Dmitry Ivanushko #:

Sim, você poderia fazer isso. Não estou pensando direito, por isso estou pedindo conselhos.

Em uma matriz estática, o tamanho é definido como constante, não pode ser alterado; em uma matriz dinâmica, ele pode ser alterado, mas o tamanho da matriz é definido! ou seja, o tamanho da matriz é conhecido e os índices dos elementos de 0 até o final. <= está fora dos limites apenas porque os índices dos elementos a partir de zero e o índice do último elemento são menores em uma unidade do tamanho da matriz.

Tudo está em suas mãos))))

 
Valeriy Yastremskiy #:

Em uma matriz estática, o tamanho é definido como constante e não pode ser alterado; em uma matriz dinâmica, ele pode ser alterado, mas o tamanho da matriz é definido, ou seja, o tamanho da matriz é conhecido e os índices dos elementos vão de 0 até o final. <= está fora dos limites apenas porque os índices dos elementos a partir de zero e o índice do último elemento são menores em uma unidade do tamanho da matriz.

Tudo está em suas mãos))))

O que você quer dizer comisso ? Você acha que para copiar um certo número de elementos de um array para outro, algum temp[], você deve definir o tamanho do array antes de copiar ArrayResize(temp, new_size); ?????

 
Dmitry Ivanushko #:

Sim, você poderia fazer isso. Não estou pensando direito, por isso estou pedindo conselhos.

Você nem precisa de um array temporário.

int  ArrayMaximum( 
   const void&   array[],             // массив для поиска 
   int           start=0,             // с какого индекса начинаем поиск 
   int           count=WHOLE_ARRAY    // количество проверяемых 
   );

Este código

  double open[];
  int copy = CopyOpen(_Symbol, PERIOD_CURRENT, 0, 100, open);
  int arrMaximum = ArrayMaximum(open, 85, 20);

procura o máximo de 15 elementos restantes, apesar do fato de estar configurado para procurar 20 elementos.

Portanto, é melhor usar o loop while() e não se preocupar com o número de itens restantes do array.