Errores, fallos, preguntas - página 2469

 

Lo sabré yo) entonces hackea

 

Estoy transfiriendo un programa de MQL4 a MQL5.

Me he encontrado con este error.

En los plazos hasta m30 el valor de Period() es correcto.

2019.05.22 17:45:38.628 TestStat (GBPUSD,M15) 4854 Period()=15
2019.05.22 17:46:08.267 TestStat (GBPUSD,M30) 4854 Period()=30

Del marco temporal H1 obtengo valores incomprensibles.

2019.05.22 17:31:07.446 TestStat (GBPUSD,H1) 4854 Period()=16385
2019.05.22 17:46:39.362 TestStat (GBPUSD,H4) 4854 Period()=16388
2019.05.22 17:46:55.552 TestStat (GBPUSD,D1) 4854 Period()=16408

Versión del terminal build 2057 del 21 de mayo de 2019.

 

Gracias.

En la descripción:

Periodo

Devuelve el valor del marco temporal del gráfico actual.

ENUM_TIMEFRAMESPeriodo();

Valor devuelto

Contenido de la variable _Period , que contiene el valor del marco temporal del gráfico actual. El valor puede ser uno de los valores dela enumeración ENUM_TIMEFRAMES.

Ver también

PeriodSeconds, Periodos del gráfico, Fecha y hora, , Visibilidad del objeto

=================

Eso no está muy bien hecho. Debe estar correctamente escrito en la descripción. No debes buscar el origen del problema en el foro.

Resulta que Period() no da el valor del marco temporal actual como dice:El valor puede ser uno de los valores de la enumeración ENUM_TIMEFRAMES.

Es algo totalmente distinto.

Por favor, corrija la descripción del lenguaje para los desarrolladores.

 
Gracias de nuevo aTheXpert por proporcionar el código.
Tenemos los siguientes resultados en la capacidad ArrayResize MT5(build 2057):

#import "msvcrt.dll"
  long memcpy(int &dst[], long &src, int cnt);
#import

#define  PRINT(x) ; Print(#x, ":", string(x))

template<typename T>
struct ArrayStore
{
   long offset;
   T x[];
   
   int capacity() 
   {
      int ints[sizeof(ArrayStore) / sizeof(int)];
      memcpy(ints, this.offset, sizeof(ArrayStore));
      return ints[8];
   }
   
   int size() 
   {
      int ints[sizeof(ArrayStore) / sizeof(int)];
      memcpy(ints, this.offset, sizeof(ArrayStore));
      return ints[4];
   }
};

template<typename T>
int TestArrayCapacity(ArrayStore<T> &store, int size, int reserved_size = 0){
   ArrayResize(store.x, size, reserved_size);
   return store.capacity(); 
}

template<typename T>
int TestArraySize(ArrayStore<T> &store, int size, int reserved_size = 0){
   ArrayResize(store.x, size, reserved_size);
   return store.size(); 
}


void OnStart()
{
   ArrayStore<int> store;
   
   PRINT("TEST_ArrayCapacity");
   
   PRINT(TestArrayCapacity(store, 100, 0)); 
   PRINT(TestArrayCapacity(store, 100, 100)); 
   PRINT(TestArrayCapacity(store, 101, 100)); 
   PRINT(TestArrayCapacity(store, 200, 100)); 
   PRINT(TestArrayCapacity(store, 201, 100)); 
   PRINT(TestArrayCapacity(store, 202, 100)); 
   PRINT(TestArrayCapacity(store, 100,   1)); 
   PRINT(TestArrayCapacity(store, 100, 400)); 
   PRINT(TestArrayCapacity(store, 300, 400)); 
   PRINT(TestArrayCapacity(store, 301, 600));
   PRINT(TestArrayCapacity(store, 302, 600));
   PRINT(TestArrayCapacity(store, 303, 600));
   PRINT(TestArrayCapacity(store, 100,   0)); 
   PRINT(TestArrayCapacity(store, 100, 100)); 
   PRINT(TestArrayCapacity(store, 100,  -1)); 
   PRINT(TestArrayCapacity(store, 100, 100)); 
   PRINT(TestArrayCapacity(store, 105, 100)); 
}

Resultado:
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TEST_ArrayCapacity:TEST_ArrayCapacity
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,100,0):100
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,100,100):100
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,101,100):201
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,200,100):201
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,201,100):201
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,202,100):302
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,100,1):302
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,100,400):302
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,300,400):302
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,301,600):302
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,302,600):302
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,303,600):903
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,100,0):903
2019.05.22 17:00:50.249 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,100,100):903
2019.05.22 17:00:50.250 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,100,-1):100
2019.05.22 17:00:50.250 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,100,100):100
2019.05.22 17:00:50.250 Test_array_resize (EURUSD,H1)   TestArrayCapacity(store,105,100):205
 
Eugeni Neumoin:

Descripción:

Contenido de la variable _Period , que almacena el valor del marco temporal del gráfico actual. El valor puede ser uno de los valores de laenumeración ENUM_TIMEFRAMES.

Esto no se hace bien. Debe estar correctamente escrito en la descripción. No debes buscar el origen del problema en el foro.

Por lo tanto, en ninguna parte está escrito que este valor sea igual al periodo en minutos (como lo era en el cuadrante).

