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

 
-Aleks-:

¡Por favor, ayuda! (MQL4)

Necesito obtener la hora de apertura del Día en el gráfico M15 teniendo en cuenta cada barra - para el indicador.

Decidí calcular en segundos, teniendo en cuenta la barra actual (0), pero debo estar equivocado.

D_Shift=(Open_time-pos*15*60-(Open_time-Open_timeTF))/1440*60;

Si para el indicador, entonces:

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[])
  {
   int            temp_day;
   MqlDateTime    dt_struct;
   TimeToStruct(time[0],dt_struct);
   temp_day=dt_struct.day;

   for(int i=0;i<rates_total-1;i++)
     {
      TimeToStruct(time[i],dt_struct);
      if(dt_struct.day<temp_day)
        {
         Print("Start day ",time[i-1]);
         break;
        }
     }

//--- done
   return(rates_total);
  }

Pero: este código se ejecutará cada vez que se introduzca OnCalculate() - dependiendo de sus necesidades, puede añadir la bandera bool o colocar el código en una función separada.

 
Karputov Vladimir:

Si para el indicador, entonces:

Pero: este código se ejecutará cada vez que OnCalculate() - dependiendo de sus necesidades, o añadir una bandera bool o colocar el código en una función separada.

Gracias, pero en cada garrapata para hacer el recuento no es bueno - Tengo que analizar su código, sin embargo, mientras que quiero entender por qué mi código no funciona, en el registro se devuelven los números extraños

Open_timeTF 1454715900
Hora_de_apertura 1454284800
Delta_1S 431100
Delta_M15 479

resulta que hay una diferencia de 479 barras entre la primera barra del día y la barra actual, ¿por qué?

 
-Aleks-:

Gracias, pero recalcular en cada tick no es bueno - Tengo que pensar en su código, sin embargo, mientras quiero entender por qué mi código no funciona, el registro devuelve números extraños

Open_timeTF 1454715900
Hora_de_apertura 1454284800
Delta_1S 431100
Delta_M15 479

resulta que hay una diferencia de 479 barras entre la primera barra del día y la barra actual, ¿por qué?

Sí indiqué que no soy psíquico y por eso:

Pero: este código se ejecutará cada vez que se introduzca OnCalculate() - aquí, dependiendo de sus necesidades, añada una banderaboolo ponga el código en una función separada.

 
Karputov Vladimir:

Sí señalé que no soy vidente y por eso:

¿Por qué se requiere la habilidad psíquica aquí? Hay variables en el código anterior, mostré lo que esas variables devuelven en números y pregunté por qué es así y no al revés - según el código.
 
Karputov Vladimir, no entiendo su código - porque soy un principiante en este negocio,no he utilizado la funciónOnCalculate antes, así que no puedo entender lo querates_totalse calcula allí, y lo más importante, donde devolverlo? Tampoco entiendo cómo hacer todo en una función separada... es difícil de entender sin comentarios.
 
-Aleks-:
Karputov Vladimir, no entiendo tu código - soy un principiante en este negocio yno he utilizado la funciónOnCalculate antes, por lo que no puedo entender lo querates_totalse calcula allí y, más importante, ¿a dónde debe ser devuelto? Tampoco entiendo cómo hacer todo en una función separada... es difícil de entender sin comentarios.

Aquí está el código completo del indicador MQL4:

//+------------------------------------------------------------------+
//|                                                    Start day.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//--- input parameters
input int      timer=10; // seconds
//--- parameter
bool           IsDefineTime=true; // true -> you can define time
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetTimer(timer);
//---
   IsDefineTime=true;
//---
   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[])
  {
//---
   int            temp_day;
   MqlDateTime    dt_struct;
   TimeToStruct(time[0],dt_struct);
   temp_day=dt_struct.day;

   if(IsDefineTime)
     {
      for(int i=0;i<rates_total-1;i++)
        {
         TimeToStruct(time[i],dt_struct);
         if(dt_struct.day<temp_day)
           {
            Print("Start day ",time[i-1]);
            IsDefineTime=false;
            break;
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   IsDefineTime=true; // true -> you can define time
  }
//+------------------------------------------------------------------+

Algoritmo de su trabajo: Cuando se inicia el indicador, se establece el intervalo de tiempo del temporizador (por ejemplo, 10 segundos) - significa que cada 10 segundos se activará el temporizador:

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   IsDefineTime=true; // true -> you can define time
  }

y a la variableIsDefineTime se le asigna el valor true. ¿Para qué sirve? Cuando IsDefineTime=true podemos, en OnCalculate(), entrar en un bucle para determinar la hora de inicio del día:

   if(IsDefineTime)
     {
      for(int i=0;i<rates_total-1;i++)
        {
         TimeToStruct(time[i],dt_struct);
         if(dt_struct.day<temp_day)
           {
            Print("Start day ",time[i-1]);
            IsDefineTime=false;
            break;
           }
        }
     }

En este bucle comenzamos a recorrer la matriz time[] (esta matriz almacena los valores de tiempo de apertura) desde la barra más a la derecha (su índice es "0"). Cuando se encuentra el inicio del día, desestablecemos su valor y asignamos a la variableIsDefineTime el valorfalse - de esta manera nos protegemos de seguir entrando en el ciclo de determinación de la hora de inicio del día, hasta que el temporizador se ejecute de nuevo.

Archivos adjuntos:
Start_day.mq4  3 kb
 

Karputov Vladimir , gracias por la aclaración, sin embargo, ¿cómo resuelve esto el problema?

A grandes rasgos, necesitamos saber la barra del marco temporal actual que corresponde a la barra del principio del día. Tenemos que saber en cada barra y calcular y dibujar el indicador en consecuencia.

 
-Aleks-:

Karputov Vladimir , gracias por la aclaración, sin embargo, ¿cómo resuelve esto el problema?

A grandes rasgos, necesitamos saber la barra del marco temporal actual que corresponde a la barra del principio del día. Es necesario conocerlo en cada barra y calcular y dibujar el indicador en consecuencia.

Así es como preguntaste y así se te respondió :) . Y si quiere no la hora del primer compás de este día, sino el índice de este compás - está aquí, cuando imprime el comienzo del día:

.
.
.
Print("Start day ",time[i-1]);
.
.
.

Se utiliza el índice [i-1], que es el número de la primera barra del día.

 
Karputov Vladimir:

Como has preguntado, tienes tu respuesta :) . Y si no necesita la hora de la primera barra del día, sino el índice de esta barra, está aquí, cuando imprime el comienzo del día:

Se utiliza el índice [i-1], que es el número de la primera barra del día.

Estoy de acuerdo, he preguntado de forma confusa.

Hay un indicador en la aplicación que hice, pero no cuenta correctamente. Soy terriblemente tonto y no entiendo, ni siquiera después de tus explicaciones, cómo hacer que determine correctamente el índice correspondiente a la primera barra del inicio del día.

Pido disculpas por la insolencia, pero tal vez puedas mostrarme cómo combinar tu código y el mío.

Archivos adjuntos:
 

-Aleks-:

¿Cómo consigo que detecte correctamente el índice correspondiente a la primera barra del inicio del día?

Es un poco desordenado:

datetime Day00=86400*(TimeCurrent()/86400);//начало дня
int bar_shift=iBarShift(_Symbol,PERIOD_CURRENT,Day00);//индекс первого бара текущего дня
Razón de la queja: