Errores, fallos, preguntas - página 2995

 
   datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration 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[])
{

   if(handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}


¿Puede alguien responder por qué este código sólo funciona correctamente en los minutos?

Esto es un indicador.


P. S.

En los plazos que no son de un minuto, los valores son erróneos.

 
Francuz:


¿Puede alguien responder por qué este código sólo funciona correctamente en los minutos?

Esto es un indicador.

P. S.

En los marcos temporales que no sean minutos, los valores son erróneos.

Porque ha realizado una sola iteración sólo en la primera visita de OnCalculate, cuando prev_calculated = 0. En ese momento las barras pueden no haberse formado todavía. Y todas las TFs se forman a partir de 1M TFs.
Insertar en el cheque:

if(prev_calculated>0 && handle != INVALID_HANDLE)

Y todo funcionará.

 

Hay dos pestañas de EA abiertas en ME, ambas tienen cambios sin guardar, pulsamos el botón de compilar en una de ellas y vemos que ME guarda los cambios en ambos EA. ¿Por qué? ¿Quién le pidió que lo hiciera?

Si ME guardara los cambios en los archivos enlazados antes de compilar, sería un comportamiento lógico, pero así.... Por supuesto, porque es mucho más fácil, ¿por qué clasificar qué archivos pertenecen a quién? Es mucho más fácil guardar todos los archivos abiertos y terminar con ello....

 
Andrey Dik:
En ME están abiertas las pestañas de dos EAs, ambos tienen cambios sin guardar, pulsa el botón de compilar de uno de ellos y verás que ME guarda los cambios en ambos EAs. ¿Por qué? ¿Quién le pidió que lo hiciera?
¿Cómo podría hacerlo si no?
Esta es la única manera.
En todos los IDEs esto es así.
 
Nikolai Semko:
¿Cómo si no?
Esta es la única manera.
Todos los IDEs son así.

¿Es seguro en todos los IDEs?

Acabo de probar VS, sí, el comportamiento es el mismo. Pero, el comportamiento retardado de un producto, incluso el más famoso, debe ser considerado como un punto de referencia? Copiemos todos los errores y malentendidos de VS, ¿por qué?

))

 
Andrey Dik:

¿es preciso en todos ellos?

Acabo de probar VS, sí, el comportamiento es el mismo. pero, el comportamiento retardado de un producto, incluso el más conocido, debe ser considerado el punto de referencia... copiemos entonces todos los bugs y malentendidos de VS, por qué.

))

He utilizado al menos 9 IDEs diferentes en el último año. Es así en todas partes.
Bueno, piensa lógicamente, cuántos problemas puede haber si un archivo tiene varios maestros que no ven los cambios de los demás. Si uno compiló con un código, y otro con otro código, ya tienes que crear dos archivos ex5 con el mismo nombre, etc.
 

¿Por qué no hacer el Navegador como una tabla a la manera de la ventana de Market Watch? ElMarket Watch ha implementado la clasificación, ¡felicitaciones! - Llevamos mucho tiempo pidiéndolo.

Ahora llega la era de nuestro nuevo sueño de usabilidad mega cool de la visualización del contenido del Navegador y la ordenación por columnas: Título, Autor, Fecha de Compilación, Fecha de Última Ejecución, Disponibilidad de la Fuente, Tipo de Programa (y deshabilitar la ordenación y volver a la vista actual)

 
Nikolai Semko:
He utilizado al menos 9 IDEs diferentes en el último año. En todas partes es así.
Pues piensa lógicamente, cuántos problemas puede haber si un archivo tiene varios hosts que no ven los cambios de los demás. Si uno compiló con un código y el otro con otro código, ya tienes que crear dos archivos ex5 con el mismo nombre, etc.

Si se abren dos EAs diferentes, ¿cuál puede ser la conexión entre ellos? Sólo se deben guardar los inludios que forman parte de los búhos, y no importa a quién más pertenezcan esos inludios.

Por ejemplo, si abres algún archivo *txt que no está guardado, no tiene nada que ver con el archivo compilado y/o el proyecto, así que ¿por qué guardarlo?

 
Nikolai Semko:

porque sólo se realiza una única iteración en la primera entrada de OnCalculate, cuando prev_calculated = 0. En este punto, es posible que las barras no se hayan formado todavía. Y todas las TFs se forman a partir de 1M TFs.
Insertar en el cheque:

y todo funcionará.

No has entendido nada. El código debería funcionar sólo una vez. Su objetivo es mostrar que el indicador llamado no funciona. El problema es que en cualquier variante del indicador llamado no funcionará si éste (y el llamante) tiene un TimeFrame diferente al de los minutos. He descubierto que es un errorde MetaTrader que se puede solucionar sólo con muletas. Y este problema es bastante antiguo. Puedes leer los detalles en "No puedo obtener los datos de los indicadores del antiguo TF 123".

Вопросы от начинающих MQL5 MT5 MetaTrader 5
Вопросы от начинающих MQL5 MT5 MetaTrader 5
  • 2012.03.12
  • www.mql5.com
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000...
 
Francuz:

No entiendes lo que quieres decir. Se supone que el código sólo funciona una vez. Su objetivo es mostrar claramente que el indicador llamado no funciona. El problema es que el indicador llamado no funcionará si éste (y el que lo llama) tiene un TimeFrame diferente al del minuto. He descubierto que es un errorde MetaTrader que se puede solucionar sólo con muletas. Y este problema es bastante antiguo. Puede leer los detalles en "No puedo obtener los datos del indicador de la TF 123 principal".

Eso fue hace mucho tiempo. El problema se ha resuelto hace tiempo. Se necesita al menos una vez cada dos minutos para acceder a los datos de un marco temporal/símbolo no nativo. En el bucle principal, si todavía no hay datos del marco temporal solicitado, es necesario salir del bucle - sólo devolver cero para esperar el siguiente tick, y el indicador sabía que los datos históricos no se han calculado todavía.