Errores, fallos, preguntas - página 435

 
voix_kas:

En general, es curioso cómo resulta.
Por una corazonada, pensé que la función OnDenit es una especie de destructor y OnInit - el constructor de un EA.

De hecho, resulta que OnInit es un evento múltiple (dentro de la vida del Asesor Experto). No está claro entonces, ¿por qué necesitamos generar explícitamente el evento OnDenit si sabemos que el EA no termina su operación (por ejemplo, en caso de cambio de periodo del gráfico)?

Cuando los símbolos cambian, el Asesor Experto se carga en caliente para un inicio rápido y guardar la base informativa de su vida anterior.

Por ejemplo, el Asesor Experto está en el gráfico, ha acumulado sus estadísticas y su lógica, y luego le cambian el marco de tiempo y tiene que trabajar desde cero en el reinicio en frío.

Y hay una pregunta más.
El motivo de la desinicialización de REASON_CHARTCHANGE: se ha cambiado un símbolo o un periodo del gráfico.
Por favor, explique cómo se puede cambiar el símbolo de un gráfico sin borrar un EA en él?

En el modo de reinicio en caliente.
 

Yedelkin, interesante, Renat
Gracias por las aclaraciones.

Creo que también tiene sentido incluir una lista explícita de reinicios "calientes" y "fríos" en la documentación.

Si no hay reinicialización en cada OnInit, para el EA multicast tendremos que usar una muleta, que es una bandera global. :(
Publicaré el código un poco más tarde.

 
Interesting:

En cualquier caso, el Asesor Experto no se borrará durante la inicialización normal, sólo se le permitirá operar bajo ciertas configuraciones del terminal (pero para esto el Asesor Experto debe entender que el símbolo ha sido cambiado...).

Por cierto, eso me recuerda. He querido preguntar a los desarrolladores sobre esos ajustes.

Renat, por favor, haz dos casillas diferentes para desactivar el comercio al cambiar el marco temporal y el símbolo. Son dos cambios fundamentalmente diferentes.

No me gustaría que mis EAs dejaran de operar al cambiar de marco temporal - es absolutamente innecesario - de todos modos están procesando cada tick y no hay problemas con ello.

Pero el cambio del símbolo es fundamentalmente importante. Me gustaría mantener este cierre... pero ahora estos dos ajustes están por alguna razón sincronizados y regulados juntos.

Estoy resolviendo este problema programáticamente (almacenando el símbolo original en una variable estática y controlando los cambios en el inite). Pero sería mejor si esto se pudiera bloquear a nivel de terminal.

Mejor aún, sería posible regular la posibilidad misma de cambiar de marco de tiempo o de símbolo cuando el Asesor Experto está funcionando. ¿Por qué dejar de comerciar por una estupidez-olvido?

Es decir, sería mucho mejor bloquear el cambio de marco temporal y/o símbolo (¡por separado!), si se especifica en la configuración que está prohibido cuando el Asesor Experto está presente en un gráfico.

// Dando un mensaje correspondiente al intentar hacerlo.

En realidad, esto también se puede resolver de forma programada (devolviendo a la fuerza el símbolo o el marco temporal a su lugar), pero creo que usted mismo está interesado en una configuración realmente conveniente a nivel de terminal.

 

MetaDriver:

Renat, por favor, haz dos casillas diferentes para bloquear la negociación en el cambio de marco temporal y en el cambio de símbolo. Son dos cambios fundamentalmente diferentes.

No quiero que mis EAs dejen de operar cuando cambien de marco temporal - es absolutamente innecesario - de todos modos están procesando cada tick y no hay problemas con eso.


Apoyo la idea, deberías hacer dos ticks y una separación en los códigos de razón de desinicialización (sería conveniente así).

Pero bloquear la posibilidad de cambiar de plazo, no sé cómo (sobre el símbolo), es demasiado para mí.

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

Eso me recuerda. Llevo mucho tiempo queriendo preguntar a los desarrolladores sobre estos ajustes.

Renat, por favor, haz dos casillas diferentes para bloquear la negociación en el cambio de marco temporal y en el cambio de símbolo. Son dos cambios fundamentalmente diferentes.

Sí, parece que la condición de cambiar el símbolo y el plazo se combinaron para nada.

También estoy a favor de dividirlos en dos condiciones. El ticket ya ha sido colocado en el Service Desk.

 

En realidad, adjunto el código para definir las herramientas de trabajo para la multiherramienta. Las críticas son bienvenidas. :)

input uint   inTimeToRescan = 3600; // Интервал времени для принудительного пересканирования рабочих инструментов, в секундах
input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF"; // Рабочие инструменты


bool Initialize;


int OnInit() {
  //...
  Initialize = true;
  //...
}


void OnTick() {
  static ulong  LastScan = 0;
  if ((ulong)TimeCurrent() - LastScan >= inTimeToRescan) Initialize = true;

  static string Symbol[];
//  static int    Forecast[];
//  static int    Volatile[];

  if (Initialize) {
    Comment("Опрос рабочих инструментов...");
    int SymbolCount_1 = 0;
    for (int i = 0; i < SymbolsTotal(false); i++)
      if (StringFind(inWorkSymbols, SymbolName(i, false)) != -1)
        SymbolCount_1++;

    if (!SymbolCount_1) return;
    if (ArrayResize(Symbol, SymbolCount_1) != SymbolCount_1) return;

    int SymbolCount_2 = 0;
    for (int i = 0; i < SymbolsTotal(false); i++)
      if (StringFind(inWorkSymbols, SymbolName(i, false)) != -1)
        Symbol[SymbolCount_2++] = SymbolName(i, false);

    if (SymbolCount_1 != SymbolCount_2) return;

    //if (ArrayResize(Forecast, SymbolCount_1) != SymbolCount_1) return;
    //if (ArrayResize(Volatile, SymbolCount_1) != SymbolCount_1) return;

    Initialize = false;
  }
  //...
}

Cada tick un Asesor Experto intenta obtener una lista de instrumentos que funcionan.
La actualización de la lista de instrumentos de trabajo se produce en dos condiciones: 1) cuando se activa OnInit, 2) después del tiempo que se estableció en el parámetro de entrada del EA.
Como vemos, se utiliza una muletilla en forma de variable global(bool Initialize) para detectar la siguiente inicialización. Si hubiera una inicialización de la estática, no sería necesaria.

Considero que las variables globales son un mal, así como el operador goto incondicional en su momento.

 
voix_kas:

En ausencia de reinicialización en cada OnInit, para los multilaterales debe utilizarse una "muleta" en forma de bandera global. :(

Es mejor escribir el código cuidadosamente desde el principio, sin dejar muletas en forma de variables estáticas intermedias.

Como solución, ocultar esos datos dentro de una clase. Si la clase está muerta, el entorno también lo está.

Y a nivel global, dejar un mínimo de variables estáticas.

Документация по MQL5: Основы языка / Переменные / Статические переменные
Документация по MQL5: Основы языка / Переменные / Статические переменные
  • www.mql5.com
Основы языка / Переменные / Статические переменные - Документация по MQL5
 
voix_kas:

En realidad, estoy adjuntando el código para definir las herramientas de trabajo para la multicocina. Las críticas son bienvenidas. :)

Como consejo - ponga Symbol en el nivel global y póngalo a cero en OnInit. Si el array está vacío, entonces es el momento de inicializarlo.

Y no hay banderas adicionales.

 
Renat:

Como consejo, lleva Symbol a nivel global y ponlo a cero en OnInit. Si el array está vacío, entonces es el momento de inicializarlo.

Y no hay banderas adicionales.

Supongo que estoy paranoico. No me gustan las variables públicas (globales). Lo considero un muvetón.
¿Es posible definir alguna forma dentro de OnTick para activar OnInit?
Por ejemplo, ¿puedo declarar una variable estática dentro de OnTick que almacene el número de inicializaciones del EA (si existe tal propiedad o similar en MQL5)?

 
voix_kas:

Las variables globales son malvadas, al igual que el operador goto incondicional en su día.

Debo estar paranoico. No me gustan las variables públicas (globales). Me parece un muvetón.

1. ¿Por qué? Hay que deshacerse de los síntomas perjudiciales, y hacerlo con decisión.

2. No nombres variables, arrays y otras cosas con palabras clave consonantes o similares del lenguaje (pero el array "Symbol" es muy llamativo, no se puede saber si es un array o algo más en tu código).

Renat:

La solución es ocultar esos datos dentro de la clase. Si la clase muere, también lo hace el entorno.

Y a nivel global, dejar un mínimo de variables estáticas.

Buena sugerencia. Es hora de cambiar a OOP ya... :)
Razón de la queja: