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

 
Vitaly Muzichenko:

---

P.D. En general, hay muchas cosas malas en la misma matriz, por ejemplo.

Gracias por la ayuda y por el consejo!!! Así es como se compila

//+------------------------------------------------------------------+
//|                                                        Funct.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int UP; //Глобальная переменная

//_____________________________________Массивы для Handleлов____________________________________
double HandleFractalDown_W1[],HandleFractalUP_W1[];    // одномерный динамический массив

//_____________________________________Массивы для фракталов____________________________________
double FractalDown_W1[],FractalUP_W1[];    // одномерный динамический массив

//-----------------------------------------------------------------------------------------------
int  Fractal_W1=iFractals(Symbol(),PERIOD_W1); //Хендл индикатора

//----------------------------------------------------------------------
void OnStart()
  {
   CopyBuffer(Fractal_W1,0,TimeCurrent(),Bars(Symbol(),PERIOD_W1),HandleFractalUP_W1);   // заполнение масива FractalUp[] верхними фракталами на дневном графике
   CopyBuffer(Fractal_W1,1,TimeCurrent(),Bars(Symbol(),PERIOD_W1),HandleFractalDown_W1); // заполнение масива FractalUp[] нижними фракталами на дневном графике
//--- индексация как в таймсериях
   ArraySetAsSeries(FractalUP_W1,true);  //Заполнение массива FractalUp[],FractalDown, нулевым баром в первом окне массива и далее по порядку убывания от нулевого в тайм-серии
   ArraySetAsSeries(FractalDown_W1,true);//Второй параметр -true- функции ArraySetAsSeries Устанавливает флаг индексации как в таймсериях.

  Search_Fractal(PERIOD_W1, HandleFractalUP_W1, FractalUP_W1); //Пользовательская функция заполнения массива FractalUP_W1 значениями
                                                               //верхних фракталов  

  }
//+------------------------------------------------------------------+

//+-----------------------Функция заполнения массива-------------------------------------------+
void Search_Fractal(ENUM_TIMEFRAMES period, double &handle[], double &fract_mass[])
  {
   UP = 0;                      //Глобальная переменная
   int i=Bars(Symbol(),period); //Колличество баров на W1 графике
   
   for(int n=0; n< i; n++)
     {
      //--- если непустое значение, пишем в массив fract_mass[UP] цену фрактала
      if(handle[n]!=EMPTY_VALUE)
        {
         UP++;
         fract_mass[UP] = handle[n];
        }
     }
  }
//+------------------------------------------------------------------+
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • 2021.02.13
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
Ajustado un poco, casi funciona como es necesario, antes de 51,20 se bloquea allí con un error

Matriz de funciones (BRN, W1) fuera de rango

//+------------------------------------------------------------------+
//|                                                        Funct.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int UP; //Глобальная переменная

//_____________________________________Массивы для Handleлов____________________________________
double HandleFractalDown_W1[],HandleFractalUP_W1[];    // одномерный динамический массив

//_____________________________________Массивы для фракталов____________________________________
double FractalDown_W1[],FractalUP_W1[];    // одномерный динамический массив

//-----------------------------------------------------------------------------------------------
int  Fractal_W1=iFractals(Symbol(),PERIOD_W1); //Хендл индикатора

//----------------------------------------------------------------------
void OnStart()
  {
   CopyBuffer(Fractal_W1,0,TimeCurrent(),Bars(Symbol(),PERIOD_W1),HandleFractalUP_W1);   // заполнение масива FractalUp[] верхними фракталами на дневном графике
   CopyBuffer(Fractal_W1,1,TimeCurrent(),Bars(Symbol(),PERIOD_W1),HandleFractalDown_W1); // заполнение масива FractalUp[] нижними фракталами на дневном графике
//--- индексация как в таймсериях
   ArraySetAsSeries(HandleFractalUP_W1,true);  //Заполнение массива FractalUp[],FractalDown, нулевым баром в первом окне массива и далее по порядку убывания от нулевого в тайм-серии
   ArraySetAsSeries(HandleFractalDown_W1,true);//Второй параметр -true- функции ArraySetAsSeries Устанавливает флаг индексации как в таймсериях.

  Search_Fractal(PERIOD_W1, HandleFractalUP_W1, FractalUP_W1); //Пользовательская функция заполнения массива FractalUP_W1 значениями
                                                               //верхних фракталов  
  }
//+------------------------------------------------------------------+



//+-----------------------Функция заполнения массива-------------------------------------------+
void Search_Fractal(ENUM_TIMEFRAMES period, double &handle[], double &fract_mass[])
  {
   UP = 0;                      //Глобальная переменная
   int i=Bars(Symbol(),period); //Колличество баров на W1 графике

   for(int n=0; n< i; n++)
     {
      //--- если непустое значение, пишем в массив fract_mass[UP] цену фрактала
      if(handle[n]!=EMPTY_VALUE)
        {
         UP++;
         fract_mass[UP] = handle[n];
         Alert("Frakt= ",fract_mass[UP]);
        }
     }
  }
//+------------------------------------------------------------------+
¿Qué puede ser?
 
Kira27:
Lo he ajustado un poco, casi funciona como es necesario, hasta 51.20 allí se bloquea con un error

Matriz de funciones (BRN, W1) fuera del rango permitido

¿Qué puede ser?

Inténtalo de esta manera, no has establecido la dimensionalidad del array

void Search_Fractal(ENUM_TIMEFRAMES period, double &handle[], double &fract_mass[])
  {
   UP = 0;                      //Глобальная переменная
   int i=Bars(Symbol(),period); //Колличество баров на W1 графике
   ArrayResize(fract_mass,i+1);
   for(int n=0; n< i; n++)
     {
      //--- если непустое значение, пишем в массив fract_mass[UP] цену фрактала
      if(handle[n]!=EMPTY_VALUE)
        {
         UP++;
         fract_mass[UP] = handle[n];
         Alert("Frakt= ",fract_mass[UP]);
        }
     }
  }

En general, esta no es una buena solución

 
Kira27:
Ajustado un poco, casi funciona como es necesario, antes de 51,20 se bloquea con un error

Matriz de funciones (BRN, W1) fuera de rango

¿Qué puede ser?

La línea que resolvió el choque.

 ArrayResize(handle,i,0);//*------Строчка решившая проблему
//+-----------------------Функция заполнения массива-------------------------------------------+
void Search_Fractal(ENUM_TIMEFRAMES period, double &handle[], double &fract_mass[])
  {
   UP = 0;                      //Глобальная переменная
   int i=Bars(Symbol(),period); //Колличество баров на W1 графике

//***************************
   ArrayResize(handle,i,0);//*------Строчка решившая проблему
//***************************

   for(int n=0; n< i; n++)
     {
      //--- если непустое значение, пишем в массив fract_mass[UP] цену фрактала
      if(handle[n]!=EMPTY_VALUE)
        {
         UP++;
         fract_mass[UP] = handle[n];
         Alert("Frakt= ",fract_mass[UP]);
        }
     }
  }
//+------------------------------------------------------------------+

¿Correcto ahora? Correcto si no te importa.

 
Kira27:
Lo he retocado un poco, casi funciona como debería, hasta el 51.20 ahí se cuelga con un error.

Matriz de funciones (BRN, W1) fuera del rango permitido

¿Qué puede ser?

Al mismo tiempo, copias un cierto número de elementos en el array HandleFractalUP_W1, pero no controlas exactamente cuántos.

A continuación, haga un bucle int=Bars(Symbol(),period); //Número de barras en el gráfico W1

Como resultado, se obtendrá de nuevo una salida fuera del array, pero enhandle[n]

Trabaja en la lógica del relleno, tómate tu tiempo.

----

Kira27:

La línea que resolvió el choque.

¿Es correcto ahora? Corríjalo si no le importa.

Es muy complicado, pero lo harás bien.

 
Kira27:

La línea que solucionó el problema de las colisiones

¿Es ahora mismo? Corríjalo si no le importa.

Excepto que hay menos fractales que barras en la ventana del gráfico semanal, y cuando se llena la matriz con los valores de los precios de los fractales, sólo se llenan 90 celdas, y el resto de la disposición de la memoria es redundante ¿Significa esto que primero se debe calcular el número de fractales y sólo después aplicar ArrayResize para la reserva de memoria?

 
Vitaly Muzichenko:

Al mismo tiempo, copias un cierto número de elementos en el array HandleFractalUP_W1, pero no controlas exactamente cuántos.

A continuación, haga un bucle int=Bars(Symbol(),period); //Número de barras en el gráfico W1

Como resultado, volverá a obtener una salida fuera del array, pero enhandle[n]

Trabaja en la lógica del relleno, tómate tu tiempo.

----

Es muy complicado, pero lo harás bien.

¡¡¡Gracias!!!

 

Buenas tardes a todos. Por favor, ayúdenme a entender por qué no puedo obtener el historial de volúmenes. Traté de hacerlo de dos maneras.

La primera forma:

MqlRates mrate5[];

if(CopyRates(_Symbol,PERIOD_M5,1,bars_used,mrate5)<0)

{

Alert("Error al copiar los datos históricos de M5 - error:",GetLastError(),"!");

volver;

}

for (int i=0;i<bars_used;i++) {

Print(mrate5[i].volumen_real)

}

Segundo camino:

long volúmenes5[];

if(CopyRealVolume(_Symbol,PERIOD_M5,1,bars_used,volumes5)<0)

{

Alert("Error de copia de volúmenes para M5 - error:",GetLastError(),"!");

volver;

}

for (int i=0;i<bars_used;i++) {

Print(volúmenes5[i])

}

En ambos casos, la matriz de volúmenes siempre contiene sólo ceros. No se puede obtener ninguna información significativa...


 
seleand:

Buenas tardes a todos. Por favor, ayúdenme a entender por qué no puedo obtener el historial de volúmenes. Traté de hacerlo de dos maneras.

La primera forma:

MqlRates mrate5[];
      if(CopyRates(_Symbol,PERIOD_M5,1,bars_used,mrate5)<0)
        {
            Alert("Ошибка копирования исторических данных для М5 - ошибка:",GetLastError(),"!!");
            return;
        }
for (int i=0;i<bars_used;i++) {
Print(mrate5[i].real_volume)
}

La segunda forma:

long volumes5[];
      if(CopyRealVolume(_Symbol,PERIOD_M5,1,bars_used,volumes5)<0)
        {
            Alert("Ошибка копирования объемов для М5 - ошибка:",GetLastError(),"!!");
            return;
        }
for (int i=0;i<bars_used;i++) {
Print(volumes5[i])
}

En ambos casos, la matriz de volumen siempre contiene sólo ceros. No puedo obtener ninguna información significativa...


  1. Aprende a insertar código.
  2. En el mercado de divisas, no hay volúmenes reales en absoluto.
 

Gracias. ¿He entendido bien que hay un volumen de ticks?

Cuando descargué el historial de cotizaciones de forex desde el sitio de finam, había vol además de la apertura, el máximo, el mínimo y el cierre. No has dicho exactamente qué volumen era. ¿Esto es un volumen de garrapatas?

Razón de la queja: