Bibliotecas: MT4Orders - página 20

 

Foro sobre negociación, sistemas automatizados de negociación y ensayo de estrategias de negociación

Características del lenguaje mql5, sutilezas y técnicas de trabajo

fxsaber, 2018.02.19 08:39 AM

En la red al mismo tiempo en el mismo símbolo puede ser una posición abierta y varias órdenes de mercado de cualquier dirección. Por ejemplo, una posición de COMPRA y una orden de COMPRA.

En la librería MT5, las órdenes MT5 y las posiciones MT5 son una entidad - órdenes MT4. Por esta razón, en esta situación es posible obtener varias órdenes de COMPRA/VENTA-MT4 sobre un símbolo en una cuenta de compensación. Esto no es un error y puede conducir a nada malo. Pero escribo sobre ello por si a alguien le sorprende esta situación.

Es cierto que no he conseguido encontrar una cuenta demo de este tipo.

Esto es más una advertencia teórica. No lo he encontrado en la práctica.

 
Este es el tipo de pedidos (muy raros ) que la biblioteca deliberadamente no ve en el Historial de Ofertas. Las versiones anteriores de bibla las veían. Si usted opina que el comportamiento actual debería ser el mismo, hágamelo saber.
 
// Lista de cambios:
// 06.03.2018
// Añadir: Añadido TICKET_TYPE y MAGIC_TYPE para que puedas escribir código unificado multiplataforma.
// sin advertencias del compilador (incluido el modo estricto de MQL4).

A continuación se muestra el código que compila sin advertencias bajo MQL4/5

#property strict

#include <MT4Orders.mqh>

void OnStart()
{
// long Ticket = 0;
// long Magia = 0;
  TICKET_TYPE Ticket = 0;
  MAGIC_TYPE  Magic = 0;
  
  long Tmp = OrderSelect(Ticket, SELECT_BY_TICKET) + 
             OrderDelete(Ticket) +
             OrderCloseBy(Ticket, Ticket) +
             OrderClose(Ticket, 1, 0, 0) +    
             OrderSend(_Symbol, OP_BUY, 1, 0, 0, 0, 0, NULL, Magic);
}

¡Gracias a @Andrey Voytenko por sugerir esta solución!

 
fxsaber:

A continuación se muestra el código que compila sin advertencias bajo MQL4/5

Gracias a @Andrey Voytenko por sugerir esta solución.

¿Para qué sirve este hack?

 
Rashid Umarov:

¿Para qué sirve este hack?

Los tipos largos están comentados en el ejemplo. Si se dejan, no habrá advertencias en MQL5 y NoStrict-MQL4. Pero en MQL4 estricto sí se producirán.

Para poder escribir librerías multiplataforma sin las correspondientes advertencias, se añadió esta funcionalidad.

No es necesario utilizarla en absoluto. Se trata de una comodidad adicional para aquellos que puedan enfrentarse a una tarea multiplataforma de este tipo.

 

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

Robot de MT4 a MT5

fxsaber, 2018.03.08 09:27 pm.

// https://www.mql5.com/es/code/16006
#define   MT4_TICKET_TYPE // Obligar a OrderSend y OrderTicket a devolver un valor del mismo tipo que en MT4 - int.
#include <MT4Orders.mqh>
#include <MQL4_To_MQL5.mqh>

int Hour( void )
{
  return((int)((TimeCurrent() % (24 * 3600)) / 3600));
}

int Minute( void )
{
  return((int)((TimeCurrent() % 3600) / 60));
}

#include "super-signals-channel.mq4" // https://www.mql5.com/ru/forum/231135#comment_6751304
 

Estoy intentando implementar una estrategia (que obviamente funciona bien en MT4) pero me he topado con un muro.

La EA comienza una nueva secuencia de operaciones cada vez que se genera una nueva señal, por lo que cada par negociado normalmente tendrá múltiples secuencias en ejecución.

Cada operación tiene un SL y un TP, y el EA necesita hacer un seguimiento de lo que ha ocurrido (SL o TP) en la operación más reciente de cada secuencia comprobando el historial de órdenes.

Desafortunadamente, esto no parece ser posible basado en las notas de la biblioteca (abajo) y varios intentos de hacer que el sistema funcione:

// En MT4 OrderSelect en modo SELECT_BY_TICKET selecciona un ticket independientemente de MODE_TRADES / MODE_HISTORY,
// ya que "El número de ticket es un ID de orden único".
// En MT5, el número de ticket NO es único,
// por lo que OrderSelect en modo SELECT_BY_TICKET tiene las siguientes prioridades de selección para tickets coincidentes:
// MODE_TRADES: posición existente> orden existente> transacción> orden cancelada
// MODE_HISTORY: transacción> orden cancelada> posición existente> orden existente

A partir de la experimentación, he confirmado que el número de ticket siempre cambia después de un evento SL/TP, y que la única información común es el número mágico - ni siquiera se conserva el comentario de la orden.

En las pruebas, la colocación de una orden inicial con un SL, TP, número mágico y comentario de operación devuelve el ticket #2 y muestra toda la información esperada.

Sin embargo, cuando se alcanza el SL o el TP, el ticket nº 2 desaparece y no se puede recuperar utilizando SELECT_BY_POS o SELECT_BY_TICKET.

En su lugar, (suponiendo que no haya otra actividad de negociación) aparecerá el ticket nº 3, que no tiene ningún comentario de orden establecido.

