"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.
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.
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]; // Получаем последний элемент массива как значение PrevClosedouble highestHigh = ArrayMaximum(bid, 0, copied); // Находим максимальное значение в массиве ticksdouble 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).
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.
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ã.
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?
"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.
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.
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.
É possível (mas não certo) que seja isso que você deseja obter.
double lowestLow = ArrayMinimum(bid, 0, copied);
Obrigado. Aqui está o que obtive, se entendi a lição corretamente:
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).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.
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 individuais de uma matriz de estruturas é como bater em vidro com isopor.
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.
Como o ArrayMaximum não funcionou com a matriz de ticks, tentei cálculos alternativos, com if em um loop. Por que isso é melhor?
Por que é melhor?