Bibliotecas: MT4Orders - página 68

 
'DEAL_SL' - undeclared identifier       MT4Orders.mqh   1186    89
'DEAL_TP' - undeclared identifier       MT4Orders.mqh   1187    91
'MQL_HANDLES_USED' - undeclared identifier      MT4Orders.mqh   1345    104
'MQL_HANDLES_USED' - undeclared identifier      MT4Orders.mqh   1726    124

MT5 no se basa en versiones antiguas.

Y la última versión es buggy https://www.mql5.com/ru/forum/380278/page31#comment_26286913

Новая версия платформы MetaTrader 5 build 3091: Улучшения в работе
Новая версия платформы MetaTrader 5 build 3091: Улучшения в работе
  • 2021.12.04
  • www.mql5.com
В пятницу 22 октября 2021 года будет выпущена обновленная версия платформы MetaTrader 5...
 
traveller00 #:

No se basa en versiones anteriores de MT5.

Yo compilo en versiones frescas y lo uso en b2958. Trato las versiones de lanzamiento de la misma manera que las betas.

 

Tengo una pregunta rápida con respecto a los cierres parciales.

En MT4, cerrar 0.01 lotes de una orden de 0.1 lotes resulta en que la orden original se cierra con un tamaño de 0.01 lotes y el comentario de esa orden parcialmente cerrada cambia a "a: xxxxxx". Al mismo tiempo, se abre una nueva orden de 0,09 lotes con el comentario "de: xxxxxx".

Eso no parece estar sucediendo en MT5 (al menos, OrdersToString() no lista ningún texto de comentario de orden para las porciones abiertas o cerradas) así que no puedo seguir la cadena de cierres parciales como lo haría normalmente.

¿Tienes un fragmento de código compatible con MT4Orders que puedas compartir, o puedes explicarme cómo puedo hacerlo de forma fiable?

 

Cómo ver la ejecución parcial de las posiciones abiertas.

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

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  // Posición abierta.
  const TICKET_TYPE Ticket  = OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0, "Hello!");
  
  // Cierres parciales.
  if (OrderSelect(Ticket, SELECT_BY_TICKET))
  {
    OrderClose(OrderTicket(), 0.01, OrderClosePrice(), 0);
    OrderClose(OrderTicket(), 0.02, OrderClosePrice(), 0);
  }
    
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
    {
      PrintFullOrder();
      
      Print("");
    }
}

#include <fxsaber\TradesID\TradesID.mqh> // https://www.mql5.com/es/code/34173

void PrintFullOrder()
{
  static TRADESID TradesID;
  
  long Deals[];  
  const int Size = TradesID.GetDealsByID(OrderTicketID(), Deals);
  
  for (int i = 0; i < Size; i++)
    if (OrderSelect(Deals[i], SELECT_BY_TICKET))
      OrderPrint();  
}


Resultado.

#50005051444 2021.12.20 21:22:29.566 buy 0.07 GBPUSD 1.32174 0.00000 0.00000 1.32169 0.00 0.00 -0.31 Hello! 0
#50004982892 2021.12.20 21:22:29.566 buy 0.01 GBPUSD 1.32174 0.00000 0.00000 2021.12.20 21:22:29.631 1.32169 0.00 0.00 -0.04 Hello! 0
#50004982893 2021.12.20 21:22:29.566 buy 0.02 GBPUSD 1.32174 0.00000 0.00000 2021.12.20 21:22:29.694 1.32169 0.00 0.00 -0.09 Hello! 0

#50005051217 2021.12.20 21:22:05.921 buy 0.09 USDCHF 0.92179 0.00000 0.00000 0.92179 0.00 0.00 0.00 Hello! 0
#50004982634 2021.12.20 21:22:05.921 buy 0.01 USDCHF 0.92179 0.00000 0.00000 2021.12.20 21:22:05.984 0.92174 0.00 0.00 -0.05 Hello! 0
 
SysFX comentario de esa orden parcialmente cerrada cambia a "a: xxxxxx". Al mismo tiempo, se abre una nueva orden de 0,09 lotes con el comentario "desde: xxxxxx".

Esto no parece estar ocurriendo en MT5 (al menos, OrdersToString() no lista ningún texto de comentario de orden para las porciones abiertas o cerradas) así que no puedo seguir la cadena de cierres parciales como lo haría normalmente.

¿Tienes un fragmento de código compatible con MT4Orders que puedas compartir, o puedes explicarme cómo puedo hacerlo de forma fiable?

Ejemplo.

 
fxsaber #:

Ejemplo.

Perfecto. ...gracias por la rápida respuesta :)

 
// Lista de cambios:
// 28.12.2021
// Fix: OrderSelect(Index, SELECT_BY_POS, MODE_TRADES) tiene en cuenta una desincronización más en el lado MT5.
// Fix: OrderLots(true) tiene en cuenta otro error de sincronización del lado MT5. 


La primera edición de la lista de cambios, en particular, permitió que las dos lógicas fueran idénticas.

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

