Errores, fallos, preguntas - página 2654

 

¿Puede alguien aclararnos la siguiente cuestión?

Tener una dll escrita en C# pero compilada:

- para MT5 proyecto habitual de C# - Net Framework dll - 64 bit

- MT4 - Net Framework dll - 32 bits, pero envuelto en llamadas C gestionadas

Las fuentes dll son 100% idénticas, excepto la envoltura MT4, por supuesto,

Sistema operativo Win10-64

Bueno, la pregunta es por qué MT4 llama a las funciones exactamente 4 veces más rápido, las cifras son aproximadamente 100 000 llamadas dll en MT4 durante 7,5 segundos, MT5 durante 30 segundos

 
Igor Makanu:

¿Puede alguien aclararnos la siguiente cuestión?

Tener una dll escrita en C# pero compilada:

- para MT5 proyecto habitual de C# - Net Framework dll - 64 bit

- MT4 - Net Framework dll - 32 bits, pero envuelto en llamadas C gestionadas

Las fuentes dll son 100% idénticas, excepto la envoltura MT4, por supuesto,

Sistema operativo Win10-64

Bueno, la pregunta es por qué MT4 llama a las funciones exactamente 4 veces más rápido, las cifras son aproximadamente 100 000 llamadas dll en MT4 durante 7,5 segundos, MT5 durante 30 segundos

EN MI OPINIÓN. C-runtime en un caso y una máquina virtual en el otro.

 
echado de menos una nueva característica en el foro, donde el nombre, apellido, fecha y junto a las traducciones de los botones, los números - 1 2 3 , no todo el mundo tiene, ayer creo que no tenía, ¿por qué no todos, y cuál es la definición de las páginas?
 

En el Asesor Experto se implementa una interfaz gráfica. También se implementan eventos de usuario (por ejemplo, eventos de cambio de la interfaz gráfica de usuario). Realizo la depuración en datos reales (F5). Tan pronto como pongo un punto de interrupción en un evento de usuario - el depurador se detiene, pero la posterior pulsación de F5 (continuando la depuración) no conduce a cambios en la propia GUI. Pregunta: ¿debería ser así o es un error del depurador?

Si elimino el punto de interrupción (la depuración continúa), los cambios en la interfaz gráfica de usuario son normales.

MT5, build 2340.

 
Vladimir Simakov:

EN MI OPINIÓN. C-runtime en un caso y una máquina virtual en el otro.

hay un .Net virtual en ambos dlls

Encontré la diferencia en el código, incluso tiré la clase base de 32 bits en un hilo separado, porque no tiene otra forma de funcionar

Hice las mismas manipulaciones para MT5, los resultados son más o menos los mismos (tres pruebas cada uno):

MT5: ciclo 100000 , tiempo 8.482981 seg , ciclo 100000 , tiempo 8.638789 seg , ciclo 100000 , tiempo 8.390046 seg

MT4: ciclo 100000 , tiempo 7.128857 seg , ciclo 100000 , tiempo 7.176361 seg , ciclo 100000 , tiempo 7.205439 seg


Bien, asumamos que es algún tipo de licor de Microsoft
 

Saludos. ¡¡¡¡Felices fiestas a todos los hombres !!!!
No entiendo a qué se debe el extraño error de visualización en zigzag de la equidad en el probador. No entiendo el extraño error con la visualización de las acciones en zigzag en el probador. Si cambio la configuración del "Método de liquidación" de "Exchanging Stoks" a "Forex", la equidad se muestra normalmente. A mí me pasó lo mismo hace unos años, quise intentar conectar MT5 a un fondo, lo probé, me asusté y desistí. Ahora lo he vuelto a intentar y lo mismo. ¿Es extraño?

 
¿Por qué no es posible implementar una función con un argumento "universal" que pueda pasar cualquier variable independientemente de su "origen": lvalue, rvalue, literal o variable temporal?
El problema se puede resolver para los métodos de las clases contenedoras "tipificadas", pero no para las funciones normales.

La principal contradicción es que para transferir estructuras es necesario utilizar la transferencia por referencia, y para los literales y las variables temporales - la transferencia por valor.
Como resultado, obtenemos un error de compilación para los tipos lvalue normales porque ambas funciones sobrecargadas son adecuadas para la llamada.
Como solución parcial y sólo para los tipos "primitivos", se pueden construir 12 funciones sobrecargadas:
#define  CREATE_LITERAL_PARAMETER_CALL_HANDLERS_VOID_T1_P2_L2(current_func_name, main_func_name, param_1)          \
   template<typename T> void current_func_name(param_1 p1, const string  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const long    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const int     value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const short   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const char    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const ulong   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const uint    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const ushort  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const uchar   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const double  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const float   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const bool    value){ main_func_name(p1, value);}    
Pero si una función debe aceptar dos argumentos "universales", sólo se necesitan 144 funciones sobrecargadas para implementarla, mientras que en el caso de tres de esos argumentos, se necesitan las 1728 funciones sobrecargadas.


Sugerencia:
Por último, permite a los usuarios pasar literales y variables temporales como argumentos de funciones const ref.
Que sea una directiva # separada - lo que sea...
 

Defectos en el funcionamiento de la caché de la función/clase de la plantilla:
(no se ha solucionado con MT5(build 2340)) ** Comportamiento indefinido, creas un objeto complejo envuelto con el tipo interno "C" varias veces y resulta ser un tipo de datos completamente diferente, quizás "B", quizás "int", lo que quieras...
(no se ha solucionado con MT5(build 2340)) * Error de compilación, error al pasar un puntero de función como un argumento de plantilla const ref.
(no solucionado por MT5(build 2340)) * Error de compilación, el objeto B<int> puede ser creado después del objeto de clase B<void*>, pero si se hace antes, se produce un error de compilación.


Defectos en el trabajo de la función/clase de la plantilla:
(no se ha solucionado con MT5(build 2340)) ** Error de compilación, error dentro de la función de plantilla, el puntero pasado dentro de la operación deconversión de tipo explícito se comporta como una clase, de lo contrario como un puntero.
(no se ha solucionado con MT5(build 2340)) ** Error de compilación, error con la generación de código de la clase de la plantilla mientras se utiliza la clase interna.
(no se ha solucionado con MT5(build 2340)) ** Error de compilación, error al intentar acceder a la clase interna para el parámetro de plantilla de la función de plantilla.
(no se ha solucionado con MT5(build 2340)) ** Error de compilación, error en la generación del método/clase de la plantilla, el proceso de "auto-reemplazo" del parámetro de la plantilla se sale del ámbito en el código del programa principal.
(no se ha solucionado con MT5(build 2340)) * Error de compilación, el error con la clase de la plantilla no generar código automáticamente cuando la clase de la plantilla actúa como un valor de retorno para el método de la plantilla.
(no se ha solucionado con MT5(build 2340)) * Error de compilación, error en la definición de la clase interna - no hay posibilidad de referirse al espacio de nombres global explícitamente cuando se especifica la clase base.


Defectos en las llamadas a funciones sobrecargadas desajuste de prioridad en MQL en comparación con C++:
(no se ha solucionado con MT5(build 2340)) *** Error de compilación cuando hay herencia de clases A <= B <= C <= D y se implementan dos funciones de sobrecarga, por ejemplo, una con parámetro A* y otra con parámetro B*, entonces al pasar en dicha función un objeto C* o D* en MQL se produce un error de compilación "llamada ambigua a función sobrecargada".
(no se ha solucionado con MT5(build 2340)) ** Tiempo de ejecución, desajuste de prioridades en las llamadas a funciones de plantilla sobrecargadas.



Sugerencias:
link- sobre la posibilidad de pasar literales y variables temporales como argumentos de funciones const ref.
enlace- almover los archivos del proyecto en la pestaña Proyecto, para los archivos movidos que están abiertos y ubicados en las pestañas ME, para actualizar automáticamente su ruta de ubicación.
link- para introducir la funcionalidad de la declaración typedef en MQL.
link- sobre la posibilidad de forzar la generación de constructores de copia y operadores de asignación por defecto.


 

Pido ayuda, estoy completamente fuera de onda.

En OnChartEvent, pulsando `C` cancelo/restauro el gráfico de precios.

Y todo estaría bien, pero si la disposición del teclado no se selecciona Inglés - no funciona.


¿Cómo hacer que la detección de la pulsación de `C` sea independiente del diseño seleccionado?

 
fxsaber:

Pido ayuda, estoy completamente fuera de onda.

En OnChartEvent, pulsando `C` cancelo/restauro el gráfico de precios.

Y todo estaría bien, pero si la disposición del teclado no se selecciona Inglés - no funciona.


¿Cómo hacer que la detección de la pulsación de `C` sea independiente del diseño seleccionado?

Necesidad de comprobarlparam

//+------------------------------------------------------------------+
//|                                                 TranslateKey.mq5 |
//+------------------------------------------------------------------+
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   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[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam)
  {
   if(id==CHARTEVENT_KEYDOWN)
     {
      short sym=TranslateKey((int)lparam);
      //--- if the entered character is successfully converted to Unicode
      if(sym>0)
         Print("lparam: ",lparam,", ",sym,"'",ShortToString(sym),"'");
      else
         Print("Error in TranslateKey for key=",lparam);
     }
  }
//+------------------------------------------------------------------+

Para las distribuciones de teclado ru y en (tanto en minúsculas como en mayúsculas) lparam será 67:

TranslateKey (EURUSD,H1)        lparam: 67, 67'C'
TranslateKey (EURUSD,H1)        lparam: 67, 1057'С'
TranslateKey (EURUSD,H1)        Error in TranslateKey for key=20
TranslateKey (EURUSD,H1)        lparam: 67, 1089'с'
TranslateKey (EURUSD,H1)        lparam: 67, 99'c'