Sin coherencia en cuanto al número de ticket, y sin comentario de orden al que hacer referencia, no parece haber una forma sencilla de identificar la última orden de una secuencia determinada :(

Esperemos que @fxsaber pueda encontrar una solución o sugerir una solución :)

 
SysFX:

Desgraciadamente, no entendí el problema.

 

Lo siento por la respuesta tardía :(

El problema es que la información comercial 'MODE_HISTORY' es básicamente inutilizable porque:

1) cuando una operación se cierra, el número de ticket cambia ...puede comprobarlo fácilmente abriendo una operación de compra/venta con un TP y un SL - si la operación se abre como ticket #2, esa operación se convertirá en ticket #3 en el histórico después de que se active el SL o el TP

2) se pierde el número mágico

3) se pierde el comentario del ticket

Por lo tanto, si el código del EA necesita comprobar si una operación se cerró con beneficios o pérdidas, es imposible porque no hay información disponible para identificar la operación.

Espero que puedas ajustar las cosas para mantener el número mágico y hacer que el comentario de la operación se comporte como MT4 - tal vez puedas encontrar una manera de mantener el número de ticket también.

 
SysFX:

Perdón por la respuesta tardía :(

La cuestión es que 'MODE_HISTORY' información comercial es básicamente inutilizable porque:

1) cuando una operación se cierra, el número de ticket cambia ...puede comprobarlo fácilmente abriendo una operación de compra/venta con un TP y un SL - si la operación se abre como ticket #2, esa operación se convertirá en ticket #3 en el histórico después de que se active el SL o el TP

2) el número mágico se pierde

3) se pierde el comentario del ticket

Por lo tanto, si el código del EA necesita comprobar si una operación se cerró con beneficios o con pérdidas, es imposible porque no hay información disponible para identificar la operación.

Espero que puedas ajustar las cosas para mantener el número mágico y hacer que el comentario de la operación se comporte como MT4 - tal vez puedas encontrar una manera de mantener el número de ticket también.

Ejemplo

#include <MT4Orders.mqh>

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnInit()
{
  long Ticket;
  
  PRINT((Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, Bid - 100 * _Point, Bid + 100 * _Point, "Hello World!", 12345)));
  
  if (OrderSelect(Ticket, SELECT_BY_TICKET))
    PRINT(OrderClose(OrderTicket(), 0.3, OrderClosePrice(), 0));
}

void OnDeinit( const int )
{
  const int Total = OrdersHistoryTotal();
  
  for (int i = 1; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      OrderPrint();
      
      PRINT(OrderTicket());
      PRINT(OrderMagicNumber());
      PRINT(OrderComment());
      PRINT(OrderTicketOpen());
    }
}


Resultado

2018.03.25 00:00:00   instant buy 1.00 EURUSD at 1.23527 sl: 1.23414 tp: 1.23614 (1.23514 / 1.23527)
2018.03.25 00:00:00   deal #2  buy 1.00 EURUSD at 1.23527 done (based on order #2)
2018.03.25 00:00:00   deal performed [#2  buy 1.00 EURUSD at 1.23527]
2018.03.25 00:00:00   order performed buy 1.00 at 1.23527 [#2  buy 1.00 EURUSD at 1.23527]
2018.03.25 00:00:00   (Ticket=OrderSend(_Symbol,OP_BUY,1,Ask,0,Bid-100*_Point,Bid+100*_Point,Hello World!,12345)) = 2
2018.03.25 00:00:00   instant sell 0.30 EURUSD at 1.23514, close #2 (1.23514 / 1.23527)
2018.03.25 00:00:00   deal #3  sell 0.30 EURUSD at 1.23514 done (based on order #3)
2018.03.25 00:00:00   deal performed [#3  sell 0.30 EURUSD at 1.23514]
2018.03.25 00:00:00   order performed sell 0.30 at 1.23514 [#3  sell 0.30 EURUSD at 1.23514]
2018.03.25 00:00:00   OrderClose(OrderTicket(),0.3,OrderClosePrice(),0) = true
2018.03.26 01:04:40   take profit triggered #2  buy 0.70 EURUSD 1.23527 sl: 1.23414 tp: 1.23614 [#4  sell 0.70 EURUSD at 1.23614]
2018.03.26 01:04:40   deal #4  sell 0.70 EURUSD at 1.23614 done (based on order #4)
2018.03.26 01:04:40   deal performed [#4  sell 0.70 EURUSD at 1.23614]
2018.03.26 01:04:40   order performed sell 0.70 at 1.23614 [#4  sell 0.70 EURUSD at 1.23614]
final balance 10000046.11 EUR
2018.03.26 23:59:59   #3 2018.03.25 00:00:00 buy 0.30 EURUSD 1.23527 1.23414 1.23614 2018.03.25 00:00:00 1.23514 0.00 0.00 -3.16 Hello World! 12345
2018.03.26 23:59:59   OrderTicket() = 3
2018.03.26 23:59:59   OrderMagicNumber() = 12345
2018.03.26 23:59:59   OrderComment() = Hello World!
2018.03.26 23:59:59   OrderTicketOpen() = 2
2018.03.26 23:59:59   #4 2018.03.25 00:00:00 buy 0.70 EURUSD 1.23527 0.00000 1.23614 2018.03.26 01:04:40 1.23614 0.00 0.00 49.27 tp 1.23614 12345
2018.03.26 23:59:59   OrderTicket() = 4
2018.03.26 23:59:59   OrderMagicNumber() = 12345
2018.03.26 23:59:59   OrderComment() = tp 1.23614
2018.03.26 23:59:59   OrderTicketOpen() = 2

stop loss!!!


PS hilo de discusión ruso.