Errores, fallos, preguntas - página 645

 

Hola a todos.

Por favor, ayude a un novato a entender el uso de arrays en las clases. Corta el código de la llave en un trozo pequeño para representar el problema:

class base
{
protected:
int Stf_ZZ_Handle;
double Stf_ZZ_Val[];
public:
void InitArray()
  {
   Stf_ZZ_Handle=iCustom(_Symbol,_Period,"Examples\\ZigZag",12,0,0);
   ArraySetAsSeries(Stf_ZZ_Val,true);
   CopyBuffer(Stf_ZZ_Handle,0,0,200,Stf_ZZ_Val);
   Print("array[0]= ",Stf_ZZ_Val[0]);
  }
};
class second : public base
  {
    public:
    void Printer() {Print("array[0]= ",Stf_ZZ_Val[0]);}
  };
int OnInit()
  {
//---
base Cbase;
second Csecond;
Cbase.InitArray();
Csecond.Printer();
//---
   return(0);
  }

Al ejecutar obtiene un error Array out of range en la cadena de la clase heredada, en la clase padre obtengo el esperado 0.

2012.02.13 00:41:25 2011.01.01 00:00:00 array fuera de rango en 'test1.mq5' (29,36)
2012.02.13 00:41:25 2011.01.01 00:00:00 array[0]= 0.0

   void Printer() {Print("array[0]= ",Stf_ZZ_Val[0]);}

Entiendo que estoy pasando (o direccionando) incorrectamente un array a una clase heredera, aunque con variables normales no hay ningún error con ese manejo.

¿Qué estoy haciendo mal?

 

Últimamente veo este mensaje con mucha frecuencia al ejecutar archivos *.mq5:

¿Cuál puede ser el problema?

 
Radix:

Hola a todos.

base Cbase;
second Csecond;
Cbase.InitArray();
Csecond.Printer();

¿Qué estoy haciendo mal?

Mira, cuando declaras "second Csecond;" en la segunda línea, no se llama al método InitArray(), ¿verdad? Al mismo tiempo, el propio objeto Csecond ya ha sido creado, por lo que resulta que cuando se llama a la función "Csecond.Printer();", se refiere a la matriz no inicializada y adimensional Stf_ZZ_Val[].

 
¿Pueden decirme si se ha eliminado el límite de 1000 barras del historial disponible desde la fecha de inicio (como en MT4) al hacer las pruebas?
 
muallch:

Por favor, dígame si el límite de 1000 barras de historia disponible desde la fecha de inicio se ha eliminado (como en MT4) durante las pruebas?

¿Explique lo que quiere decir con eso?

En el Cinco, se cargan los datos del año anterior desde el inicio de las pruebas. Por lo tanto, si está probando desde 2012.02.01, los datos se cargarán desde 2011.01.01.

La única excepción es la prueba en Días, Semanas y Meses - el comienzo de los datos allí se calcula en base a la necesidad de tener 100 barras antes del comienzo de la prueba.

 
stringo:

Explica lo que quieres decir con eso.

Cuando se ejecuta desde, por ejemplo, 2011.01.01 en los diarios, necesitamos un historial de al menos 3000 barras. Por lo tanto, tenemos que establecer un período conscientemente más largo que el necesario para las pruebas y trazar el "punto de partida" mediante programación. ¿Cuál es la dificultad de proporcionar todo el historial (o de solicitarlo) durante las pruebas?
 
También está la cuestión de la disponibilidad del historial no en las pruebas, sino en el comercio automático real. ¿Qué debemos hacer en este caso? El probador puede ser más astuto...
 
muallch:
Cuando se ejecuta, por ejemplo desde 2011.01.01 en datos diarios necesitamos un historial con al menos 3000 barras. En otras palabras, tenemos que establecer un período conscientemente más largo, que el que necesitamos para las pruebas, y seguir el "punto de partida" programáticamente. ¿Cuál es la dificultad de proporcionar todo el historial (o de solicitarlo) durante las pruebas?

No hay ninguna dificultad. No queríamos introducir una casilla de verificación adicional en los ajustes de la prueba, que habría sido incomprensible para la mayoría de los usuarios y se habría utilizado mal en un gran número de casos.

Es una solución normal especificar un periodo más largo a sabiendas.

Otra solución - ordenar las pruebas sobre una base mensual, y utilizar los indicadores diarios y los datos de precios (es decir, en lugar de PERIOD_CURRENT establecer PERIOD_D1 explícitamente).

 
muallch:

También está la cuestión de la disponibilidad del historial no en las pruebas, sino en el comercio automático real. ¿Qué debemos hacer en este caso? El probador puede ser más astuto...
Puedes descargar todo el historial disponible. Compruebe la documentación sobre la organización del acceso a los datos
 

Gracias por la aclaración.

Como nota al margen: estoy haciendo pruebas con agentes remotos a través de Internet. ¿Por qué los agentes obtienen el historial de minutos completo si estoy probando a precios de apertura? El tiempo de preparación antes de que comiencen las pruebas es simplemente obsceno: una hora, por ejemplo. Es bueno para los que tienen una tubería de 10 a 100 megabits, pero aquí estás sentado en un mísero megabit...

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы - Документация по MQL5