Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1496

 
maxvoronin74 #:
La tarea consiste en modificar WPR (Williams Percent Range) para obtener la diferencia de valores WPR para un período de tiempo arbitrario, independientemente de las barras.

Es posible (pero no seguro) que esto es lo que quería obtener.

   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);

Gracias. Esto es lo que he conseguido, si he entendido bien la lección:

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
Pero, por desgracia, en la línea bid_arr[i] = ticks[i].bid; el Asesor Experto se salió del gráfico debido a array fuera de rango en 'namemyexpert.mq5' (204,12).
 
maxvoronin74 #:

Gracias. Esto es lo que ha salido, si he aprendido bien la lección:

Como de todas formas estamos haciendo un bucle con todos los ticks, no podemos copiar en este bucle, sino buscar los máximos-mínimos de una vez.

Por cierto, si copiamos, sería bueno fijar primero los tamaños de los arrays donde copiamos, el bucle no lo hará por nosotros, saldremos volando del array en la primera iteración. Sólo CopyTicksRange redimensionará el propio array de destino.

 
JRandomTrader #:

Como de todas formas hacemos un ciclo con todos los ticks, no podemos copiar en este ciclo, sino buscar esos máximos-mínimos a la vez.

Por cierto, si copiamos, sería bueno establecer primero los tamaños de los arrays donde copiamos, el bucle no lo hará por nosotros, saldremos volando del array en la primera iteración. Sólo CopyTicksRange redimensionará el propio array de destino.

Soy un perfeccionista, ordenar elementos separados de un array de estructuras es como golpear un cristal con espuma de poliestireno.
Sobre el array sin asignar, tengo una buena razón. Es la una de la mañana y mi mujer me está diciendo al oído "es hora de dormir, es hora de dormir". ))))))
 
Aleksandr Slavskii #:
Soy un perfeccionista, ordenar elementos individuales de un array de estructuras es como golpear vidrio con espuma de poliestireno.
Sobre el array no distribuido, tengo una buena razón. La hora es la una de la mañana y mi esposa está en mi oído con las palabras "es hora de dormir, es hora de dormir". ))))))
Qué, de noche o de mañana un higo).
Sí, tienes razón en lo de buscar el máximo de una vez. Así es mucho más cómodo. Esta mañana estoy un poco tonto.
 
JRandomTrader #:

Como de todas formas hacemos un ciclo con todos los ticks, no podemos copiar en este ciclo, sino buscar esos máximos-mínimos a la vez.

Por cierto, si copiamos, sería bueno establecer primero los tamaños de los arrays donde copiamos, el bucle no lo hará por nosotros, saldremos volando del array en la primera iteración. Sólo CopyTicksRange redimensionará el propio array de destino.

Perdón. Mi falta de atención. Corregido. Gracias. Olvidé que el valor ArrayMaximum es un índice, no un precio. Pero ya está corregido.

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 ArrayMaximum no funcionaba con la matriz de ticks, probé cálculos alternativos, con if en un bucle. ¿Por qué es mejor así?

 
maxvoronin74 #:

¿Por qué es mejor?

   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;
     }
 
Aleksandr Slavskii #:
Gracias, señor.
 
Me pregunto si se podría colocar un objeto gráfico de texto, por ejemplo, en la barra lateral de una subventana con un gráfico WPR.
 
maxvoronin74 #:
Me pregunto si se puede colocar un objeto gráfico de texto, por ejemplo, en la escala lateral de una subventana con un gráfico WPR.

No, no funcionará en la escala. Puede colocarlo en la ventana del indicador muy cerca de la escala, pero no en la escala propiamente dicha.