Errores, fallos, preguntas - página 1679

 
fxsaber:
También sería bueno hacerlo privado en los descendientes. Para una mejor comprensión. No es el punto, en resumen.
Debería llamarse en descendientes. )
 
Sergei Vladimirov:
Tiene que ser convocado en los descendientes. )
La cuestión es precisamente que no hay que hacerlo. Vea mi ejemplo.
 
fxsaber:
La cuestión es precisamente que no hay que hacerlo. Vea mi ejemplo.
Tu ejemplo es diferente, pero la cuestión es la misma: el descendiente anula un método virtual de la clase base. Bueno, está claro para todos.
 

Error en los topes de los indicadores

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

class BUFFER
{
public:
  double Buffer[];
  
  BUFFER()
  {
    ::SetIndexBuffer(0, this.Buffer);
  }
};

BUFFER* Buf;

void OnInit()
{
  Buf = new BUFFER;
}

void OnDeinit( const int Reason )
{
  delete(Buf);
}

void Restart()
{
  OnDeinit(REASON_PARAMETERS);
  OnInit();
}

#define  PRINT(A) Print(#A + " = " + (string)A);

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[] )
{
  static bool Flag = false;
  
  if (Flag)
    Restart();
  
  Flag = true;
  
  PRINT(ArraySize(Buf.Buffer));
  
  Buf.Buffer[0] = 0; // array out of range
  
  return(rates_total);
}

Resultado en el registro

2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      array out of range in 'Test.mq5' (56,13)
2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 0
2016.09.12 17:21:54.828 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 2067

El depurador dice obstinadamente que Buf.Buffer SIEMPRE es array[0] dinámico,I. Es decir, es un tampón indicador. Pero de tamaño cero, como resulta.

Resulta que el depurador escribe más en el registro que la liberación. El comunicado no informa de estas cosas

2016.09.12 17:25:08.706 Test (RTS-9.16,M1)      Indicator buffer #0  detached
¿Es posible configurar el buffer del indicador sólo una vez en MT5?
 

¿Por qué las complicaciones, si no es un secreto? Bueno, aparte del interés de la investigación, por supuesto.

En lugar de esto (que, por cierto, es erróneo en principio, porque la reinicialización puede ser necesaria durante el funcionamiento, no sólo en el arranque):

  static bool Flag = false;
  
  if (Flag)
    Restart();
  
  Flag = true;

Así:

if(prev_calculated == 0)
   ArrayInitialize(Buf.Buffer, 0.0);
 
Sergei Vladimirov:

¿Por qué las complicaciones, si no es un secreto? Bueno, aparte del interés de la investigación, por supuesto.

Tengo casos en los que un array dinámico, fijado como un buffer indicador, se borra. Entonces tienes que crear de nuevo un array dinámico y asignarlo como buffer indicador. El depurador muestra que está asignado. Pero sólo su tamaño es cero. Esto es un error.

Resulta que el problema es antiguo.

Foro sobre trading, sistemas de trading automatizados y comprobación de estrategias

Cómo ocultar el mensaje "Indicador de búfer #x separado".

Konstantin Ivanov, 2015.02.17 21:18

En mi indicador almaceno arrays-buffers en instancias del objeto.
Al eliminar un objeto en OnDeinit(), se muestra un mensaje para todas las matrices vinculadas a los buffers (SetIndexBuffer()):

"Tampón indicador #x desprendido"

¿Cómo separar un array de un buffer sin que aparezca este mensaje?
¿O cómo ocultar este mensaje?

Encontré la rama http://forum.mql4.com/63975, pero la opción sugerida de guardar los buffers en un contexto global no me funciona.


La opción de guardar los buffers en un contexto global tampoco me funciona. Curiosamente, funciona en MT4.

 

artículo Una guía paso a paso para escribir EAs en MQL5 para principiantes Hay código:


¿No es necesario dividir a tres dígitos?

 
Aleksey Rodionov:

artículo Una guía paso a paso para escribir EAs en MQL5 para principiantes Hay código:


¿No es necesario dividir a tres dígitos?

Se trata de un rudimento que queda del EURUSD (5 dígitos) y del USDJPY (3 dígitos). No hay ningún error, pero es mejor no hacerlo, especialmente para los principiantes.
 
Necesito definir una única interfaz para todas las clases heredadas. Siempre debe tener el método Init. Pero Init es como un duplicado del constructor, por lo que las variantes de los parámetros de entrada no pueden ser definidas de antemano. ¿Cómo se especifica dicha interfaz?
 
MK, ¿por qué no hacer la siguiente sintaxis aceptable para las funciones importadas:
#import ...
 int send(SOCKET s, void &buf[], int len, int flags);
 int send(SOCKET s, void &buf, int len, int flags);
#import

Ahora tenemos que hacer cosas feas:

#import ...
 int send(SOCKET s, char &buf[], int len, int flags);
 int send(SOCKET s, int &buf, int len, int flags);
 int send(SOCKET s, char &buf, int len, int flags);
 int send(SOCKET s, Cpoint &buf[], int len, int flags);
 ...
#import

No lo sugiero para las funciones internas en línea, pero para las funciones importadas debería ser seguro.