Bibliotecas: MT4Orders - página 21

 

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

Bibliotecas: MT4Orders

fxsaber, 2018.04.14 09:10 AM

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

En el ejemplo se puede ver que cuando se dispara el TP/SL, el comentario original "¡Hola Mundo!" se sustituye completamente por el comentario de MT5 "tp 1,23614".

En MT4, en tales situaciones, el comentario se convierte en "¡Hola Mundo! tp 1.23614". ¿Debo hacer lo mismo en MT4Orders?

Es decir, ¿es correcto/conveniente que para los cierres SL/TP/MO el comentario de la orden en el histórico sea una combinación del comentario en la apertura y en el cierre, como lo es en MT4?

 
fxsaber:

En el ejemplo, puede ver que cuando se activa TP/SL, el comentario original "Hello World!" se sustituye en su totalidad por su homólogo en MT5, "tp 1.23614".

En MT4, en tales situaciones, el comentario se convierte en "Hello World! tp 1.23614". ¿Es necesario hacer lo mismo en MT4Orders?

Es decir, ¿es correcto/conveniente que para los cierres SL/TP/MO, el comentario de la orden en el historial sea una combinación del comentario en la apertura y en el cierre, como lo es en MT4?

Yo sugeriría algo así

Comentario_Original[tp: 1.23614] (ya que a veces es necesario parsear el comentario)

con registro de situaciones anormales cuando la longitud del comentario excede los límites

 
fxsaber:

En el ejemplo, puede ver que cuando se activa TP/SL, el comentario original "Hello World!" se sustituye en su totalidad por su homólogo en MT5, "tp 1.23614".

En MT4, en tales situaciones, el comentario se convierte en "Hello World! tp 1.23614". ¿Es necesario hacer lo mismo en MT4Orders?

Es decir, ¿es correcto/conveniente que para los cierres SL/TP/MO el comentario de la orden en el historial sea una combinación del comentario en la apertura y en el cierre, como lo es en MT4?

OrderComment, al igual que OrderCommission, está en la librería y ahora es muy lento (se nota en múltiples llamadas). Está claro que es debido a especificidades de MT5 (dividir estos datos en 2 operaciones).

¿Quizás simplemente añadir OrderCommentOpen? Bueno, o hacer una variante completamente universal: OrderCommentOpen, OrderCommentClose y OrderComment, intentando emular el comportamiento de MT4.

Sigo pensando en una caché para las pesadas OrderCommission y OrderComment, o para mi propia lista de operaciones, que en mi caso particular es lo mismo.

 
Andrey Khatimlianskii:

OrderComment, así como OrderCommission, es muy lento en la biblioteca ahora (notable en múltiples llamadas). Está claro que es sólo debido a MT5 específicos (división de estos datos en 2 operaciones).

No debería afectar al tiempo real.

¿Quizás simplemente añadir OrderCommentOpen? Bueno, o hacer una variante universal: OrderCommentOpen, OrderCommentClose y OrderComment, tratando de emular el comportamiento de MT4.

Podría valer la pena añadirlo. Ahora mismo se puede hacer así (para órdenes históricas de MT4)

string OrderCommentOpen()
{
  return(HistoryDealSelect(OrderTicketOpen()) ? HistoryDealGetString(OrderTicketOpen(), DEAL_COMMENT) : NULL);
}

string OrderCommentClose()
{
  return(HistoryDealSelect(OrderTicket()) ? HistoryDealGetString(OrderTicket(), DEAL_COMMENT) : NULL);
}

Sigo pensando en una caché para las pesadas OrderCommission y OrderComment, o para mi propia lista de operaciones, que en mi caso particular es lo mismo.

Si hacemos una caché, que sea para todo el histórico. Y es mejor hacerlo en base a Generic-bible, supongo. La única desventaja es que se comerá memoria en el VPS.

MQ hizo un buen trabajo en la historia en Tester - se hizo rápido. Cuando se aceleró, los pensamientos sobre el tema de almacenamiento en caché se fue (había versiones en bruto de la biblia), porque no vi que sería significativamente más rápido. Además, no se me ocurrió un TS para Tester, en el que el historial de operaciones afectaría seriamente a la lógica.

Es imposible almacenar en caché el Historial para tiempo real - se puede corregir retroactivamente. ¿Y por qué ahorrar microsegundos en tiempo real?

 
fxsaber:

El tiempo real no debería verse afectado.

Puede que merezca la pena añadirlo. Ahora se puede hacer de la siguiente manera (para órdenes históricas MT4)

Si hacemos una caché, debería ser para todo el histórico. Y es mejor hacerlo sobre la base de Generic-bible, probablemente. Sólo hay una desventaja - que va a comer la memoria en VPS.

MQ hizo un buen trabajo en la historia en Tester - se hizo rápido. Cuando se aceleró, los pensamientos sobre el tema de almacenamiento en caché se fue (había versiones en bruto de la biblia), porque no vi que sería significativamente más rápido. Además, no se me ocurrió un TS para Tester, en el que el historial de operaciones afectara seriamente a la lógica.

Es imposible almacenar en caché el Historial para tiempo real - se puede corregir retroactivamente. ¿Y por qué guardar microsegundos en tiempo real?

Si he entendido bien, tengo una TS: a una hora determinada empezamos a entrar en el mercado por señal, eventualmente varias compras y ventas, al final de la sesión cerramos todo como está. Al día siguiente vamos en un círculo, pero los lotes ya están calculados por la historia de cierre de la última sesión, es decir, nos metemos en la historia y ver si cerramos un beneficio o alguna pérdida.
Es decir, sin acceso a la historia - el TS no es utilizable.

 
Vitaly Muzichenko:

Si he entendido bien, tengo una TS que funciona: a una hora determinada empezamos a entrar en el mercado por una señal, eventualmente varias compras y ventas, al final de la sesión cerramos todo tal cual. Al día siguiente entramos en un círculo, pero los lotes ya están calculados en base al historial de cierre de la última sesión, es decir, entramos en el historial y vemos si cerramos con ganancias o con pérdidas.
Es decir, sin acceso al historial - el TS no es utilizable.

La palabra clave en esa frase es "seriamente". Está claro que el historial de operaciones puede cortar la lógica de las operaciones. El problema es el TS, que empieza a ralentizarse notablemente en el Probador de acceder a ella.

 
fxsaber:

El tiempo real no debería verse afectado.

Puede que merezca la pena añadirlo. Ahora se puede hacer de la siguiente manera (para órdenes históricas MT4)

Si hacemos una caché, debería ser para todo el histórico. Y es mejor hacerlo sobre la base de Generic-bible, probablemente. Sólo hay una desventaja - que va a comer la memoria en VPS.

MQ hizo un buen trabajo en la historia en Tester - se hizo rápido. Cuando se aceleró, los pensamientos sobre el tema de almacenamiento en caché se fue (había versiones en bruto de la biblia), porque no vi que sería significativamente más rápido. Además, no se me ocurrió un TS para Tester, en el que el historial de operaciones afectara seriamente a la lógica.

Es imposible almacenar en caché el Historial para tiempo real - se puede corregir retroactivamente. ¿Y por qué ahorrar microsegundos en tiempo real?

Una vez mostraste un código que busca en el historial "patrones" similares.

Aquí hay un simple TS con una historia profunda:

Miramos el precio actual "forma-patrón" para un cierto tiempo desde "ahora" hasta "un poco en el pasado (día de negociación por ejemplo)", buscamos todos los patrones de precios similares en la historia, los clasificamos por "grado de coincidencia", seleccionamos unas pocas partes más coincidentes de tal "imagen" en la historia. Analizamos el historial con E/S virtuales y obtenemos recomendaciones sobre entradas/salidas para el estado actual. Incluso se puede asignar un "peso" a cada recomendación en función de los resultados del análisis de los patrones históricos.

 
Artyom Trishkin:

Una vez mostraste un código que busca "patrones" similares en el historial.

Aquí lo tienes.

Aquí está el TS más simple con historia profunda:

Miramos la "forma-patrón" del precio actual para un cierto tiempo desde "ahora" hasta "un poco en el pasado (día de negociación por ejemplo)", buscamos todos los patrones de precios similares en la historia, los clasificamos por "grado de coincidencia", seleccionamos unas pocas partes más coincidentes de tal "imagen" en la historia. Analizamos el historial con E/S virtuales y obtenemos recomendaciones sobre entradas/salidas para el estado actual. Incluso se puede asignar un "peso" a cada recomendación en función de los resultados del análisis de los patrones históricos.

Parece que no lo has entendido. Me refería al historial de operaciones.

Библиотеки: Кроссплатформенная библиотека оригинальных математических функций
Библиотеки: Кроссплатформенная библиотека оригинальных математических функций
  • 2017.03.27
  • www.mql5.com
Кроссплатформенная библиотека оригинальных математических функций: Автор: fxsaber...
 

Una CT en la que la historia influya seriamente en la lógica es una CT adaptativa.

¿Cuál es el escollo?

 
Алексей Тарабанов:

Una CT en la que la historia influya seriamente en la lógica es una CT adaptativa.

¿Dónde has tropezado?

Necesitas un ejemplo de una TS en la que el historial de operaciones (no el historial de precios) afecte significativamente al tiempo de backtest.