Características del lenguaje mql4, sutilezas y técnicas - página 6

 
fxsaber:
A diferencia de MQL5, en MQL4 las matrices estáticas pueden cambiar de tamaño.
No siempre

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Nueva versión de la plataforma MetaTrader 5 build 1595: acceso al historial de precios

fxsaber, 2017.05.01 16:36

#property strict

template <typename T>
struct ARRAY
{
  T Simple[100];
};

void OnStart()
{
  int ArraySimple[100];
  ARRAY<int> Array;

  Print(ArrayResize(Array.Simple, 10)); // MQL4: -1
  Print(ArrayResize(ArraySimple, 10));  // MQL4: 10
  
  Print(ArraySize(ArraySimple));        // MQL4: 10
  Print(ArraySize(Array.Simple));       // MQL4: 100
}
 

Siempre ha habido un error de Trailing Stop en MT4. Si observas durante un fuerte movimiento de precios hacia arriba y hacia abajo,
puedes ver el SL moviéndose hacia arriba y hacia abajo. Aquí cogió un pequeño movimiento, pasa muchas veces más grande
2017.05.22 10:53:38.563 '9898616': trailing stop #1465775202 -> 1.29765
2017.05.22 10:53:38.483'9898616': trailing stop #1465775202 -> 1.29764
2017.05.22 10:53:33.236'9898616': trailing stop #1465775202 -> 1.29763
2017.05.22 10:53:33.130'9898616': trailing stop #1465775202 -> 1.29764
2017.05.22 10:53:32.813 '9898616': trailing stop #1465775202 -> 1.29762
Lo conseguí cuando SL = 2 (último dígito para simplificar), en el siguiente tick el precio subió y el terminal dio una orden de subir SL a 4.
En el siguiente tick bajó pero el SL sigue en 2. El terminal emite una orden para elevar la SL a 3.
El servidor, como una jirafa de cuello largo, procesó el primer pedido y elevó la SL a 4. El servidor procesó la segunda orden y disminuyó la SL a 3.
Así, el terminal envía órdenes extra sin sentido y aumenta la carga del servidor.
Además, existe el riesgo de pérdidas innecesarias para el operador debido al movimiento inverso del SL.
Esto también se aplica a los programas que siguen a EA o a los scripts . En parte lo corregimos moviendo el SL en pasos de 3...5 pips.

Qué hacer. Guardando el valor de SL, emitido en el último OrderModify.
Y luego calcular el siguiente pedido en base a este valor.
Sería así: dos órdenes menos para el servidor, moviendo SL sólo hacia adelante, reduciendo la carga de la CPU del ordenador
2017.05.22 10:53:38.563 '9898616': trailing stop #1465775202 -> 1.29765
2017.05.22 10:53:33.130 '9898616': trailing stop #1465775202 -> 1.29764
2017.05.22 10:53:32.813 '9898616': trailing stop #1465775202 -> 1.29762

 

Cuando se modifican las órdenes, a menudo es necesario comparar el TP/SL anterior con el nuevo valor a modificar. Si intentamos modificarlo con el valor antiguo, obtendremos el error #1.

Tomemos el ejemplo de comparar el antiguo SL (100,03) y el nuevo SL(100,02) para el USDJPY (Dígitos = 2). Está escrito en la ayuda:

El segundo método consiste en comparar la diferencia normalizada de dos números reales con un valor cero. Comparar la diferencia de los números normalizados con el cero es inútil, ya que como consecuencia de cualquier operación matemática con números normalizados el resultado es no normalizado.

Es decir, la comparación debe hacerse de esta manera:

if(NormalizeDouble(100.03 - 100.02, Digits) != 0) // можно модифицировать

Pero a veces el corredor puede dar precios no normalizados. Y por ejemplo, tenemos el precio 100,025, no 100,02. Habiendo comparado según el esquema anterior, obtendremos la diferencia de 0,01, es decir, podemos modificarla. Pero al haber pasado por la modificación normalizada a Dígitos 100.025, en realidad pasaremos a 100.03 y en consecuencia obtendremos el error #1.

En general, por experiencia he llegado a la conclusión de que a igualdad de Dígitos para las modificaciones es mejorcomparar la diferencia de los números normalizados con cero (lo que la ayuda no recomienda hacer).

Guión para comprobar:

void OnStart()
{
  double a = 0.02;
  double b = 0.015;
  
  Print(" norm1 dif=", ND(a - b));            // результат = 0.01
  Print(" norm2 dif=", ND(a) - ND(b));        // результат = 0.0
}

double ND(double d) {return NormalizeDouble(d, 2);}
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL4
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL4
 
if(MathAbs(a-b)>=Point)
 
Yurij Kozhevnikov:
Sí, puedes hacerlo. Esta es la primera forma de comparación que se ofrece en la ayuda. Sólo estaba señalando la trampa de la normalización de números reales en la que yo mismo caí, utilizando el segundo método recomendado en la documentación.
 
Los comentarios que no son relevantes para este tema se han trasladado a "Organizar el ciclo de pedidos".
 

A diferencia de OrderProfit() en MT4 OrderCommission() almacena datos no redondeados a céntimos.


SZZ En OrderPrint() la comisión se redondea (como en GUI).

 
fxsaber:

A diferencia de OrderProfit() en MT4 OrderCommission() almacena datos no redondeados a céntimos.


SZZ En OrderPrint() la comisión se redondea (como en GUI).

Por lo tanto, ¿qué debo hacer para obtener el valor correcto de OrderProfit()+OrderComission()+OrderSwap()?

 
Artyom Trishkin:

En consecuencia, para obtener el valor correcto de OrderProfit()+OrderComission()+OrderSwap(), ¿qué hay que hacer?

¡Nada! Este es el valor más correcto. Gracias a esta comisión, podemos ver en la GUI que la comisión total difiere en un céntimo de la suma de los números que muestra la GUI.

 
fxsaber:

¡Nada! Este es el valor más correcto. Gracias a esta comisión, se puede observar en la GUI que la comisión total difiere en un céntimo de la suma de los números que muestra la GUI.

Entonces no lo entiendo en absoluto. ¿Qué quiere decir con "OrderCommission() almacena datos no redondeados a céntimos"? ¿Dónde están redondeados? ¿Y cómo se redondean?