Discusión sobre el artículo "Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte VIII): Eventos de modificación de órdenes y posiciones" - página 3

 
leonerd:

Cuando se recibe un tick, sobre el que se establece una orden pendiente y simultáneamente se activa (triggered) (he probado con Buy Stop), su motor no registra todos los eventos...

Se recibe el evento TRADE_EVENT_PENDING_ORDER_PLASED, pero no TRADE_EVENT_PENDING_ORDER_ACTIVATED.

Mi código es algo así

Primero busco el índice del evento antiguo (procesado) en el bucle, y a partir de él, recorro todos los nuevos hasta el final. Así, en una situación en la que en un tick se activa una orden limitada y striggeren recibe un evento sobre la activación... Por favor comenta.

Llamo a ProcessTradeEvents() en OnTick() después de engine.OnTick(rates_data).

La orden fue colocada por su motor. Tal vez todavía lo llamé cuando no había activación todavía..... Ahora lo comprobaré con una orden manual.

 
leonerd:

El pedido fue realizado por su propio motor. Tal vez todavía lo llamé cuando no había ninguna activación yet..... Ahora lo comprobaré con un pedido manual.

Sí, creo que son mis manos las que están torcidas....

 
leonerd:

Sí, creo que mis manos están torcidas...

No, está en la biblioteca. Para ser más precisos, no está en la biblioteca, sino en la peculiaridad de registrar el historial de pedidos en el terminal. En versiones posteriores de la librería se tiene en cuenta esta particularidad y todo se rastrea correctamente. Pruebe versiones alrededor del 30 - antes del tema sobre los indicadores. No puedo recordar donde se fijó ahora. Sin embargo, escribí sobre ello en un artículo posterior - había una corrección allí.
 

Hola.

Me encontré con este problema al probar TestDoEasyPart08.mq5 - StopLoss y TakeProfit no funcionan. A pesar de que se establecen - las líneas correspondientes aparecen en el gráfico, y los mensajes al diario vienen. Si activa TrailStop, TakeProfit se activa, pero StopLoss todavía no. ¿Cuál puede ser la razón?

P.D. Ejecuto el mismo código en otro ordenador (portátil) y funciona bien. Aunque el mismo metatrader está instalado allí.

 
MQL_User #:

Hola.

Me encontré con este problema al probar TestDoEasyPart08.mq5 - StopLoss y TakeProfit no funcionan. A pesar de que se establecen - las líneas correspondientes aparecen en el gráfico, y los mensajes al diario vienen. Si activa TrailStop, TakeProfit se activa, pero StopLoss todavía no. ¿Cuál puede ser la razón?

P.D. Ejecuto el mismo código en otro ordenador (portátil) y funciona bien. Aunque el mismo metatrader está instalado allí.

En primer lugar, por favor, muestre al menos los mensajes que aparecen en el registro.

Saludos, Vladimir.

 
MQL_User #:

Hola.

Me encontré con este problema al probar TestDoEasyPart08.mq5 - StopLoss y TakeProfit no funcionan. A pesar de que se establecen - las líneas correspondientes aparecen en el gráfico, y los mensajes al diario vienen. Si activa TrailStop, TakeProfit se activa, pero StopLoss todavía no. ¿Cuál puede ser la razón?

P.D. Ejecuto el mismo código en otro ordenador (portátil) y funciona bien. Aunque el mismo metatrader está instalado allí.

Si se colocan órdenes stop (limitadas), su activación no depende del programa, sino del broker. La orden de colocar órdenes stop (limit) es enviada al servidor por el programa, y su activación depende del broker. Desde que se colocan (sus líneas aparecen en el gráfico), no hay errores por parte del programa. Lo más probable es que el precio no alcance las órdenes stop (límite).

 
MrBrooklin #:

Buenas noches, al menos muestra los mensajes que se registran.

Saludos, Vladimir.

MrBrooklin, Artem.

Lo hice en el probador de estrategias (según tengo entendido, el broker no tiene nada que ver).

Los mensajes son los siguientes:

2022.07.03 11:16:39.380 2022.01.03 07:00:00 instant buy 0.1 @Si at 81011 sl: 80960 tp: 81060 (81010 / 81011 / 81010)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 trato #2 comprar 0.1 @Si en 81011 hecho (basado en la orden #2)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 operación realizada [#2 compra 0.1 @Si a 81011]
2022.07.03 11:16:39.380 2022.01.03 07:00:00 orden realizada compra 0.1 a 81011 [#2 compra 0.1 @Si a 81011].

Pero en otro ordenador (portátil), en el que StopLoss y TakeProfit funcionan correctamente, los mensajes son así:

2022.07.03 11:23:18.383 2022.01.03 07:00:12 instant buy 0.1 @Si at 81047 sl: 80996 tp: 81096 (81046 / 81047 / 81046)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 deal #2 buy 0.1 @Si at 81047 done (based on order #2)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 deal performed [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.383 2022.01.03 07:00:12 orden ejecutada compra 0.1 a 81047 [#2 compra 0.1 @Si a 81047]
2022.07.03 11:23:18.514 2022.01.03 07:00:12 - Posición abierta: 2022.01.03 07.03 07:00:12.490 -
2022.07.03 11:23:18.514 2022.01.03 07:00:12 @Si Abierta 0.10 Compra #2 [0.10 Orden de mercado Compra #2] a 81047, sl 80996, tp 81096, magik 123

Efectivamente, dos líneas más...

Para simplificar un poco las cosas, escribí un Asesor Experto con este sencillo código:

#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh>
#import "user32.dll"
  int GetAsyncKeyState(int a0);
#import
bool ZPressed, ZPress = false;
bool APressed, APress = false;
CTrade trade;

int OnInit()  {   return(INIT_SUCCEEDED);  }

void OnDeinit(const int reason)  {  }

void OnTick()
  {
  // Se pulsa el botón "Z
  if(MathAbs(GetAsyncKeyState(90))>1) ZPressed = ZPress = true;
  else ZPress = false;
  if(ZPressed && !ZPress)
    {
    ZPressed = false;
    double Price = SymbolInfoDouble(Symbol(),SYMBOL_BID);
    double sl = Price - 30, tp = Price + 50;
    trade.Buy(1,Symbol(),0,sl,tp);
    printf("Buy"); 
    }
  // Se pulsa el botón "A
  if(MathAbs(GetAsyncKeyState(65))>1) APressed = APress = true;
  else APress = false;
  if(APressed && !APress)
    {
    APressed = false;
    double Price = SymbolInfoDouble(Symbol(),SYMBOL_BID);
    double sl = Price + 30, tp = Price - 50;
    trade.Sell(1,Symbol(),0,sl,tp);
    printf("Sell");    
    }
  }

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {  }
//+------------------------------------------------------------------+

Se trata de que al pulsar (o mejor dicho, al soltar) la tecla "Z", abra Compra, y al pulsar la tecla "A", abra Venta.

Lo he ejecutado en el tester. El resultado es el mismo: en un PC de sobremesa StopLoss y TakeProfit no funcionan, pero en un portátil sí, es decir, todo funciona correctamente.

También intenté ejecutar el código enlazado al final de este artículo en el probador en un PC y en un portátil, y ocurrió lo mismo - no funciona en un PC, pero en un portátil funciona.

Así que la conclusión es que o bien hay algún ajuste en el probador que permite la activación de sl y tp (que yo no conozco), o el probador en sí no está funcionando correctamente....

 
MQL_User #:

MrBrooklin, Artem.

Lo hice en el probador de estrategias (según tengo entendido, el broker no tiene nada que ver).

Los mensajes son los siguientes:

2022.07.03 11:16:39.380 2022.01.03 07:00:00 compra instantánea 0.1 @Si a 81011 sl: 80960 tp: 81060 (81010 / 81011 / 81010)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 trato #2 comprar 0.1 @Si en 81011 hecho (basado en la orden #2)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 operación realizada [#2 compra 0.1 @Si a 81011]
2022.07.03 11:16:39.380 2022.01.03 07:00:00 orden realizada compra 0.1 a 81011 [#2 compra 0.1 @Si a 81011].

Pero en otro ordenador (portátil), en el que StopLoss y TakeProfit funcionan correctamente, los mensajes son los siguientes:

2022.07.03 11:23:18.383 2022.01.03 07:00:12 instant buy 0.1 @Si at 81047 sl: 80996 tp: 81096 (81046 / 81047 / 81046)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 deal #2 buy 0.1 @Si at 81047 done (based on order #2)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 deal performed [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.383 2022.01.03 07:00:12 orden ejecutada compra 0.1 a 81047 [#2 compra 0.1 @Si a 81047]
2022.07.03 11:23:18.514 2022.01.03 07:00:12 - Posición abierta: 2022.01.03 07:00:12.490 -
2022.07.03 11:23:18.514 2022.01.03 07:00:12 @Si Open 0.10 Buy #2 [0.10 Orden de mercado Buy #2] at 81047, sl 80996, tp 81096, magik 123

Efectivamente, dos líneas más...

Para simplificar un poco las cosas, escribí un Asesor Experto con este sencillo código:

La cuestión es que cuando pulsas (o mejor dicho, cuando sueltas) la tecla "Z", se abre Compra, y cuando pulsas la tecla "A", se abre Venta.

Lo he ejecutado en el tester. El resultado es el mismo: en un PC de sobremesa StopLoss y TakeProfit no funcionan, pero en un portátil sí, es decir, todo funciona correctamente.

También intenté ejecutar el código enlazado al final de este artículo tanto en PC como en portátil en el tester, y ocurrió lo mismo - en PC no funciona, pero en portátil sí.

Así que la conclusión es que o bien hay algún ajuste en el probador que permite desencadenar sl y tp (que no sé acerca de), o el probador en sí funciona incorrectamente....

¿Cual es el ajuste en el tester?
 

La dispersión en el probador es de 1. Tanto en PC como en portátil. Símbolo @Si.

¿Hay alguna manera puede afectar?

Pensé que tal vez el deslizamiento (deslizamiento) afecta de alguna manera y trató de cambiarlo. Pero no funciona.

 
MQL_User #:

La dispersión en el probador es de 1. Tanto en PC como en portátil. Símbolo @Si.

¿Puede esto tener algún efecto?

Pensé que quizás el deslizamiento (slippage) afectaba de alguna manera y probé a cambiarlo. Pero no funciona.

En uno de los casos, el precio no alcanza el nivel de parada.