Bibliotecas: MT4Orders

fxsaber, 2021.05.12 18:24

A primera vista estos dos códigos deberían dar el mismo resultado.

while (OrdersTotal() <= 1)
  if (OrderSelect(0, SELECT_BY_POS))
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
  else
    OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);    


while (OrdersTotal() <= 1)
  if (!OrdersTotal())
    OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);    
  else if (OrderSelect(0, SELECT_BY_POS))
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);


De hecho, no es así. Trate de darse cuenta de la razón.

En general, resultó ser aún mejor para protegerse de las peculiaridades de los obstáculos de orden en MT5.

 
// Lista de cambios:
// 29.12.2021
// Corrección: Mejora de la sincronización en modo ByPass.
 

En MT4, al recuperar órdenes, es posible que se produzcan retrocesos (doble recuento) debido a la agitación de la tabla de órdenes.


En MT4Orders, la indexación de la tabla de órdenes cambia en una situación determinada. Esto ocurre cuando una orden MT5-moret se convierte en una MT5-position. Si intenta encontrar esta situación en algunos servidores, puede obtener un fallo contable. He escrito una demostración para esto.

#define  MT4ORDERS_BYPASS_MAXTIME 1000000 // Tiempo máximo (en µs) de espera para la sincronización del entorno comercial
#include <MT4Orders.mqh> // https://www.mql5.com/es/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define  MinLot SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN)

double GetLots()
{
  double Lots = 0;
  
  for (int i = OrdersTotal() - 1; i >= 0; i--) // Ejecute todas las órdenes - puede haber un fallo aquí.
    if (OrderSelect(i, SELECT_BY_POS))
      Lots += OrderLots();
      
  return(NormalizeDouble(Lots, 2));
}

void OnStart()
{
  MT4ORDERS::OrderSend_MaxPause = 0; // Rechazar la corrección de resultados incorporada en MT5-OrderSend.

  const double NewLots = 0.11;
  
  while (!IsStopped())
  {
    const double Lots = NormalizeDouble(GetLots() + NewLots, 2); // Cuántos lotes debe haber en total después de realizar un pedido.
    const TICKET_TYPE Ticket = OrderSend(_Symbol, OP_BUY, NewLots, Ask, 0, 0 ,0); // Se ha colocado una orden de mercado.
    
    if (Ticket != -1)
    {
      while (!PositionSelectByTicket(Ticket)) // Esperar a que la orden de mercado se convierta en una posición.
      {
        const double Lots2 = GetLots(); // Calcular el volumen total.
        
        if (Lots2 != Lots) // El volumen total no coincide con el cálculo preliminar - salida.
          Alert((string)Lots + " " + (string)Lots2);                        
      }
    }
          
    if (OrderSelect(Ticket, SELECT_BY_TICKET) &&
        OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0)) // Enviar una orden de mercado para cerrar la posición.
      while (PositionSelectByTicket(Ticket))                          // Esperando a que se cierre la posición.
        ;      
  }
    
  Print(MT4ORDERS::ByPass.ToString()); // Imprime las estadísticas de sincronización.
}


Tal EA funcionará en algunas configuraciones. El modo ByPass hace que los valores de alerta sean estables, pero no los elimina.


Yo mismo no comercio sin ByPass-mode, porque es una cosa muy fuerte para eludir MT5-sorpresas. Tampoco comercio sin snapshots. Es el mecanismo de instantáneas que le permite curar de overindexing.


Así es como se ve en el mismo ejemplo.

#define  VIRTUAL_SNAPSHOT_REFRESHTIME 1000 // Tiempo de vida de la instantánea para la actualización. En MT5 requiere conectado MT4Orders.mqh
#define  VIRTUAL_SNAPSHOT_WITHOUT_HISTORY // Descartar la instantánea del historial para mejorar el rendimiento
#include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/es/code/22577

double GetLots()
{
  double Lots = 0;

  VIRTUAL::Snapshot(0, -1, false, ""); // Zasnepsholy entorno comercial real.
  
  for (int i = OrdersTotal() - 1; i >= 0; i--) // Debido al mecanismo de instantáneas, ejecuta todas las órdenes de forma segura.
    if (OrderSelect(i, SELECT_BY_POS))
      Lots += OrderLots();

  VIRTUAL::SnapshotDelete(); // Instantánea eliminada.
      
  return(NormalizeDouble(Lots, 2));
}


Recomiendo el paquete ByPass+Snapshot. No sólo ayuda a evitar las trampas, sino que también reduce significativamente el consumo de recursos computacionales. Especialmente cuando hay muchas órdenes/asesores multidivisa.

 

Parte de un anuncio de Freelance.

Конвертация должна быть выполнена в родном MQL5 без использования сторонних библиотек типа MT4Orders.

El desarrollador debería proporcionar el código fuente antes de cerrar el trabajo para poder verificar cómo se realiza la conversión.

Aparentemente algo no está funcionando bien en alguna parte.