Errores, fallos, preguntas - página 436

 
Interesting:

1. ¿Por qué? Los síntomas perjudiciales deben ser tratados, y de forma decisiva.

2. Las variables, arrays y otras cosas no deben ser nombradas de forma consistente o con palabras clave del lenguaje (pero el array "Symbol" es muy llamativo, no se puede saber si es un array o algo más en el código).

1. Pues bien, primero hay que establecer realmente si la sintomatología pertenece a manifestaciones positivas o negativas. En mi experiencia, he tenido casos en los que he intentado cambiar el valor de una variable global en una función que no debía hacerlo (maldito copypaste). He tardado unos días en encontrar este error. Desde entonces, utilizo las variables globales en los casos en que, en principio, no puedo prescindir de ellas.

2. Estoy de acuerdo. Pero si se utilizan dentro de una función, no me molesta. Pero las variables globales con esos nombres son realmente una fuente de confusión futura.

Документация по MQL5: Глобальные переменные терминала / GlobalVariableGet
Документация по MQL5: Глобальные переменные терминала / GlobalVariableGet
  • www.mql5.com
Глобальные переменные терминала / GlobalVariableGet - Документация по MQL5
 

Sin embargo, voy a repetir mi pregunta.

¿Es posible determinar la activación de OnInit dentro de OnTick?
Por ejemplo, ¿puedo declarar una variable estática dentro de OnTick que almacene el número de inicializaciones del EA (si esta o una propiedad similar está presente en MQL5)?

 
voix_kas:

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

Lasvariables globales son al menos visibles desde lejos. Pero ocultar las variables acumulativas serias dentro de las funciones en la estática es una forma de repartir cuidadosamente un rastrillo para uno mismo. Es la primera vez que veo un array estático acumulativo escondido dentro de una función de esta manera. Este es un rastrillo ardiente.

Utiliza las clases: dejarán el nivel global limpio, ocultarán todas las tripas y se desharán de las muletas.

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

Sin embargo, voy a repetir mi pregunta.

¿Es posible determinar la activación de OnInit dentro de OnTick?
Por ejemplo, ¿podemos declarar una variable estática dentro de OnTick que almacene el número de inicialización del EA (si existe tal variable o similar en MQL5)?

Es posible no sólo contar el número de disparos OnInit, sino también determinar por qué se produjo la inicialización (la implementación es otra cuestión).

¿Está familiarizado con _UninitReason, por ejemplo?

 
Se puede leer en OnInit, pero necesito estos datos en otro evento (sin usar variables globales). Se mire como se mire, es una cuestión de aplicación. Lo mismo ocurre con OnDenit.
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
Clases que nunca he escrito. Si alguien puede ayudarme, se lo agradeceré.
Necesidad de escribir una clase WorkSymbols.
Métodos:
cadena GetSymbol[];
bool ActualizarSímbolos(inSímbolosTrabajo);
bool ActualizarSímbolosEstado();
int GetSymbolCount();

Me disculpo si la petición es descarada... Yo también intentaré averiguarlo.
 
Renat:

Sí, parece un error combinar la condición de cambio de símbolo y de marco temporal.

También estoy a favor de separarlas en dos condiciones. El ticket ya ha sido colocado en el servicio de atención al cliente.

Gracias.
 

Lo he cocinado un poco. Las críticas son bienvenidas.

input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF"; // Рабочие инструменты

class CSymbolList {
  private:
    string Symbols[];

  public:
    void   CSymbolList() { SetSymbols(""); }
    void  ~CSymbolList() { ArrayFree(Symbols); }
    int    GetSymbolCount() { return ArraySize(Symbols); }
    void   SetSymbols(string);
    string GetSymbolName(int);
};

void CSymbolList::SetSymbols(string Source) {
  ArrayFree(Symbols);
  for (int count = 1, i = 0; i < SymbolsTotal(false); i++)
    if (StringFind(Source, SymbolName(i, false)) != -1) {
      if (ArrayResize(Symbols, count) != count) {
        ArrayFree(Symbols);
        return;
      }
      Symbols[count-1] = SymbolName(i, false);
      count++;
    }
}

string CSymbolList::GetSymbolName(int Item) {
  if (Item < 0 || !ArraySize(Symbols) || Item >= ArraySize(Symbols)) return "";
  return Symbols[Item];
}

void OnStart() {
  CSymbolList slMain;
  slMain.SetSymbols(inWorkSymbols);
  for (int i = 0; i < slMain.GetSymbolCount(); i++)
    Print(slMain.GetSymbolName(i));
}
 

Lo único que no me gusta aquí es el cambio de tamaño "en vivo" de la matriz que contiene los datos de trabajo.
Pregunta para los desarrolladores, ¿está garantizado que los datos del usuario introducidos previamente en la matriz dinámica que se está modificando se conservarán bajo la siguiente condición?

if (ArrayResize(Symbols, count) == count)
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
voix_kas:

Lo único que no me gusta aquí es el cambio de tamaño "en vivo" de la matriz que contiene los datos de trabajo.
Pregunta para los desarrolladores, ¿está garantizado que los datos introducidos previamente por el usuario en la matriz dinámica que se está modificando se conservarán bajo la siguiente condición?

Apuesto a que está garantizado. Al menos yo cuento con ella siempre, y nunca ha surgido el problema.
Razón de la queja: