Bibliotecas: MT4Orders - página 13

 
fxsaber:

Actualización

// Lista de cambios:
// 14.06.2017:
// Añadir: Se activa la implementación inicial de la detección de posiciones cerradas SL/TP (закрытых через OrderClose).

Un ejemplo de cómo funciona

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

Pantallas de terminal MT5 vs MT4 - Decepcionado con los cambios en MT 5

fxsaber, 2017.07.07 08:46 AM

Primero ejecute este script

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define  SLIPPAGE 100
#define  OFFSET (SLIPPAGE * _Point)

void OnStart()
{
  if (OrderSelect(OrderSend(_Symbol, OP_BUY, 1, Ask, SLIPPAGE, 0, 0), SELECT_BY_TICKET))
  {
    OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() - OFFSET, OrderOpenPrice() + OFFSET, 0);
    
    if (OrderSelect(OrderTicket(), SELECT_BY_TICKET))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), SLIPPAGE);
  }
}

Resultado:

'6145767': instant buy 1.00 EURUSD at 1.14156 (deviation: 100)
'6145767': accepted instant buy 1.00 EURUSD at 1.14156 (deviation: 100)
'6145767': deal #140159795 buy 1.00 EURUSD at 1.14156 done (based on order #156755661)
'6145767': order #156755661 buy 1.00 / 1.00 EURUSD at 1.14156 done in 252.283 ms
'6145767': modify #156755661 buy 1.00 EURUSD sl: 0.00000, tp: 0.00000 -> sl: 1.14056, tp: 1.14256
'6145767': accepted modify #156755661 buy 1.00 EURUSD sl: 0.00000, tp: 0.00000 -> sl: 1.14056, tp: 1.14256
'6145767': modify #156755661 buy 1.00 EURUSD -> sl: 1.14056, tp: 1.14256 done in 109.586 ms
'6145767': instant sell 1.00 EURUSD at 1.14147, close #156755661 buy 1.00 EURUSD 1.14156 (deviation: 100)
'6145767': accepted instant sell 1.00 EURUSD at 1.14147, close #156755661 buy 1.00 EURUSD 1.14156 (deviation: 100)
'6145767': deal #140159796 sell 1.00 EURUSD at 1.14147 done (based on order #156755662)
'6145767': order #156755662 sell 1.00 / 1.00 EURUSD at 1.14147 done in 219.817 ms


Luego ejecuta esto

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

void OnStart()
{
  if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
    OrderPrint();
}

Resultado

#140159796 2017.07.07 09:38:31 buy 1.00 EURUSD 1.14156 1.14056 1.14256 2017.07.07 09:38:32 1.14147 0.00 0.00 -7.88 0


De esta forma es posible aprender el SL/TP de las posiciones cerradas.

 

MT4 contiene menos información que MT5. Pero nada le impide utilizar las API de negociación de MT4/5 al mismo tiempo

// El script muestra el campo Razón de todas las posiciones cerradas
#include <MT4Orders.mqh>

void OnStart()
{
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      OrderPrint();
      
      Print(EnumToString((ENUM_DEAL_REASON)HistoryDealGetInteger(OrderTicket(), DEAL_REASON)));
    }      
}


Resultado

#141705115 2017.07.18 15:02:37 sell 0.01 EURUSD 1.15508 0.00000 0.00000 2017.07.19 13:04:05 1.15309 0.00 -0.01 1.99 0
DEAL_REASON_CLIENT

#140517682 2017.07.11 12:06:48 buy 0.01 EURUSD 1.13941 1.13926 0.00000 2017.07.11 12:07:10 1.13926 0.00 0.00 -0.15 [sl 1.13926] 0 DEAL_REASON_SL

#137746488 2017.06.20 01:22:26 sell 2.00 EURUSD 1.11474 0.00000 0.00000 2017.06.20 01:22:41 1.11484 0.00 0.00 -20.00 0 DEAL_REASON_EXPERT
 

Cuando OrderSend no estaba sincronizado con el entorno de negociación del terminal, la sincronización automática se incorporó en MT4Orders.

Después de algún tiempo, los desarrolladores construyeron en la sincronización y el antiguo código de sincronización se dejó en la biblioteca con una pequeña excepción - comenzó no sólo para sincronizar, sino también para comprobar si la sincronización OrderSend de los desarrolladores está funcionando correctamente. En caso de error, debería saltar una alerta

    if (MT4ORDERS::OrderSendBug)
    {
      Alert("BUG!!!!!!");


Hay informes de que esta alerta se dispara en raras ocasiones (parece ser cuando la CPU está ocupada), señalando que el OrderSend de los desarrolladores tiene errores cuando se trata de la sincronización con el entorno de negociación. No sé cómo informar de esto a los desarrolladores en SD, ya que no puedo reproducirlo. Pero el hecho permanece.


Por lo tanto, hay dos opciones.

  1. Dejarlo como está - la alerta informará sobre el error de los desarrolladores.
  2. Rechazar la alerta.
En ambos casos, la biblioteca sincroniza forzosamente OrderSend en un tiempo mínimo.
 
// Lista de cambios:
// 03.08.2016:
// Release - escrito y probado en probador fuera de línea solamente.
// ....
// 03.08.2017:
// Añadir: Añadido OrderCloseBy.
// Añadir: Se ha acelerado la operación OrderSelect en el modo MODE_TRADES. Ahora es posible recibir datos del pedido seleccionado a través de
// las correspondientes funciones MT4-Order, incluso si la posición/orden MT5 (no en el historial) no está seleccionada a través de MT4Orders.
// Por ejemplo, a través de MT5-PositionSelect*-functions o MT5-OrderSelect.
// Añadir: Añadido OrderOpenPriceRequest() y OrderClosePriceRequest() - devuelven el precio de una solicitud de operación al abrir/cerrar una posición.
// Con ayuda de estas funciones es posible calcular los correspondientes deslizamientos de órdenes.

La biblioteca tiene un año...

 
fxsaber:

La biblioteca cumple un año...

¡Felicidades! Es un envoltorio maravilloso.

 
fxsaber:

La biblioteca cumple un año...


¡Enhorabuena!

Cierto, probé dos EAs y la experiencia fue negativa, en el primer intento la compilación no pasó - no lo entendí debido a la pobre comprensión de las funciones de trading, en la segunda variante el EA se volvió terriblemente lento - toma todos los recursos del kernel, pero la compilación fue exitosa.

Es difícil decir cuál es la razón de la segunda variante, tal vez no a causa de la clase - hay un semi-automático - el comercio en el nivel de ruptura - los niveles se construyen a mano.

 

Gracias por las felicitaciones, ¡aprecio los comentarios de todos! Siempre se tienen en cuenta.

Aleksey Vyazmikin:

El EA se ha vuelto terriblemente lento - toma todos los recursos del kernel, pero la compilación fue exitosa.

Me gustaría ver el código. Puede enviarlo a PM.

 
fxsaber:

Gracias por las felicitaciones, ¡aprecio los comentarios de todos! Siempre se tienen en cuenta.

Me gustaría ver el código. Puedes enviarme un PM.


He enviado el código a su PM.

 
Aleksey Vyazmikin:

Enviado el código a PM.

Desafortunadamente, originalmente la librería no era responsable de todas las traducciones MT4->MT5, donde no sólo se utilizan funciones de trading MQL4.

En su caso, el trabajo lento del Asesor Experto no es causado por esta biblioteca, sino por una implementación privada de la traducción MT4->MT5, que afecta al trabajo con series temporales, indicadores, etc.

 
fxsaber:

Desafortunadamente, al principio la librería no era responsable de todas las traducciones MT4->MT5, donde no sólo se utilizan funciones de trading MQL4.


Pero ahora es responsable?

fxsaber:

En tu caso, la lentitud del Asesor Experto no es causada por esta librería, sino por una implementación privada de la traducción MT4->MT5, que afecta al trabajo con series temporales, indicadores, etc.

Privada - ¿es mi librería u otra librería?

Hice todo de acuerdo con el artículo conocido por todos, y no hay indicadores especiales allí....

Dudo que este código puede causar sobrecarga del núcleo:

double iMAMQL4(string symbol,
               int tf,
               int period,
               int ma_shift,
               int method,
               int price,
               int shift)
  {
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   ENUM_MA_METHOD ma_method=MethodMigrate(method);
   ENUM_APPLIED_PRICE applied_price=PriceMigrate(price);
   int handle=iMA(symbol,timeframe,period,ma_shift,
                  ma_method,applied_price);
   if(handle<0)
     {
      Print("Объект iMA не создан: Ошибка ",GetLastError());
      return(-1);
     }
   else
      return(CopyBufferMQL4(handle,0,shift));
  }

¿O es la razón?