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

 
En principio lo era, el error estaba probablemente en el hecho, de que el mango de mi indicador se crea en la función OnTick y los datos se copian inmediatamente en el mismo tick. Lo he entendido por la noche, ahora trataré de transferir las asas de los indicadores a la función OnInit.
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
sss20192:
El error estaba en el manejador del indicador creado en la función OnTick y los datos se copian en el mismo tick. Lo he entendido por la noche, ahora trataré de transferir las asas de los indicadores a la función OnInit.

No funcionó. Este es el código


#property version   "1.00"

input int                  InpFastEMA=12;                // Fast EMA period
input int                  InpSlowEMA=26;                // Slow EMA period
input int                  InpSignalMA=9;                // Signal MA period
input ENUM_APPLIED_PRICE   InpAppliedPrice=PRICE_CLOSE;  // Applied price
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int Handle1, Handle2, Handle3;
double MacdArray[];

int OnInit()
  {
//---
  Handle1 = iMACD(_Symbol, PERIOD_M5, InpFastEMA, InpSlowEMA, InpSignalMA, InpAppliedPrice);
  Handle2 = iMACD(_Symbol, PERIOD_M15, InpFastEMA, InpSlowEMA, InpSignalMA, InpAppliedPrice);
  Handle3 = iMACD(_Symbol, PERIOD_H1, InpFastEMA, InpSlowEMA, InpSignalMA, InpAppliedPrice);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
        CopyBuffer(Handle1, 0, 1, 1, MacdArray);
        Print(MacdArray[0], " ", GetLastError());
        
        CopyBuffer(Handle2, 0, 1, 1, MacdArray);
        Print(MacdArray[0], " ", GetLastError());
        
        CopyBuffer(Handle3, 0, 1, 1, MacdArray);
        Print(MacdArray[0], " ", GetLastError());
  }
//+------------------------------------------------------------------+

En el registro aparecen los siguientes mensajes

2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988e-005 0

2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988e-005 0

2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988e-005 0

Y siempre es así. No parece que haya un error de copia.

 
sss20192: No sirvió de nada. Este es el código

Pero hasta ahora no tiene ni una comprobación para la creación exitosa de asas, ni una comprobación para el cálculo exitoso de los indicadores y la comprobación de la copia. La idea de trasladar la inicialización de las asas a OnInit() es correcta.

Además, añade la línea Print(MacdArray[0]) al principio de OnTick() - para ver qué valor basura contiene el array antes de empezar a copiar los buffers.

Para añadir. Por supuesto, usar GetLastError() después de la propia función puede ser una peculiaridad del estilo de programación. Pero igual lo comprobaría basándome en el ejemplo de la Referencia. Si no me equivoco, un valor nulo de GetLastError() no siempre significa que la función haya funcionado correctamente.

 
Yedelkin:
Pero hasta ahora no tiene ni una comprobación para la creación exitosa de asas, ni una comprobación para el cálculo exitoso de los indicadores y la comprobación de la copia. La idea de trasladar la inicialización de las asas a OnInit() es correcta.
Pero sólo por primera vez. Si en cualquier otro lugar del programa resulta que algún manejador no es válido, tenemos que intentar obtenerlo de nuevo. Por lo tanto, no podemos decir que el código escrito para obtener asas en OnInit() resolverá completamente el problema y será 100% correcto. ))
 
Comprobado la cantidad de datos copiados con la función CopyBuffer, siempre escribe 1. Y no hay error, pero los datos siguen siendo erróneos.
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyBuffer - Документация по MQL5
 

tol64

Yedelkin : La idea de mover la inicialización de las asas a OnInit() es buena.

Pero sólo por primera vez. Si en alguna parte del programa resulta que algún manejador no es válido, hay que intentar obtenerlo de nuevo. Por lo tanto, no podemos decir que el código escrito para obtener asas en OnInit() resolverá completamente el problema y será 100% correcto. ))

¿Estás diciendo que la idea de trasladar la inicialización de las asas a OnInit() desde OnTick() es errónea en sí misma?
 
sss20192:
He comprobado cuántos datos se han copiado con la función CopyBuffer, siempre escribe 1. Y no hay ningún error, pero los datos siguen siendo erróneos.

Tengo este resultado de este código en el probador:

//---

Lo único que hice antes de la prueba fue convertir los valores de los indicadores antes de la salida al registro:

Print(DoubleToString(MacdArray[0],Digits())," ",GetLastError());
 
Yedelkin:
¿Estás diciendo que la idea de mover la inicialización del manejador a OnInit() desde OnTick() es errónea por sí misma?
Si sólo en OnInit() y en ningún otro lugar, entonces sí - incorrecto. La primera vez que tratamos de obtener una manija en OnInit(). A continuación, antes de cada intento de obtener los datos del indicador, se comprueba si el mango es válido. Si es válida, obtenemos los datos, si no, intentamos obtener el mango de nuevo.
 
tol64:

Tengo este resultado de este código en el probador:

//---

Lo único que hice antes de la prueba fue simplemente convertir los valores del indicador antes de la salida al registro:

¡Ooohtyg genio! ¡Muchas gracias! Tercer día solucionando el problema)
 
tol64:
Yedelkin: ¿Estás diciendo que la idea de trasladar la inicialización de las asas a OnInit() desde OnTick() es errónea por sí misma?
Si sólo en OnInit() y en ningún otro lugar, sí - mal. La primera vez que tratamos de obtener una manija en OnInit(). A continuación, antes de cada intento de obtener los datos del indicador, se comprueba si el asa es válida. Si es válida, obtenemos los datos, si no, intentamos obtener el mango de nuevo.

¿Y sin "si"? ¿Y en relación con esta situación particular? El mango del indicador se creó en la función OnTick durante cada tick, y los datos se copian durante el mismo tick. Significa que se ha solicitado cada vez el mismo indicador, sin comprobar su validez/invalidez. En este contexto, ¿seguirás argumentando que la idea de transferir la inicialización de los handles a OnInit() desde OnTick() es errónea por sí misma?

PS. Parece que has ayudado al hombre, por lo que la pregunta puede considerarse agotada.

Razón de la queja: