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

 
Tapochun:

1. Determine la hora de apertura de la vela diaria;

Determine el número de barras num en el TF que desea (si quiere comprobar el extremo del día cada 15 minutos - M15 barras);

3. Recibir los datos altos para las barras de número;

3. En el bucle, compara todos los valores de las barras altas con la variable dayHigh para la vela del día deseado (inicialmente dayHigh = 0);

4. Si high > dayHigh, se almacena el nuevo valor en la variable dayHigh;

Es comprensible, gracias. Pero hasta ahora me resulta complicado... o más bien el punto 2, ¿se debería calcular para cada TF y poner rangos para encontrar el número de velas?

¿No podemos simplemente averiguar la fecha del marco temporal actual y buscar entre todos los valores de la fecha, sin contar el número de velas que han pasado?

 
-Aleks-:

Es comprensible, gracias. Pero hasta ahora me resulta complicado... o más precisamente el punto 2, ¿es hacer un cálculo para cada TF y ponerlo en rangos para encontrar el número de velas?

¿No podemos simplemente averiguar la fecha del marco temporal actual y buscar entre todos los valores de la fecha, sin determinar el número de velas que han pasado?

Es fácil determinarel número de barras dentro del día. Por ejemplo, para un gráfico de 15 minutos. Divida el número de minutos de un día entre 15 (1440 / 15 = 96 barras u otro PERIOD_D1/PERIOD_M15 = 96)
 
Vitalii Ananev:
El número de barras intradía es sencillo de determinar. Por ejemplo, para un gráfico de 15 minutos. Divida el número de minutos de un día entre 15 (1440 / 15 = 96 barras u otro PERIOD_D1/PERIOD_M15 = 96)
¡No deberías hacer esto! Nunca aceptes como un hecho que el número de barras en un día determinado en la TF será el mismo.
 
Vitalii Ananev:
Es fácil determinar el número de barras en un día. Por ejemplo, para un gráfico de 15 minutos. Divida el número de minutos de un día entre 15 (1440 / 15 = 96 barras u otro PERIOD_D1/PERIOD_M15 = 96).

Lo entiendo matemáticamente, pero cómo hacerlo con funciones, ¡esa es la cuestión! Supongamos que obtengo la hora actual usando Time, y luego cómo

Se me ocurre hacer un contador para cada TF, con una nueva barra, que se ponga a cero al inicio de un nuevo día, y que se ponga a cero durante un día como máximo, y antes hacer una comparación de cada barra, pero ¿cómo programarlo?

 
Tapochun:
¡No deberías hacer eso! ¡Nunca debe tomarse como un hecho que el número de barras en un día determinado por TF será el mismo!

Sí, por ejemplo, puede haber un horario de cierre temprano un viernes...

Así que tienes que definir un día, y tomar una matriz para encontrar el máximo del día sin tener en cuenta el número de velas, ¿cómo lo haces?

 
-Aleks-:

Lo entiendo matemáticamente, pero cómo hacerlo con funciones, ¡esa es la cuestión! Supongamos que obtengo la hora actual usando Time, y luego cómo

Creo que debo hacer un contador para cada TF, con una nueva barra, que se pondrá a cero en caso de un nuevo día. Quiero ponerlo a cero durante un día como máximo y comparar cada barra antes de eso; pero ¿cómo debo programarlo?

Así podemos encontrar aproximadamente la primera barra correspondiente al inicio del día.

 datetime BeginDay = iTime(Symbol(), PERIOD_D1, iBarShift(Symbol(), PERIOD_D1, Time[NumberBar]));  

 int StartBar = iBarShift(Symbol(), 0, BeginDay);
 
Vitalii Ananev:

A grandes rasgos, así se encuentra la primera barra correspondiente al inicio del día.

Por ejemplo, tenemos este algoritmo.

Hemos encontrado la primera barra - en el momento en que se forme esta barra será el máximo del día. Entonces cogemos la siguiente barra y comprobamos su máximo, si es mayor que el anterior, significa que es un nuevo máximo del día. Y así hasta el último bar del día.

 
#property script_show_inputs
#property strict
//+------------------------------------------------------------------+
//| Входные параметры                                                |
//+------------------------------------------------------------------+
input ENUM_TIMEFRAMES inpUserTimeframe=PERIOD_M15;   // Пользовательский ТФ
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
// Определяем время открытия текущего дня
   datetime open_D1=iTime(_Symbol,PERIOD_D1,0);

// Определяем номер первого сформированного бара по пользовательскому ТФ за текущий день
   int last_utf = iBarShift( _Symbol, inpUserTimeframe, open_D1, true );
   if( last_utf == -1 )
     {
      Alert(EnumToString(inpUserTimeframe)+" ОШИБКА #",GetLastError(),": номер бара не определен! "+TimeToStr(open_D1));
      return;
     }

// Определяем максимум дня
   double dayHigh=0;
   double high;
   int highNum=0;

   for(int i=1; i<=last_utf; i++) // Цикл по сформированным свечам за текущий день
     {
      high = iHigh( _Symbol, inpUserTimeframe, i );   // Максимум на i свече
      if( high > dayHigh )                            // Если максимум дня превышен
        {
         dayHigh = high;                              // Запоминаем новый максимум
         highNum = i;                                 // Запоминаем номер свечи
        }
     }

   Alert(EnumToString(inpUserTimeframe)+": максимум дня = ",DoubleToString(dayHigh,_Digits)," обнаружен на свече #",highNum);
  }
Archivos adjuntos:
toAleks.mq4  3 kb
 
Tapochun, Vitalii Ananev- ¡Gracias! Ahora intentaré aplicar lo que he aprendido.
 
Tapochun:
¿Puedo ver un indicador en lugar de un guión? Es que me cuesta mucho con todas estas matrices de tiempo... Me gustaría aprender de un ejemplo.