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

 
Aleksandr Slavskii #:

"Find the maximum value in the ticks array" - o valor máximo do que estamos encontrando?

ticks[copied-1].bid ou ticks[copied-1].flags

Brincadeira)))))


Provavelmente você confundiu CopyTicks com CopyRates, embora lá você também tenha uma matriz de estruturas e especifique qual elemento da estrutura você precisa.

double PrevClose = rates[copied-1].close;

Você tem uma linha extra em seu código.

Você não precisa dela porque CopyTicks e CopyRates alocam o próprio tamanho da matriz ao copiar.

Obrigado pela dica. Eu não sabia. Estou inserindo essa linha por precaução.

Entendi corretamente sua piada de que nas taxas todos os preços são calculados pela média e levam em conta a barra, enquanto nos ticks não? É por isso que considerei o tick como um intervalo de tempo arbitrário, e não os preços das barras. CopyRates em minha fórmula semelhante preencheu a variável copiada com o valor máximo do tipo ulong para o intervalo de horas. Também não consegui resolver esse problema.

 
maxvoronin74 #:

Obrigado pela dica. Eu não sabia. Estou inserindo esta linha por precaução.

Entendi corretamente sua piada de que as taxas têm todos os preços calculados pela média e levam em conta a barra, mas os ticks não? É por isso que considerei o tick como um intervalo de tempo arbitrário, e não os preços da barra. CopyRates em minha fórmula semelhante preencheu a variável copiada com o valor máximo do tipo ulong para o intervalo de horas. Também não consegui resolver esse problema.

Tudo está errado.

MqlRates é uma estrutura, e você a trata como uma variável.

MqlTick também é uma estrutura.

Você está tentando combinar warm e soft, portanto o compilador não o entende.

Nem eu)))))

Talvez eu possa sugerir algo útil, mas não está claro no seu código o que você está tentando encontrar.

 
Aleksandr Slavskii #:

Está tudo errado.

MqlRates é uma estrutura, e você a trata como uma variável.

MqlTick também é uma estrutura.

Você está tentando combinar warm e soft, portanto o compilador não o entende.

Nem eu))))

Talvez eu possa sugerir algo útil, mas não está claro no seu código o que você está tentando encontrar.

A tarefa é modificar o WPR (Williams Percent Range) para obter a diferença dos valores de WPR em um período de tempo arbitrário, independentemente das barras.
 
maxvoronin74 #:
A tarefa é modificar o WPR (Williams Percent Range) para obter a diferença dos valores de WPR em um período de tempo arbitrário, independentemente das barras.

É possível (mas não certo) que seja isso que você deseja obter.

   MqlTick ticks[];
   int copied = CopyTicksRange(Symbol(), ticks, COPY_TICKS_INFO, t0, t1);
   double bid[];
   for(int i = 0; i < copied; i++)
      bid[i] = ticks[i].bid;
   double PrevClose = bid[copied - 1]; // Получаем последний элемент массива как значение PrevClose
   double highestHigh = ArrayMaximum(bid, 0, copied); // Находим максимальное значение в массиве ticks
   double lowestLow = ArrayMinimum(bid, 0, copied); // Находим минимальное значение в массиве ticks
 
Aleksandr Slavskii #:
double lowestLow = ArrayMinimum(bid, 0, copied);

Obrigado. Aqui está o que obtive, se entendi a lição corretamente:

MqlTick ticks[];
int copied=CopyTicksRange(Symbol(),ticks,COPY_TICKS_INFO,t0,t1);
double bid_arr[];
double ask_arr[];
for(int i = 0; i < copied; i++)
{
   bid_arr[i] = ticks[i].bid;
   ask_arr[i] = ticks[i].ask;
}
double highestBid = ArrayMaximum(bid_arr, 0, copied-1);
double lowestBid = ArrayMinimum(bid_arr, 0, copied-1);
double highestAsk = ArrayMaximum(ask_arr, 0, copied-1);
double lowestAsk = ArrayMinimum(ask_arr, 0, copied-1);
double highestHigh = (highestBid+highestAsk)/2; // Средняя наибольшего ask и наибольшего bid элемента
double lowestLow = (lowestBid+lowestAsk)/2; // Средняя наименьшего ask и наименьшего bid элемента
double PrevClose = (bid_arr[copied-1]+ask_arr[copied-1])/2; // Средняя ask и bid последнего элемента
double WPR_Past = -100 * (NormalizeDouble((highestHigh - PrevClose) / (highestHigh - lowestLow),_Digits)); // Формула предыдущего WPR
Mas, infelizmente, na linha bid_arr[i] = ticks[i].bid; o Expert Advisor saiu do gráfico por causa da matriz fora do intervalo em 'namemyexpert.mq5' (204,12).
 
maxvoronin74 #:

Obrigado. Aqui está o resultado, se eu tiver aprendido minha lição corretamente:

Como estamos percorrendo todos os ticks de qualquer forma, não podemos copiar nesse loop, mas procurar os valores máximos e mínimos de uma vez.

A propósito, se copiarmos, seria bom definir primeiro os tamanhos das matrizes em que copiamos, pois o loop não fará isso por nós, pois sairemos da matriz na primeira iteração. Somente CopyTicksRange redimensionará o próprio array de destino.

 
JRandomTrader #:

Como passamos por todos os ticks de qualquer forma, não podemos copiar nesse ciclo, mas procurar essas máximas e mínimas de uma só vez.

A propósito, se copiarmos, seria bom definir primeiro os tamanhos das matrizes em que copiamos, pois o loop não fará isso por nós, pois sairemos da matriz na primeira iteração. Somente CopyTicksRange redimensionará a própria matriz de destino.

Sou perfeccionista, classificar elementos separados de um array de estruturas é como bater em vidro com isopor.
Sobre o array não alocado, tenho um bom motivo. É uma hora da manhã e minha esposa está em meu ouvido dizendo "é hora de dormir, é hora de dormir". ))))))
 
Aleksandr Slavskii #:
Sou perfeccionista, classificar elementos individuais de uma matriz de estruturas é como bater em vidro com isopor.
Quanto à matriz não distribuída, tenho um bom motivo. É uma hora da manhã e minha esposa está em meu ouvido com as palavras "é hora de dormir, é hora de dormir". ))))))
O que, noite ou manhã um figo).
Sim, você está certo sobre procurar o máximo de uma vez. É muito mais conveniente dessa forma. Estou um pouco burro hoje de manhã.
 
JRandomTrader #:

Como fazemos o ciclo de todos os ticks de qualquer forma, não podemos copiar nesse ciclo, mas procurar essas máximas e mínimas de uma só vez.

A propósito, se copiarmos, seria bom definir primeiro os tamanhos das matrizes em que copiamos, pois o loop não fará isso por nós, pois sairemos da matriz na primeira iteração. Somente CopyTicksRange redimensionará o próprio array de destino.

Desculpe-me. Minha desatenção. Corrigido. Obrigado. Esqueci que o valor ArrayMaximum é um índice, não um preço. Mas agora está corrigido.

MqlTick ticks[];
int copied=CopyTicksRange(Symbol(),ticks,COPY_TICKS_INFO,t0,t1);
double bid_arr[];
ArrayResize(bid_arr,copied,100000);
double ask_arr[];
ArrayResize(ask_arr,copied,100000);
for(int i = 0; i < copied; i++)
{
   bid_arr[i] = ticks[i].bid;
   ask_arr[i] = ticks[i].ask;
}
int IndMaxBid = ArrayMaximum(bid_arr, 0, copied-1); // Индекс элемента массива bid_arr с максимальной ценой
double highestBid = bid_arr[IndMaxBid]; // Самая высокая цена bid за период
int IndMinBid = ArrayMinimum(bid_arr, 0, copied-1); // Индекс элемента массива bid_arr с минимальной ценой
double lowestBid = bid_arr[IndMinBid]; // Самая низкая цена bid за период
int IndMaxAsk = ArrayMaximum(ask_arr, 0, copied-1); // Индекс элемента массива ask_arr с максимальной ценой
double highestAsk = ask_arr[IndMaxAsk]; // Самая высокая цена ask за период
int IndMinAsk = ArrayMinimum(ask_arr, 0, copied-1); // Индекс элемента массива ask_arr с минимальной ценой
double lowestAsk = ask_arr[IndMinAsk]; // Самая низкая цена ask за период
double highestHigh = (highestBid+highestAsk)/2; // Средняя наибольшего ask и наибольшего bid элемента
double lowestLow = (lowestBid+lowestAsk)/2; // Средняя наименьшего ask и наименьшего bid элемента
double PrevClose = (bid_arr[copied-1]+ask_arr[copied-1])/2; // Средняя ask и bid последнего элемента
double WPR_Past = -100 * (NormalizeDouble((highestHigh - PrevClose) / (highestHigh - lowestLow),_Digits)); // Формула предыдущего WPR

Como o ArrayMaximum não funcionou com a matriz de ticks, tentei cálculos alternativos, com if em um loop. Por que isso é melhor?

 
maxvoronin74 #:

Por que é melhor?

   MqlTick ticks[];
   int copied = CopyTicksRange(Symbol(), ticks, COPY_TICKS_INFO, t0, t1);
   double highestHigh = 0, lowestLow = DBL_MAX;
   for(int i = 0; i < copied; i++)
     {
      if(highestHigh < ticks[i].ask) // Находим максимальное значение в массиве ticks
         highestHigh = ticks[i].ask;
      if(lowestLow > ticks[i].bid) // Находим минимальное значение в массиве ticks
         lowestLow = ticks[i].bid;
     }