Errores, fallos, preguntas - página 2859

 
fxsaber:

En general, ¿qué opina de una posible aplicación?

Hay muchas posibilidades de aplicación

pero todo se reduce a la tarea de intercambio de datos entre EAs

la forma más fácil es comprobar el permiso para la inicialización y realizar la inicialización misma en OnTick() - permitiría evitar restaurar los gráficos y luego ejecutar el EA en ellos, y guardar el EA antes de cerrarlo sería posible hacerlo en OnDeinit()

noes importante quién gestionará este zoo, si el EA principal o un servicio

 

En el registro del probador

2020.09.28 00:41:09.491 wrong tester bar time
2020.09.28 00:41:09.491 history error 9 in undefined function

¿Qué significa?

 
Aleksey Vyazmikin:

En el registro del probador

¿Qué significa?

Significa que cuando se recibe el siguiente valor de m1 ohlc (o estado de la barra cuando se comprueba por precios de apertura), el campo de tiempo contiene 0

función indefinida significa que el problema se ha producido fuera de las funciones predefinidas (OnTick, OnTimer, etc.), es decir, en el bucle principal del comprobador

 
Slava:

Significa que cuando se obtiene el siguiente valor m1 ohlc (o el estado de la barra cuando se comprueba por precios de apertura) el campo de tiempo contiene 0

función indefinida significa que el problema se ha producido fuera de las funciones predefinidas (OnTick, OnTimer, etc.), es decir, en el bucle principal del comprobador

Todo ha funcionado bien durante todo el día y luego ha empezado. ¿Qué puedo hacer como usuario?

 
Slava:

Significa que cuando se obtiene el siguiente valor m1 ohlc (o el estado de la barra cuando se comprueba por precios de apertura) el campo de tiempo contiene 0

función indefinida significa que el problema se ha producido fuera de las funciones predefinidas (OnTick, OnTimer, etc.), es decir, en el bucle principal del comprobador

No entiendo, ¿hay un error en mi código o es un error en el terminal? He borrado todo el historial, pero no ha servido de nada.

Añadido:

¡Encontré una función en mi código, al desactivarla se evita el error, pero en otro EA esta función funciona correctamente! ¿Cómo es eso? Puedo dejarlo en mi mensaje privado.

Incluso cuando esta función con errores está habilitada, OnTick() se ejecuta completamente en la primera barra y luego ese error.

En diferentes terminales se confirma el error.

Se ejecuta en las garrapatas - no hay error...

Pero la extrañeza está en el registro:

2020.09.28 17:22:22.327 2020.09.18 09:45:02   Test_01

En los ticks si mirar la herramienta, la primera garrapata fue exactamente a las 10:00, y la sesión de negociación es todavía cerrado en este momento. Esto es en modo visual, sin garrapata la primera impresión viene a las 10 en punto.

 
Igor Makanu:

La forma más sencilla es comprobar el permiso de inicialización al principio de cada EA en OnTick()

Este es el principal punto de fricción del problema.
 
fxsaber:
Este es el principal problema de la tarea.

Trata de prestar atención a las identificaciones de la carta y corre por antigüedad. Pero esto no anula la interacción de los EA. O hacer un archivo o tal vez una base de datos SQLite con los ID de los gráficos en la secuencia de lanzamiento.

Algo así como, en la primera inicialización, si no hay Chart_ID() en la lista, entonces se introduce en la lista. Si no se cierra por cierre de terminal, se elimina de la lista. De esta manera será posible configurar la interacción de los EAs.

 
fxsaber:
Este es el principal punto de fricción del problema.

esbozado como yo lo veo... creado 2 EA con este código:

#define  PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
const string this_ea_name = PREFIX_NAME + MQLInfoString(MQL_PROGRAM_NAME);
void OnTick()
{
   static ENUM_EA_STATE state = GlobalVariableSet(this_ea_name, ENUM_EA_STATE::READY_TO_INIT) > 0 ? READY_TO_INIT : ERROR_GLOBAL_VARIABLE;
   Comment(EnumToString(state));
   if(state != WORK)
   {
      if(state == ERROR_GLOBAL_VARIABLE) return;
      if(!My_Init(this_ea_name)) return;
      GlobalVariableSet(this_ea_name, ENUM_EA_STATE::WORK);
      state = WORK;
   }
   Print(this_ea_name, " ", __FUNCTION__);
}
//+------------------------------------------------------------------+
bool My_Init(const string chek_ea_name)
{
   if(GlobalVariableGet(chek_ea_name) == (ENUM_EA_STATE)ENABLE_INIT)
   {
      Print("EA is init");
      return(true);
   }
   return(false);
}
//+------------------------------------------------------------------+

y un control EA, que funciona en temporizador ( 5 seg )

#define  PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
//+------------------------------------------------------------------+
int OnInit()
{
   EventSetTimer(5);
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTimer()
{
   for(int i = GlobalVariablesTotal() - 1; i >= 0; i--)
   {
      string curr_gname = GlobalVariableName(i);
      if(StringFind(curr_gname, PREFIX_NAME) !=-1)
      {
         if(GlobalVariableGet(curr_gname) == (ENUM_EA_STATE)READY_TO_INIT)
         {
            if(GlobalVariableSet(curr_gname, ENUM_EA_STATE::ENABLE_INIT) > 0)
            {
               Print("Enable Init : ", curr_gname, ".....exit");
               return;
            }
         }
      }
   }
}
//+------------------------------------------------------------------+


Comprobado, todo funciona, lo único, o no funcionaba con GlobalVariableSetOnCondition() para hacer un registro en variables globales

 
fxsaber:
Este es el principal problema de la tarea.

GlobalVariableSetOnCondition es todo lo que se necesita para resolver el problema.

La operación sólo se permite cuando GlobalVariableSetOnCondition ha devuelto true.
Después de la inicialización exitosa y la liberación de los recursos, devuelva la variable principal a su estado original y otro EA se iniciará.

En DeInit - borrado incondicional de la variable, para no encontrarse en la terminal sin EAs en absoluto (si la carga anterior no se completó correctamente).

 
Alexey Viktorov:
Igor Makanu:
Andrey Khatimlianskii:

Gracias por las recomendaciones. Voy a mirar GlobalVariableSetOnCondition.