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

 

Hola, un enorme respeto a todos los que me ayudan a entender las características de MT5. Sin ti es muy difícil hacerlo... estupor, hipo, correr en círculos. Así que, RESPETO y Kudos para ti.


Pregunta. ¿Cuál es la mejor manera de conectarrates_total y los límites de la barra del historial? ¿Lo he enlazado correctamente en el código? Gracias por la respuesta, pista, pista.

//--- Проверка количества доступных баров
   if(rates_total<24) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     
      limit=rates_total-1;

//Показать историю за CountPeriods недель барах по Н1

int bars=PeriodSeconds(PERIOD_W1)/PeriodSeconds(PERIOD_H1)*CountPeriods;  //  CountPeriods=4; В глобальных переменных

//РЕШИЛ ТАК НО ПО-МОЕМУ ЧУШЬ...

int lm=iBarShift(NULL,PERIOD_H1,iTime(NULL,PERIOD_CURRENT,limit));      //rates_total-1 в днях
int start=lm-(lm-bars);

Comment(start,"    bars    ",bars);  //Равенство значений есть

ESTABA VIENDO LA NUEVA HORA. TODO PARECE FUNCIONAR BIEN.

Entonces, una pregunta: ¿hice bien en codificar el momento rates_total?

 

Leer detenidamente la ayuda de la función Bares:

"

Si se especifican los parámetros start_time y stop_time, la función devuelve el número de barras en el rango de fechas. Si no se especifican estos parámetros, la función devuelve el número total de barras.

"

La ayuda no dice si las fechas de inicio o de finalización deben incluirse o no, por lo que no se sabe qué esperar de la función.

Lo sorprendente es cómo funciona:

   datetime         StartDt=StringToTime("2018.01.04 10:00");
   datetime         StopDt=StringToTime("2018.01.03 23:49");
//datetime         StopDt=StringToTime("2018.01.04 10:00");
//datetime         StopDt=StringToTime("2018.01.04 10:01");
   int              BarsGo=Bars(Symbol(),PERIOD_CURRENT,StartDt,StopDt);
   Print("BarsGo=",BarsGo);

¡Con cualquiera de las opciones, incluidas las comentadas, StopDt obtiene un valor de 2!

Especialmente sorprendente es la opción cuando la fecha de inicio (2018.01.04 10:00) es posterior en el tiempo a la fecha de finalización (2018.01.03 23:49) en la segunda expresión - ¿por qué no se produce ningún error o al menos 1?

Si la fecha de inicio y la fecha de finalización son las mismas, entonces tiene sentido dar un 1 y no un 2 de nuevo.

Compruebo el instrumento Si en FORTS, gráfico de un minuto.

 

Por favor, ayuda, un pedazo de indicador

//+------------------------------------------------------------------+
//|  OnCalculate 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(time,true);

   datetime Fp=0,Ep=0,pFp=0,pEp=0,Arr[];
   int Count=0,bars=0,dt=0;

   int limit;
   if(prev_calculated==0 || prev_calculated<0 || prev_calculated>rates_total)
      limit=Nbar;
   else
      limit=rates_total-prev_calculated;

   for(int i=limit;i>=0;i--)
     {

      if(CopyTime(NULL,TimeFrame,time[i],1,Arr)>0)Ep=Arr[0]-1*PeriodSeconds(PERIOD_CURRENT);
      else return(0);

A veces el array time[i] se desborda, por ejemplo, por la noche cuando el mercado está cerrado.

2019.01.25 00:06:35.191 i-Regr4_05i (Si Splice,H1)      array out of range in 'i-Regr4_05i.mq5' (134,38)

¿Cómo resolver este problema?

 

Una pista después de una declaración como esta.

double Price[]; 

¿El tamaño de la matriz es siempre 0?

 
pivomoe:

Una pista después de una declaración como esta.

¿El tamaño de la matriz es siempre 0?

Sí.

 
Artyom Trishkin, como moderador profesional y responsable, me gustaría mucho que me dijera, sobre todo en referencia al manual, la justificación del comportamiento de la función Bares, en lugar de conjeturas.
 
Aleksey Vyazmikin:

Por favor, ayuda, un pedazo de indicador

A veces el array time[i] se desborda, por ejemplo, por la noche cuando el mercado está cerrado.

¿Cómo resolver este problema?

Por ejemplo, para calcular correctamente el parámetroNbar:

   if(prev_calculated==0 || prev_calculated<0 || prev_calculated>rates_total)
      limit=Nbar;
 
Aleksey Vyazmikin:

Leer detenidamente la ayuda de la función Bares:

"

Si se especifican los parámetros start_time y stop_time, la función devuelve el número de barras en el rango de fechas. Si no se especifican estos parámetros, la función devuelve el número total de barras.

"

La ayuda no dice si las fechas de inicio o de finalización deben incluirse o no, por lo que no se sabe qué esperar de la función.

Lo sorprendente es cómo funciona:

¡Con cualquiera de las opciones, incluidas las comentadas, StopDt obtiene un valor de 2!

Especialmente sorprendente es la opción cuando la fecha de inicio (2018.01.04 10:00) es posterior en el tiempo a la fecha de finalización (2018.01.03 23:49) en la segunda expresión - ¿por qué no se da ningún error o al menos 1?

Si la fecha de inicio y la de finalización son iguales, entonces tiene sentido dar un 1 y no un 2 de nuevo.

Compruebo el instrumento Si en FORTS, es un gráfico de minutos.

Antes de hablar de las incoherencias, debemos mostrar que hay más barras en el gráfico que las devueltas por la función.

Yo trabajo bastante con esta función y no tengo ningún problema. Me sorprende mucho que se haya incluido iBarShift y otras funciones similares en mql5.

El hecho de que la función intercambie los tiempos "desde" y "hasta" si el programador se equivoca de repente se incluye en la noción de "a prueba de tontos".

Y un consejo: para que la función funcione más rápido, ponle una hora de inicio de barra. Un par de líneas adicionales garantizarán la velocidad. Esto es especialmente importante para un probador.

 
Vladimir Karputov:

Por ejemplo, calcular correctamente el parámetroNbar:

Ya he hecho una comprobación para mí, pero esta comprobación es para evitar el error de esta función, la ayuda no dice nada sobre la necesidad de una comprobación, lo que significa que debería estar incorporada.

Y entonces, usted está hablando de la comprobación del indicador, mientras que yo uso Bares para calcular el tiempo de inicio de la barra correcta, como iBarShift es en mi mente y sólo es adecuado para el forex, donde no hay fallos frecuentes con la historia debido a la compensación y las sesiones de negociación no para todo el día.

 
Alexey Viktorov:

Antes de hablar de incoherencias, deberías demostrar que hay más barras en el gráfico que las que devuelve la función.

Trabajo bastante con esta función y no tengo ningún problema. Me sorprendió mucho por qué pusieron iBarShift y funciones similares en mql5.

El hecho de que la función cambie los tiempos 'desde' y 'hasta' en lugares si el programador los confunde de repente también forma parte de la noción "Foolproof".

También me gustaría aconsejarle: Para que la función funcione más rápido, ponga la hora de inicio de la barra. Un par de líneas adicionales proporcionarán velocidad. Esto es especialmente importante para un probador.

Esto no es una protección, sino un obstáculo para detectar un error en el código.

Además, no es en absoluto lógico que se devuelva el número 2 si las fechas son las mismas, ¿cuál es el razonamiento aquí?

La hora de inicio de una barra en FORTS puede no coincidir, lo que lleva a errores en los cálculos, por ejemplo, una barra no se abre a las 14:00, sino a las 14:05 - yo también lo sufrí.

Razón de la queja: