Bibliotecas: MT4Orders - página 81

 
Stanislav Korotky #:

Con la directiva #define MT4ORDERS_FASTHISTORY_OFF activada, no compila - genera muchos errores.

Se trata de un rudimento histórico que no consigo eliminar.

MQ ha creado tantos quebraderos de cabeza que sólo merece la pena usar variantes trucadas.

Debería haber una actualización importante de la librería, a pesar de la extraña falta de informes de errores. Aún no está lista.

 
OrderSelect(i, SELECT_BY_POS)

En esta operación, siempre hay posiciones abiertas en los índices inferiores y órdenes pendientes en los índices superiores.

Con la ayuda de este hecho se puede acelerar algo la búsqueda de las órdenes MT4 necesarias.

 

Me preguntaba si es posible vencer al Probador en velocidad donde no debería haber posibilidad de ello.

He escrito un Asesor Experto "sin posibilidades" - optimizado al máximo para la velocidad.

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

input int inAmountMagics = 50; // Cuántos CT emular

// Abrir una posición y una orden para cada TS. Código MT4 para abreviar.
void OnInit()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))  
    for (int i = 0; i < inAmountMagics; i++)
    {
      OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0, NULL, i);
      
      OrderSend(_Symbol, OP_BUYLIMIT, 1, Tick.ask - 1 e4*_Point, 0, 0, 0, NULL, i);
    }
}

// Recoger información de las posiciones/órdenes correctas. Código MT5 de máxima rapidez.
double CountOrders( const int Type, const int Magic )
{
  double Res = 0;
  
  if (Type <= OP_SELL)
  {
    for (int i = PositionsTotal() - 1; i >= 0; i--)
      if (PositionGetTicket(i) && (PositionGetInteger(POSITION_TYPE) == Type) && PositionGetInteger(POSITION_MAGIC) == Magic)
        Res += PositionGetDouble(POSITION_PRICE_OPEN) + PositionGetDouble(POSITION_PRICE_CURRENT) +
               PositionGetDouble(POSITION_TP) + PositionGetDouble(POSITION_SL);
  }
  else
    for (int i = OrdersTotal(true) - 1; i >= 0; i--)
      if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) == Type) && OrderGetInteger(ORDER_MAGIC) == Magic)
        Res += OrderGetDouble(ORDER_PRICE_OPEN) + OrderGetDouble(ORDER_PRICE_CURRENT) +
               OrderGetDouble(ORDER_TP) + OrderGetDouble(ORDER_SL);
        
  return(Res);
}

// Número para controlar la corrección de implementaciones alternativas.
double OnTesterValue = 0;
double OnTester() { return(OnTesterValue); }

void OnTick()
{
  // Simular la operación en todos los TCs.
  for (int i = 0; i < inAmountMagics; i++)
    OnTesterValue += CountOrders(POSITION_TYPE_BUY, i) + 
                     CountOrders(POSITION_TYPE_SELL, i) +
                     CountOrders(ORDER_TYPE_BUY_LIMIT, i) +
                     CountOrders(ORDER_TYPE_SELL_LIMIT, i);  
}

Por el código se puede argumentar que está escrito para ser lento. Pero el código emula el trabajo de muchos "TS". Y muchos TSs trabajan exactamente de la misma manera - en primer lugar, encuentran sus posiciones/órdenes.

OnTester result 54790620.97344553
EURCAD,M1: 192394 ticks, 1440 bars generated. Environment synchronized in 0:00:00.023. Test passed in 0:01:21.775 (including ticks preprocessing 0:00:00.016).
81 segundos para ejecutar. Por un día en garrapatas reales algo mucho. Pero lo que hay.
 
fxsaber #:

81 segundos para completarlo. Para un día en garrapatas reales algo es mucho. Pero lo que es.

Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading.

Bibliotecas: Virtual

fxsaber, 2023.03.01 20:36

OnTester result 54790620.97344553
EURCAD,M1: 192394 ticks, 1440 bars generated. Environment synchronized in 0:00:00.023. Test passed in 0:00:46.653 (including ticks preprocessing 0:00:00.016).

La suma de comprobación coincide. He conseguido acelerar casi el doble.

No fue fácil, pero funcionó.

 
fxsaber #:

Escribí un EA "sin posibilidades" - optimizado al máximo para la velocidad.

Una forma sencilla de acelerar.
 

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

Bibliotecas: MT4Orders

fxsaber, 2022.07.20 00:39

// Lista de cambios:
// 20.07.2022
// Añadir: Añadido OrderLotsOpen() - posición completa/volumen de la orden antes de cerrar/borrar. Funciona correctamente sólo en ByPass-mode.

Usando el mismo ejemplo (abierto 1 lote y cerrado gradualmente en 0,1, 0,2, 0,3 y 0,4 lotes) pero con una visualización diferente.


OrderLotsOpen() en cuadros rojos en la parte superior de la imagen.
 

Hola,

Parece que tenemos un bug en OrderTicket()

No es correcto el ticket del historial de MT5


Este es mi código:

bool isCopyHistory2(string u_symbol, int master_ticket)
  {

   int ticket_copy;

   bool is_exists = false;

// recuperar información del historial comercial

   for(int i = 0; i < OrdersHistoryTotal(); i++)
     {
      //---- comprobar el resultado de la selección

      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false)
        {
         Print("Access to history failed with error (", GetLastError(), ")");
         continue;
        }

      // algo de trabajo con el orden

      ticket_copy = (int)extract_master_ticket(OrderComment());

      if(ticket_copy == master_ticket)
        {
	//print-for-debug
        Print("c ticket: ", OrderTicket());  // ==> esta entrada no es correcta en MT5
         is_exists = true;
         break;
        }

     }

//---

   if(!is_exists)

      Print("New Signal #" + (string)master_ticket);

   return(is_exists);

  }

 
Cuong Le Van #:

Parece que hay un error en OrderTicket()

No es el ticket correcto del historial de MT5

Aparentemente quieres conseguirlo.

// Lista de cambios:
// 13.03.2019
// Añadir: Añadido OrderTicketID() - PositionID of an MT5 transaction or MT5 position, and the ticket of a pending MT4 order.

Las razones se detallan aquí.

 
fxsaber #:

Parece que quieres conseguirlo.


Las razones se detallan aquí.

Muchas gracias.

Está bien con

OrderTicketID()
 

No puedo entender si es posible resolver este problema con la velocidad de prueba sin utilizar las funciones de lenguaje MT5. El problema apareció hace mucho tiempo, pero mis manos llegaron a él sólo ahora.

Build 3802, __MT4ORDERS__ "2022.07.20"

Función condicional llamada en el Asesor Experto en cada tick. Prueba en mt5 probador de estrategias.

	 datetime get_last_order_close_time () {
                datetime last_close_time=0;

                for ( int i = OrdersHistoryTotal() - 1; i >= 0; i-- ) {
                        if ( !OrderSelect ( i, SELECT_BY_POS, MODE_HISTORY )) {
                                continue;
                        }
         		 last_close_time=OrderCloseTime();
		        return last_close_time;
                }

                return last_close_time;
        }

Elnúmero de operaciones es de aproximadamente 26 mil. El tiempo de prueba es de aproximadamente 1 hora 10 minutos.

Quitamos la función del código, el tiempo de prueba se convirtió en unos 17 minutos.

Vuelvo a escribir la misma función utilizando la funcionalidad de MT5:

	 datetime get_last_order_close_timeMT5 () {
                datetime last_close_time=0;
                HistorySelect(0,TimeCurrent()); 

                for ( int i = HistoryDealsTotal() - 1; i >= 0; i-- ) {
                        
                        ulong ticket=HistoryDealGetTicket(i);
                        
                        if((ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT)
                        {
                           last_close_time=(datetime)HistoryDealGetInteger(ticket,DEAL_TIME);
                           return last_close_time;
                        }                       
                }

                return last_close_time;
        }

El tiempo de prueba es de unos 18 minutos.

Retrocedo la librería a la versión __MT4ORDERS__ "2020.01.12" y compilo el Asesor Experto en la build 2980.

El tiempo del Asesor Experto con la función get_last_order_close_time es de unos 20 minutos.