Errores, fallos, preguntas - página 2722

 
A100:

En principio, no debería darse este caso: la cuestión debería haberse resuelto a nivel del compilador (como en C++). Y en este caso es algo posible y por eso la discusión dura varias páginas

Definitivamente es un error... ¡Pero debe serlo! )))

imho, las expresiones constantes deben conocerse en tiempo de compilación y las expresiones estáticas deben conocerse durante la inicialización de la aplicación en la secuencia de descripción.

y este esquema en MQL, donde hay una especie de control constante, pero puedo asignar una constante a mí mismo en tiempo de ejecución, y puedo utilizar una llamada a la función como una inicialización:

struct A
{
   const double a;
   A():a(AccountInfoDouble(ACCOUNT_BALANCE))
   {
      Print("a = ", a); // a = 9999.290000000001
   }
};
//+------------------------------------------------------------------+
void OnStart()
{
   A a1;
}
//+------------------------------------------------------------------+

y esta "constante" podría estar en la visibilidad local.... en qué momento se convierte en una expresión constante y cómo ayuda.... No sé, no lo entiendo sin manuales, no hay descripción del modelo de memoria - no tiene sentido, bueno, a lo sumo, el uso como debe ser - inicializar con constante en todos los constructores, entonces el compilador ayudará advertencia si accidentalmente decide modificar este campo en el futuro

 
Igor Makanu:
Pero este esquema en MQL, donde hay una especie de control sobre las constantes, pero puedo asignar las constantes en modo aleatorio yo mismo

¿Cuántas veces puedes avergonzarte de la ignorancia básica de los fundamentos de C++?

 

este ejemplo no es para nada confuso:

struct A
{
   const double a;
   A():a(SymbolInfoDouble(_Symbol,SYMBOL_ASK))
   {
      Print("a = ", a);
   }
};
void OnTick()
  {
   const A a;
  }
//+------------------------------------------------------------------+

2020.04.23 21:40:04.474 tst (EURUSD,H1) a = 1.07892

2020.04.23 21:40:04.546 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:04.585 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:05.254 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:05.305 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:05.306 tst (EURUSD,H1) a = 1.07892

 
Stanislav Korotky :

Hay dos programas trabajando en el mismo archivo al mismo tiempo. El que escribe utiliza las banderas FILE_READ|FILE_WRITE|FILE_BIN|FILE_SHARE_READ. El que lee - FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ. Aunque el primer programa guarda periódicamente el archivo con FileFlush, el segundo programa sólo ve la longitud del archivo cuando se abre. He intentado hacer FileSeek de ida y vuelta - no ayuda.

Pregunta: ¿cómo hago para que el programa que lee el archivo recoja los datos que se están reescribiendo?

Esto parece ser un error, fue reportado hace algún tiempo en el foro inglés. No tuve tiempo de informar aquí.

¿No leen los desarrolladores el foro en inglés?

 
Stanislav Korotky:

Hay dos programas trabajando en el mismo archivo al mismo tiempo. El que escribe utiliza las banderasFILE_READ|FILE_WRITE|FILE_BIN|FILE_SHARE_READ. El que lee - FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ. Aunque el primer programa guarda periódicamente el archivo usando FileFlush, el segundo programa sólo ve la longitud del archivo cuando se abre. He intentado hacer FileSeek de ida y vuelta - no ayuda.

Pregunta: ¿cómo hago para que el programa que lee el archivo recoja los datos a sobrescribir?

¿Los dos programas están en el mismo terminal o en dos diferentes?

 

Los métodos de un array de objetos pasados por referencia no funcionan.

Ejemplo:

//+------------------------------------------------------------------+
//| Пример: добавленный метод для расширения файла ..\Include\String\String.mqh
//|--
//| Получает из указанной строки подстроки по заданному разделителю 
//| и возвращает количество полученных объектов-подстрок
//|         НЕ РАБОТАЕТ !!!!!!!!!!
//+------------------------------------------------------------------+
int CString::Split(const string separator,      // разделитель
                   CString      &result[] )     // массив строковых объектов
  {
   string tmp_result[];               

   if(StringLen(separator)==0) return(0);

   ushort u_sep=StringGetCharacter(separator,0); 
   
   int count=StringSplit(m_string,u_sep,tmp_result);

   // временно для проверки
   result[0].Assign("Buy"); // НЕ РАБОТАЕТ !!!!!!
   Alert("ressult[0] = ",result[0].Str()); // <--- уже не отрабатывает
   // конец временно
   
   /*
   for(int i=0;i<count;i++)
     {
      result[i].Assign(tmp_result[i]); // НЕ РАБОТАЕТ !!!!!
     };
   */
   
   return(count);
  }
//+------------------------------------------------------------------+
 
Slava:

¿Estos dos programas están en el mismo terminal o en dos diferentes?

En un terminal. El experto escribe los datos, el indicador los lee. Colgados en gráficos diferentes, pero obviamente podrían estar en el mismo (si es que eso importa). Construye 2380.

 

VS2019

#include <iostream>

int x;

struct A 
{
    const int a;
    A() :a(x) {}
};
int main()
{
    std::cout << "x = ";
    std::cin >> x;
    const A a;
    std::cout << "a.a = " << a.a;
}

x = 12345

a.a = 12345

hmm, todo funciona como en MQL5

Vale, me retracto, no se compila en Sharp

 
Vict:

Bueno, también tienes un constructor. Depende de ti, por supuesto, pero las estructuras son entidades C, el modelo allí es diferente - entidades pasivas con lógica externa (funciones).

No necesariamente. ¿Por qué C? ¿Y C#? - Todas las conversaciones sobre estructuras pasivas son nociones arcaicas, imho. Creo que al menos cada tipo debe tener un constructor. Los campos no inicializados son malos y deben evitarse.

En tu caso, necesitas hacer un método de fábrica para crear un array de estructuras, es decir, algo así:

struct A
{
  const int a;
  A(int init_value) : a(init_value) { }

  static bool CreateArray(A &array[], int count, int init_value)
  {
    //...
  }
};

Y ya hay una de las formas sugeridas anteriormente para llenar los elementos del array.

 

Me he encontrado con el siguiente problema. El indicador dibuja velas

Está trazado en el gráfico. También hay un Asesor Experto que lee los buffers del indicador

Así que me registré y hojeé las etapas y descubrí que el indicador a menudo dibuja velas con un retraso.

Significa que hace varios ticks (hasta un par de minutos exactamente) ya ha calculado y actualizado los buffers y el Asesor Experto está leyendo datos de ellos

(tanto los búhos como el indicador lo anotan en el registro). Pero vemos la imagen antigua en el gráfico. Por ejemplo, esta captura de pantalla está hecha en el momento en que la barra roja ha superado el mínimo de la anterior. Pero en el gráfico sólo vemos el rojo anterior y el verde infravalorado (de hecho es más grande por dos barras).


Y aquí está la foto actual, fue dibujada después. Vemos la avería, inició la captura de la pantalla. Según los registros todo está claro.



¿Quién me puede decir cuál es el problema y cómo acelerar la actualización del gráfico? Llamo a la funciónChartRedraw desde el EA pero sigue teniendo un par de minutos de retraso.

Dos minutos es demasiado, no puedo ni imaginar la razón. Los cálculos no son tan cósmicos como para ralentizarlos tanto.