https://www.mql5.com/ru/articles/81

Ahí empieza el artículo del enlace.

Переход с MQL4 на MQL5
Переход с MQL4 на MQL5
  • www.mql5.com
Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
 
Igor Zakharov:

Así que en ningún sitio dice que este valor sea igual al periodo en minutos (como lo era en cuatros).

https://www.mql5.com/ru/articles/81

Aquí comienza el artículo del enlace.

Hay una descripción del lenguaje que dice: El valor puede ser uno de los valores de la enumeración ENUM_TIMEFRAMES.

Consulte la descripción de la lengua más abajo:

Periodos del gráfico

Todos los periodos gráficos predefinidos tienen identificadores únicos. El identificador PERIOD_CURRENT significa el periodo actual del gráfico, en el que se está ejecutando el programa mql5.

ENUM_TIMEFRAMES

Identificador

Descripción

PERIODO_CURRENTE

Período actual

PERIODISTA_M1

1 minuto

PERIODISTA_M2

2 minutos

PERIOD_M3

3 minutos

PERIOD_M4

4 minutos

PERIODISTA_M5

5 minutos

PERIOD_M6

6 minutos

PERIODISTA_M10

10 minutos

PERIODISTA_M12

12 minutos

PERIODISTA_M15

15 minutos

PERIODISTA_M20

20 minutos

PERIODISTA_M30

30 minutos

PERIOD_H1

1 hora

PERIOD_H2

2 horas

PERIOD_H3

3 horas

PERIOD_H4

4 horas

PERIOD_H6

6 horas

PERIOD_H8

8 horas

PERIOD_H12

12 horas

PERIOD_D1

1 día

PERIODO_W1

1 semana

PERIOD_MN1

1 mes

======================

Y en ninguna parte de la descripción dice que este valor es en segundos.

La descripción debería decirlo todo.

Y cuando tienes que buscar otros artículos, es una pena.

 
Sergey Dzyublik:
Gracias de nuevo aTheXpert por proporcionar el código.
Tenemos los siguientes resultados en la capacidad ArrayResize MT5(build 2057):
Por lo tanto, las conclusiones sobre el rendimiento de ArrayResize y el impacto en la capacidad real:

1. El primer ArrayResize es muy importante, realmente asigna la memoria teniendo en cuenta el tamaño + reserved_size y establece la capacidad.
2. Todas las ejecuciones posteriores de ArrayResize con un nuevo valor de reserved_size no tienen efecto sobre la cantidad de memoria asignada y la capacidad, respectivamente.
3 Sólo se realiza una nueva asignación de memoria cuando se supera la capacidad y en este caso se vuelve a utilizar size + reserved_size para determinar la cantidad de memoria asignada y establecer una nueva capacidad.
4. Un valor de reserved_size < 0 libera la memoria reservada a tamaño.
 
Eugeni Neumoin:

Y en ninguna parte de la descripción dice que este valor es en segundos.

Así que no es en segundos...

 
Eugeni Neumoin:

Hay una descripción del lenguaje que dice: El valor puede ser uno de los valores de la enumeración ENUM_TIMEFRAMES.

Véase más adelante en la descripción de la lengua:

Periodos del gráfico

Todos los periodos gráficos predefinidos tienen identificadores únicos. El identificador PERIOD_CURRENT significa el periodo actual del gráfico, en el que se está ejecutando el programa mql5.

ENUM_TIMEFRAMES

======================

Y en ninguna parte de la descripción dice que este valor es en segundos.

La descripción debería decirlo todo.

Y cuando tienes que pasar por otros artículos, es una pena.

¿Quién te ha dicho que son valores en segundos?

 
Eugeni Neumoin :

Hay una descripción del lenguaje que dice: El valor puede ser uno de los valores de la enumeración ENUM_TIMEFRAMES.

Véase más adelante en la descripción de la lengua:

Periodos del gráfico

Todos los periodos gráficos predefinidos tienen identificadores únicos. El identificador PERIOD_CURRENT denota el periodo actual del gráfico, en el que se está ejecutando el programa mql5.

ENUM_TIMEFRAMES

Identificador

Descripción

PERIODO_CURRENTE

Período actual

PERIODISTA_M1

1 minuto

PERIODISTA_M2

2 minutos

PERIOD_M3

3 minutos

PERIOD_M4

4 minutos

PERIODISTA_M5

5 minutos

PERIOD_M6

6 minutos

PERIODISTA_M10

10 minutos

PERIODISTA_M12

12 minutos

PERIODISTA_M15

15 minutos

PERIODISTA_M20

20 minutos

PERIODISTA_M30

30 minutos

PERIOD_H1

1 hora

PERIOD_H2

2 horas

PERIOD_H3

3 horas

PERIOD_H4

4 horas

PERIOD_H6

6 horas

PERIOD_H8

8 horas

PERIOD_H12

12 horas

PERIOD_D1

1 día

PERIODO_W1

1 semana

PERIOD_MN1

1 mes

======================

Y en ninguna parte de la descripción dice que este valor es en segundos.

La descripción debería decirlo todo.

Y cuando tienes que pasar por otros artículos, es una pena.

Nunca debe confiar en un valor de enumeración.

Utilice PeriodSeconds().