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

 
Karputov Vladimir:
¿En un indicador o en un EA/script?
En un indicador.
 

Yuri Evseenkov:

fromme2you:

Otra pregunta: ¿cómo estresar al desarrollador de MT4 y del entorno de ejecución de código MQL, para que ponga mente y mano en el desarrollo de un lenguaje para manejar las excepciones, como en mi ejemplo o de significado similar?


Ponte en contacto con servesdesk, crea un hilo/encuesta en el foro.

No hace mucho tiempo que la MT4 estaba enterrada. No tienen una visión clara del mercado, tienen una visión clara de la regulación del mercado.

Ver el post de Renat de hoy:

Renat Fatkhullin:

...

Eldesarrollo de MT4 está parado y sólo habrá arreglos y cosméticos.

 
Alex:

Hola. Por favor, ¿pueden aconsejarme cómo resolver este problema? Necesito encontrar los precios de apertura de las barras a una hora determinada, por ejemplo a la 01:00, analizando por ejemplo las últimas 50 barras. No estoy seguro de cómo realizar esta tarea en mql5.


Ya sea calculando la fecha actual + añadiendo el tiempo requerido a la misma y luego añadiendo veinticuatro horas, este método funcionó en mql4.

Por lo que entendí mql5 tiene estructuras especiales con salida de tiempo, pero por alguna razón no puedo usarlas.

Gracias de antemano por la respuesta.

Estaría muy agradecido si alguien pudiera lanzarme un pequeño trozo de código para entender el proceso de pensamiento.
Alex:
En el indicador.

Aquí, para una mejor comprensión, aconsejo fijarse primero en la numeración de las barras. Primero tenemos que entender exactamente cómo se numera la barra más a la derecha en el indicador MQL5.

Para ello, ponga el siguiente comentario en el indicador en OnCalculate:

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property  indicator_type1   DRAW_LINE
#property  indicator_color1  Blue
//--- indicator buffers
double Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);
//---
   ArrayInitialize(Buffer,1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   Comment("rates_total=",IntegerToString(rates_total),
           ", time[rates_total-1]=",TimeToString(time[rates_total-1],TIME_DATE|TIME_MINUTES|TIME_SECONDS));

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Este código producirá este resultado:

Numeración en las matrices de indicadores MQL5, por defecto

Es decir, por defecto la barra más a la derecha en las matrices de indicadores MQL5 tiene un índice igual a "rates_total-1".

Volviendo a tu pregunta - tienes que tomar los últimos 50 compases y pasar por ellos. Y analiza la hora de apertura de la barra (el array time[]), si la hora de la barra es igual a la especificada, recuerda el índice de la barra. A continuación, obtenga el precio de apertura de la matriz open[] utilizando este índice.

Se parece a esto:

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots   0
//--- input parameters
input datetime time_open=D'01:00';     // время искомого бара
//--- parameters
int open_hour;                         // время искомого бара (часы)
int open_min;                          // время искомого бара (минуты)
bool first_start=false;                // false - значит бары ещё не искались
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MqlDateTime str1;
   TimeToStruct(time_open,str1);
   open_hour=str1.hour;
   open_min=str1.min;
//---
   first_start=false;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
//Comment("rates_total=",IntegerToString(rates_total),
//        ", time[rates_total-1]=",TimeToString(time[rates_total-1],TIME_DATE|TIME_MINUTES|TIME_SECONDS));
   if(!first_start)
     {
      int index=-1;
      for(int i=rates_total-1;i>rates_total-1-50;i--)
        {
         MqlDateTime str2;
         TimeToStruct(time[i],str2);
         if(str2.hour==open_hour && str2.min==open_min)
           {
            index=i;
            first_start=true;
            Print("Бар ",IntegerToString(i)," имеет время открытия ",TimeToString(time[i],TIME_DATE|TIME_MINUTES|TIME_SECONDS),
                  " и цену открытия ",DoubleToString(open[i],Digits()));
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Karputov Vladimir:

Aquí, para que lo entiendas mejor después, te aconsejo que empieces por fijarte en la numeración de las barras. Es decir, primero debe entender exactamente cómo se numera la barra más a la derecha en el indicador MQL5.

Para ello, ponga el siguiente comentario en el indicador en OnCalculate:

Este código producirá este resultado:


Es decir, por defecto la barra más a la derecha en las matrices de indicadores MQL5 tiene un índice igual a "rates_total-1".

Volviendo a tu pregunta - tienes que tomar los últimos 50 compases y pasar por ellos. Y analiza la hora de apertura de la barra (el array time[]), si la hora de la barra es igual a la especificada, recuerda el índice de la barra. A continuación, obtenga el precio de apertura de la matriz open[] utilizando este índice.

Su aspecto es aproximadamente el siguiente

Karputov Vladimir, muchas gracias. Me encargaré de ello. Creo que mql5 tiene un acceso más flexible a las series temporales, pero es un poco complicado para los programadores "novatos". :))
 
Alex:
Karputov Vladimir, muchas gracias. Se lo agradezco mucho. Creo que mql5 tiene un acceso más flexible a las series temporales, pero es un poco complicado para los programadores "novatos". :))
Es cuestión de acostumbrarse. Entonces comprenderá que todo está estructurado, es fácil y correcto.
 
Karputov Vladimir:
Es una cuestión de costumbre. Entonces verá que todo está estructurado, es fácil y correcto.

Otra pregunta. Los parámetros

const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])


Creo que son responsables del par al que se aplica el indicador. Entonces, ¿es imposible obtener la misma información sobre otro par de divisas? En otras palabras, ¿la solución más universal es crear las mismas matrices de OCHL, sólo a través de la función Copy?
 
Alex:

Otra pregunta. Parámetros

Entiendo que son responsables del par al que se aplica el indicador. ¿Y sacar con su ayuda la misma información sobre otro par de divisas es imposible? Entonces, ¿la solución más universal es crear las mismas matrices OCHL sólo a través de la función Copy?
Cuando se accede a los símbolos de otras personas, hay matices que hay que entender y conocer: laorganización del acceso a los datos. En otras palabras, si solicita datos de series temporales de un símbolo ajeno, primero debe asegurarse de que estos datos están preparados y existen. Esta es la única manera de estar seguro de que los datos solicitados del símbolo de otra persona son correctos.
 
Karputov Vladimir:
A la hora de acceder a los personajes de otras personas, hay matices que hay que entender y conocer:Organizar el acceso a los datos. En otras palabras, si solicita los datos de las series temporales de símbolos de otra persona, primero debe asegurarse de que estos datos han sido preparados y existen. Sólo así puedes estar seguro de que los datos que solicitas al personaje extraterrestre son correctos.

Lo tengo. Gracias.

Otra pregunta ¿convierte siempre los valores en el tipo de cadena en la función Print(). ¿Cuál es el objetivo de hacer esto? Sin traducción, los tipos int, double, etc. se muestran en la función Print() exactamente igual.

 
Alex:

Lo tengo. Gracias.

Otra pregunta ¿convierte siempre los valores al tipo de cadena en la función Print(). ¿Cuál es el objetivo de hacer esto? Sin traducción, los tipos int, double, etc. se muestran en Print() exactamente de la misma manera.

La forma en que un número se almacena en la memoria del ordenador y la forma en que se emite son dos grandes diferencias. Especialmente con los números de punto flotante, siempre es mejor limitar el número de decimales.

Por eso siempre trato de formatear la salida correctamente: usoIntegerToString yDoubleToString.

 
Karputov Vladimir:

La forma en que un número se almacena en la memoria del ordenador y la forma en que se emite son dos grandes diferencias. Especialmente con los números de punto flotante, siempre es mejor limitar el número de decimales.

Por eso siempre trato de formatear adecuadamente la salida de números usandoIntegerToString yDoubleToString.

Gracias por sus respuestas y su paciencia.


Vladimir, seguramente estoy cansado de ti :) Pero el progreso en lo básico va muy lento. Intenté hacer una tarea de prueba con la función Copiar... El indicador no está dibujado, aunque hay números en Printe... No entiendo nada.


//+------------------------------------------------------------------+
//|                                                        Bars.mq5 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UpBar
#property  indicator_label1  "UpBar"
#property  indicator_type1   DRAW_HISTOGRAM
#property  indicator_color1  clrGreen
#property  indicator_style1  STYLE_SOLID
#property  indicator_width1  6
//--- plot DnBar
#property  indicator_label2  "DnBar"
#property  indicator_type2   DRAW_HISTOGRAM
#property  indicator_color2  clrRed
#property  indicator_style2  STYLE_SOLID
#property  indicator_width2  6
//--- input parameters
input int   Histori=30;
input ENUM_TIMEFRAMES TimeFrame=0; 
input string  Simvol="EURUSD";
//--- indicator buffers
double         UpBar[];
double         DnBar[];
double         O_Price[];
double         C_Price[];



  
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,UpBar,INDICATOR_DATA);
   SetIndexBuffer(1,UpBar,INDICATOR_DATA);
   SetIndexBuffer(2,O_Price,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,C_Price,INDICATOR_CALCULATIONS);



   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,           
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
 {
ArraySetAsSeries(O_Price,true);
ArraySetAsSeries(C_Price,true);
CopyOpen(Simvol,TimeFrame,0,Histori,O_Price);
CopyClose(Simvol,TimeFrame,0,Histori,C_Price);

     for (int t=3; t<Histori; t++) 
       {
          UpBar[t]=MathAbs(NormalizeDouble((O_Price[t]-C_Price[t]),Digits()));   
          Print(DoubleToString(UpBar[t],Digits()));
       }

   return(rates_total);
  }