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

 
Andrey Koldorkin:

Veré lo que puedo averiguar. Gracias.

De nada. Simplemente guarda todos los altos en un array, y luego imprime todos los datos guardados en el array en el registro en un bucle.

Este script no necesariamente hace exactamente lo que necesitas que haga. Simplemente muestra cómo se almacenan los datos en la matriz.

 
Artyom Trishkin:

En absoluto. Simplemente guarda todas las altas en un array y luego imprime todos los datos guardados en el array en un bucle en el diario.

Este script no necesariamente hace exactamente lo que necesitas. Sólo muestra el principio de guardar datos en un array.

Eso es exactamente lo que estaba buscando. Necesitaba que, de alguna manera, guardara los datos en un array para el periodo que eligiera. Esa es la parte que entendí de ti.

Ahora mi pregunta es, ¿CÓMO puedo acceder y comparar los datos registrados en la matriz?

Aquí resulta iterar, escribir el array paso a paso. Esto es bueno. Pero ahora tenemos que comparar los elementos entre sí.

¿Es necesario declarar un nuevo recuento de iteraciones y luego recuperar los datos y compararlos de alguna manera? Pero esto de nuevo tiene que escribir los resultados en alguna parte y ... todo se repite al final.

A grandes rasgos, si el período de comparación es de 5 a 7 velas, entonces la primera debe ser comparada con otras 6, luego la segunda y así sucesivamente.... Y si dos o más de ellos tienen un Alto igual, entonces en primer lugar, debe calcular este Alto, y en segundo lugar, debe encontrar la vela con el Bajo más bajo. Es decir, la función de llamar a velas concretas al final para obtener todos sus parámetros.

¿Es posible hacer esto en general?

 
Andrey Koldorkin:

eso es exactamente lo que estaba buscando. Lo que necesitaba era guardar de alguna manera los datos en un array para el periodo que estaba seleccionando. Entendí esa parte.

Ahora mi pregunta es, ¿CÓMO puedo acceder y comparar los datos registrados en la matriz?

Aquí resulta iterar, escribir el array paso a paso. Esto es bueno. Pero ahora tenemos que comparar los elementos entre sí.

¿Es necesario declarar un nuevo recuento de iteraciones y luego recuperar los datos y compararlos de alguna manera? Pero esto de nuevo tiene que escribir los resultados en alguna parte y ... todo se repite al final.

A grandes rasgos, si el período de comparación es de 5 a 7 velas, entonces la primera debe ser comparada con otras 6, luego la segunda y así sucesivamente.... Y si dos o más de ellos tienen un Alto igual, entonces en primer lugar, debe calcular este Alto, y en segundo lugar, debe encontrar la vela con el Bajo más bajo. Es decir, la función de llamar a velas concretas al final para obtener todos sus parámetros.

¿Pero es posible hacerlo?

Aquí sólo estamos interrogando a la matriz guardada y mostrando todos los datos guardados en el registro:

for(int i=0; i<ArrayRange(mass_high,0); i++) {
   printf("Время: %s, High: %.5f",TimeToString((int)mass_high[i][1],TIME_DATE|TIME_MINUTES),mass_high[i][0]);
   }

Seamos más específicos sobre la tarea:

Tenemos que encontrar... ¿qué es exactamente lo que hay en la matriz guardada?

 
Artyom Trishkin:

Aquí se interroga a la matriz guardada y se registran todos los datos guardados:

Seamos específicos sobre la tarea:

Necesitamos encontrar en la matriz guardada... ¿qué exactamente?

Necesito registrar una matriz de datos para todas las velas cerradas (es decir, la actual no se cuenta) - velas altas, bajas, abiertas y cerradas (4 parámetros) para el período que se especifica en la configuración. - lo es.

A continuación, tengo que comparar los parámetros. Supongamos que el periodo de búsqueda es igual a 10 velas. Aquí tenemos que comprobar todos los altos para el período de 10 velas. Si hay dos o más coincidencias, debemos volver:

1. Bandera - "Hay una coincidencia".

1. El valor alto en el que los candelabros tienen el mismo valor.

2. Números de estos candeleros, para que podamos referirnos a ellos y encontrar los parámetros de Low, Close, Open para ellos.

En general, entiendo mucho de este cómo hacerlo.

Lo que no está claro es cómo referirse a las velas que forman el nivel. Lo ideal sería que al recalcular, pudiéramos memorizar el número de iteración (i) pero antes hay un recálculo según el cual se escribe el registro y no se puede aplicar.

Y en esa variante, como los registros de salida - aquí, también, no es lo que se requiere.

Entiendo que tengo que tomar primero una vela 1 y compararla con otras 9, si hay una coincidencia, entonces extraer los números de estas velas y sus parámetros, activar la casilla. A continuación, compruebe la vela 2 con las otras y así hasta la mitad de la muestra, ya que entonces irán duplicados de comparaciones sólo desde el otro lado.

Si el número de velas fuera fijo, lo habría escrito así: aproximadamente 5 ciclos de comparación. Pero esa es la cuestión: cómo hacer posible ese recálculo para cualquier tamaño de muestra.

 
Andrey Koldorkin:

Necesito escribir una matriz de datos para todas las velas cerradas (es decir, la actual no se cuenta) - velas altas, bajas, abiertas y cerradas (4 parámetros) para el período especificado en la configuración. - lo es.

A continuación, tengo que comparar los parámetros. Supongamos que el periodo de búsqueda es igual a 10 velas. Aquí tenemos que comprobar todos los altos para el período de 10 velas. Si hay dos o más coincidencias, debemos volver:

1. Bandera - "Hay una coincidencia".

1. El valor alto en el que los candelabros tienen el mismo valor.

2. Números de estos candeleros, para que podamos referirnos a ellos y encontrar los parámetros de Low, Close, Open para ellos.

En general, entiendo mucho de este cómo hacerlo.

Lo que no está claro es cómo referirse a las velas que forman el nivel. Lo ideal sería que al recalcular, pudiéramos memorizar el número de iteración (i) pero antes hay un recálculo según el cual se escribe el registro y no se puede aplicar.

Y en esa variante, como registra el registro de salida, tampoco es lo que se requiere.

Entiendo que tengo que tomar primero una vela 1 y compararla con otras 9, si hay una coincidencia, entonces extraer los números de estas velas y sus parámetros, activar la casilla. A continuación, compruebe la vela 2 con las otras y así hasta la mitad de la muestra, ya que entonces irán duplicados de comparaciones sólo desde el otro lado.

Si el número de velas fuera fijo, lo habría escrito así: aproximadamente 5 ciclos de comparación. Pero esa es la cuestión: cómo hacer posible ese recálculo para cualquier tamaño de muestra.

Y, por cierto, es poco probable que la coincidencia exacta de los valores de los precios sea frecuente. Tenemos que fijar un delta, y considerar que es una coincidencia si los precios no difieren más de este valor.

Así que si necesitamos una lista diferente de velas coincidentes para cada vela en el rango, trataría de usar una matriz de estructuras. Lo pensaré y te lo haré saber.
 
Andrey Koldorkin:

Necesito escribir una matriz de datos para todas las velas cerradas (es decir, la actual no se cuenta) - velas altas, bajas, abiertas y cerradas (4 parámetros) para el período especificado en la configuración. - lo es.

A continuación, tengo que comparar los parámetros. Supongamos que el periodo de búsqueda es igual a 10 velas. Aquí tenemos que comprobar todos los altos para el período de 10 velas. Si hay dos o más coincidencias, debemos volver:

1. Bandera - "Hay una coincidencia".

1. El valor alto en el que los candelabros tienen el mismo valor.

2. Números de estos candeleros, para que podamos referirnos a ellos y encontrar los parámetros de Low, Close, Open para ellos.

En general, entiendo mucho de este cómo hacerlo.

Lo que no está claro es cómo referirse a las velas que forman el nivel. Lo ideal sería que al recalcular, pudiéramos memorizar el número de iteración (i) pero antes hay un recálculo según el cual se escribe el registro y no se puede aplicar.

Y en esa variante, como los registros de salida - aquí, también, no es lo que se requiere.

Entiendo que tengo que tomar primero una vela 1 y compararla con otras 9, si hay una coincidencia, entonces extraer los números de estas velas y sus parámetros, activar la casilla. A continuación, compruebe la vela 2 con las demás y así hasta la mitad de la muestra, ya que entonces irán duplicados de comparaciones sólo desde el otro lado.

Si el número de velas fuera fijo, lo habría escrito así: aproximadamente 5 ciclos de comparación. Pero esa es la cuestión: cómo permitir ese recálculo para cualquier tamaño de muestra.

En lugar de la bandera "coincidencia" establecer el contador, en el valor alto donde el contador es mayor, hay un nivel

El valor alto puede redondearse, por ejemplo, de 1,23456 a 1,2346

y 1,23462 redondeado a 1,2346

porque es poco probable que de 10 velas, 2 tengan un máximo de 1,23456

así que baila desde el nivel

y el número de velas es fijo, se escribe una cierta cantidad de datos en la estructura

es decir, el número de velas escritas en la estructura es el mismo número de iteraciones

 
Andrey Koldorkin:

Necesito escribir una matriz de datos para todas las velas cerradas (es decir, la actual no se cuenta) - velas altas, bajas, abiertas y cerradas (4 parámetros) para el período especificado en la configuración. - lo es.

A continuación, tengo que comparar los parámetros. Supongamos que el periodo de búsqueda es igual a 10 velas. Aquí tenemos que comprobar todos los altos para el período de 10 velas. Si hay dos o más coincidencias, debemos volver:

1. Bandera - "Hay una coincidencia".

1. El valor alto en el que los candeleros tienen el mismo valor.

2. Los números de estas velas, para que podamos referirnos a ellos y encontrar los parámetros de Low, Close, Open para ellos.

En general, entiendo mucho de este cómo hacerlo.

Lo que no está claro es cómo referirse a las velas que forman el nivel. Lo ideal sería que al recalcular, pudiéramos memorizar el número de iteración (i) pero antes tenemos un recálculo según el cual se escribe el registro y no se puede aplicar.

Y en esa variante, como los registros de salida - aquí, también, no es lo que se requiere.

Entiendo que tengo que tomar primero una vela 1 y compararla con otras 9, si hay una coincidencia, entonces extraer los números de estas velas y sus parámetros, activar la casilla. A continuación, compruebe la vela 2 con las demás y así hasta la mitad de la muestra, ya que entonces irán duplicados de comparaciones sólo desde el otro lado.

Si el número de velas fuera fijo, lo habría escrito así: aproximadamente 5 ciclos de comparación. Pero aquí está la cuestión: cómo hacer posible ese recálculo para cualquier tamaño de muestra.

Es una tarea interesante, pero tu comprensión de cómo resolver este problema no es correcta, porque hasta ahora no tienes muchos conocimientos de programación.

Mira: tienes un conjunto de citas. Su tarea consiste en elegir de este conjunto sólo las barras que cumplan determinadas condiciones. Por ejemplo, se quiere obtener una colección de barras, cuyos máximos coinciden entre sí. De hecho, puede haber muchas condiciones para la selección, y pueden añadirse con el tiempo. Una vez que tenga una colección de barras, podrá analizar fácilmente cualquiera de sus otros parámetros.

Así que, para su tarea, necesita escribir una función que devuelva un array de barras que satisfagan una determinada condición (pseudocódigo):

массив_баров = ПолучитьНужныеБары(Символ(), Таймфрейм(), Период(), УсловиеОтбора);
Es decir, no hay realmente ningún problema en recordar e iterar algunos datos e índices. No necesitas los índices de las barras en sí, sino una colección específica que satisfaga una condición determinada. Una vez que lo tienes, resuelves muchos problemas de un plumazo.
 
Artyom Trishkin:
Por lo tanto, si necesitamos una lista diferente de velas coincidentes para cada vela en el rango, trataría de utilizar una matriz de estructuras. Lo pensaré y te lo haré saber.

Pensamiento. Estoy escribiendo un script de prueba:

//+------------------------------------------------------------------+
//|                                                     TestCopy.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int Search_Period=10;   // Количество копируемых свечей
int searchPeriod=(Search_Period<1)?1:Search_Period;
input int Delta=2;            // Количество пунктов допуска
int delta=(Delta<0)?0:Delta;
MqlRates array[];             // Массив структур для копирования Open, High, Low, Close, Time
  
struct DataCandle             // Структура для хранения всех совпадений
  {
   int number_matched;           // Количество совпадений
   MqlRates reference_candle;    // Данные эталонной свечи
   MqlRates matched_candles[];   // Массив свечей, совпадающих с эталонной по нужному критерию 
  };
  DataCandle dataCandle[];    // Массив структур данных свечей и их совпадений
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period()));   // количество копируемых свечей
   int copied=CopyRates(Symbol(),PERIOD_CURRENT,1,copy_bars,array);  // копируем данные
   if(copied>0) {                                                    // если скопировали
      ArrayResize(dataCandle,copied);                                // задаём размер структуры равным числу скопированных данных
      ZeroMemory(dataCandle);                                        // Обнуляем данные в структуре
      //--- основной цикл по "эталонным" свечам в массиве array. Их параметры будем искать в доп. цикле
      for(int i=0; i<copy_bars-1; i++) {                             // цикл по скопированным данным от начала до "на один меньше размера массива"
         dataCandle[i].reference_candle.high=array[i].high;          // ищем этот high
         dataCandle[i].reference_candle.low=array[i].low;            // запомнили low для сравнения
         dataCandle[i].reference_candle.time=array[i].time;          // запомнили time для вывода в журнал
         //--- поиск совпадений с эталонной свечой, индексируемой индексом основного цикла i
         int size=0;                                                 // размер массива совпадающих свечей
         ArrayResize(dataCandle[i].matched_candles,size);            // Размер массива совпадений в ноль
         dataCandle[i].number_matched=size;                          // Инициализируем количество совпадений нулём
         //--- теперь ищем совпадения по high свечей в цикле j с high эталонной свечи с индексом i
         for(int j=i+1; j<copy_bars; j++) {                          // в цикле от i+1 до copy_bars
            //--- если совпадают high эталонной свечи (i) и свечи с индексом j (с допуском на величину delta*Point)
            if(NormalizeDouble(delta*Point()-fabs(array[i].high-array[j].high),Digits())>=0) {
               size++;                                               
               ArrayResize(dataCandle[i].matched_candles,size);            // увеличим размер массива совпадающих свечей
               dataCandle[i].number_matched=size;                          // запишем количество совпадений
               dataCandle[i].matched_candles[size-1].high=array[j].high;   // запишем в массив high совпадающей свечи
               dataCandle[i].matched_candles[size-1].low=array[j].low;     // запишем в массив low совпадающей свечи
               dataCandle[i].matched_candles[size-1].time=array[j].time;   // запишем в массив время совпадающей свечи
               //Print("Время свечи ",i," :",TimeToString(dataCandle[i].reference_candle.time=array[i].time),", high=",DoubleToString(dataCandle[i].reference_candle.high=array[i].high,Digits()),". Совпадение со свечой ",TimeToString(dataCandle[i].matched_candles[size-1].time=array[j].time),", её high ",DoubleToString(dataCandle[i].matched_candles[size-1].high=array[j].high,Digits()),". Совпадений: ",(string)dataCandle[i].number_matched);
               }
            }
         }
      }

   //--- Посмотрим чего понаписали в массивы
   for(int i=0; i<ArraySize(dataCandle)-1; i++) {
      string refs_txt="";
      string matched_txt="";
      refs_txt="Свеча "+IntegerToString(i,2,'0')+": время "+TimeToString(dataCandle[i].reference_candle.time)+", high: "+DoubleToString(dataCandle[i].reference_candle.high,Digits())+" имеет совпадений: "+(string)dataCandle[i].number_matched+" шт. ";
      if(dataCandle[i].number_matched>0) {
         for(int j=0; j<ArraySize(dataCandle[i].matched_candles); j++) {
            matched_txt="Совпадение "+IntegerToString(j+1)+": "+TimeToString(dataCandle[i].matched_candles[j].time)+", high: "+DoubleToString(dataCandle[i].matched_candles[j].high,Digits());
            }
         }
      Print(refs_txt,matched_txt);
      }
  }
//+------------------------------------------------------------------+

Intenté describir todos los pasos.

Después de rellenar todas las coincidencias en el bucle, tenemos una matriz que contiene todos los candeleros y sus coincidencias. Después de eso puedes buscar bajas en él. Y puedes organizarlo directamente en el bucle. Es más conveniente para usted.

 

Pues bien, esta es otra forma de hacerlo: se escriben cerillas para cada vela del rango. En la versión anterior, las coincidencias se escribían sólo para una vela, es decir, no se escribía ninguna coincidencia para la que coincidía con ésta.

//+------------------------------------------------------------------+
//|                                                     TestCopy.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int Search_Period=10;   // Количество копируемых свечей
int searchPeriod=(Search_Period<1)?1:Search_Period;
input int Delta=2;            // Количество пунктов допуска
int delta=(Delta<0)?0:Delta;
MqlRates array[];             // Массив структур для копирования Open, High, Low, Close, Time
  
struct DataCandle             // Структура для хранения всех совпадений
  {
   int number_matched;           // Количество совпадений
   MqlRates reference_candle;    // Данные эталонной свечи
   MqlRates matched_candles[];   // Массив свечей, совпадающих с эталонной по нужному критерию 
  };
  DataCandle dataCandle[];    // Массив структур данных свечей и их совпадений
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period()));   // количество копируемых свечей
   int copied=CopyRates(Symbol(),PERIOD_CURRENT,1,copy_bars,array);  // копируем данные
   if(copied>0) {                                                    // если скопировали
      ArrayResize(dataCandle,copied);                                // задаём размер структуры равным числу скопированных данных
      ZeroMemory(dataCandle);                                        // Обнуляем данные в структуре
      //--- основной цикл по "эталонным" свечам в массиве array. Их параметры будем искать в доп. цикле
      for(int i=0; i<copy_bars; i++) {                               // цикл по скопированным данным от начала до конца
         dataCandle[i].reference_candle.high=array[i].high;          // ищем этот high
         dataCandle[i].reference_candle.low=array[i].low;            // запомнили low для сравнения
         dataCandle[i].reference_candle.time=array[i].time;          // запомнили time для вывода в журнал
         //--- поиск совпадений с эталонной свечой, индексируемой индексом основного цикла i
         int size=0;                                                 // размер массива совпадающих свечей
         ArrayResize(dataCandle[i].matched_candles,size);            // Размер массива совпадений в ноль
         dataCandle[i].number_matched=size;                          // Инициализируем количество совпадений нулём
         //--- теперь ищем совпадения по high свечей в цикле j с high эталонной свечи с индексом i
         for(int j=0; j<copy_bars; j++) {                            // в цикле от 0 до copy_bars
            if(j==i) continue;                                       // пропустим свечу "саму себя"
            //--- если совпадают high эталонной свечи (i) и свечи с индексом j (с допуском на величину Point)
            if(NormalizeDouble(delta*Point()-fabs(array[i].high-array[j].high),Digits())>=0) {
               size++;                                               
               ArrayResize(dataCandle[i].matched_candles,size);            // увеличим размер массива совпадающих свечей
               dataCandle[i].number_matched=size;                          // запишем количество совпадений
               dataCandle[i].matched_candles[size-1].high=array[j].high;   // запишем в массив high совпадающей свечи
               dataCandle[i].matched_candles[size-1].low=array[j].low;     // запишем в массив low совпадающей свечи
               dataCandle[i].matched_candles[size-1].time=array[j].time;   // запишем в массив время совпадающей свечи
               //Print("Время свечи ",i," :",TimeToString(dataCandle[i].reference_candle.time=array[i].time),", high=",DoubleToString(dataCandle[i].reference_candle.high=array[i].high,Digits()),". Совпадение со свечой ",TimeToString(dataCandle[i].matched_candles[size-1].time=array[j].time),", её high ",DoubleToString(dataCandle[i].matched_candles[size-1].high=array[j].high,Digits()),". Совпадений: ",(string)dataCandle[i].number_matched);
               }
            }
         }
      }

   //--- Посмотрим чего понаписали в массивы
   for(int i=0; i<ArraySize(dataCandle)-1; i++) {
      string refs_txt="";
      string matched_txt="";
      refs_txt="Свеча "+IntegerToString(i,2,'0')+": время "+TimeToString(dataCandle[i].reference_candle.time)+", high: "+DoubleToString(dataCandle[i].reference_candle.high,Digits())+" имеет совпадений: "+(string)dataCandle[i].number_matched+" шт. ";
      if(dataCandle[i].number_matched>0) {
         for(int j=0; j<ArraySize(dataCandle[i].matched_candles); j++) {
            matched_txt+=" Совпадение "+IntegerToString(j+1)+": "+TimeToString(dataCandle[i].matched_candles[j].time)+", high: "+DoubleToString(dataCandle[i].matched_candles[j].high,Digits());
            }
         }
      Print(refs_txt,matched_txt);
      }
  }
//+------------------------------------------------------------------+
 
La idea de abrir órdenes en una señal de compra o de agarre bajista, cómo hacer para que sólo haya una operación de compra/venta y una operación de orden pendiente, tengo una abierta en cada tick de la operación. Ayude a resolver el problema.
Archivos adjuntos:
ritfv.png  46 kb
ohs.txt  5 kb