Características del lenguaje mql5, sutilezas y técnicas - página 173

 
fxsaber:

Actualizado arriba.

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

Peculiaridades de mql5, consejos y trucos

fxsaber, 2020.04.09 13:13

Parece que no lo has encontrado en absoluto. Echa un vistazo a la documentación. Hay dos volúmenes por pedido.

Estos son limitadores en vivo. El primer número es el volumen original, el segundo es el volumen vertido. En cuanto se igualan o se borran, pasa a la historia.


¿No es una orden ejecutada en dos partes? Parece extraño que los volúmenes no ejecutados sean los mismos.

 
Alexey Viktorov:

¿No es una orden ejecutada en dos partes? Parece extraño que los volúmenes no ejecutados sean los mismos.

Coincidencia. Incluso tienen diferentes revistas.

 
fxsaber:

No puede haber orden en el modo de orden cuando está vivo. Cuando esté muerto - habrá un tiempo de primera ejecución, como se dijo originalmente.


Encontrado en la historia.

 
fxsaber:

Cuando se colapsa a través de CloseBy, parece que se pierden las majicies. Hay que comprobarlo.

Esta parece ser la razón por la que el primer código de abajo no funciona.

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

¿Ganancia histórica en MQL5?

fxsaber, 2017.08.26 19:16

  1. MQL5
    double Profit( void )
    {
     double Res = 0;
    
     if (HistorySelect(0, INT_MAX))
       for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
       {
         const ulong Ticket = HistoryDealGetTicket(i);
         
         if((HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) && (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symbol()))
           Res += HistoryDealGetDouble(Ticket, DEAL_PROFIT);
       }
         
      return(Res);
    }


  2. MQL5 + MQL4
    #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
    
    double Profit( void )
    {
     double Res = 0;
    
     for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
       if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderMagicNumber() == MagicNumber) && (OrderSymbol() == Symbol()))
         Res += OrderProfit();
         
      return(Res);
    }

Contar el beneficio en la magia parece ser un problema.

 
Los precios de las órdenes están normalizados, las operaciones no. La secuencia de comandos encuentra estos intercambios.
void OnStart()
{
  if (HistorySelect(0, INT_MAX))
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--) // Перебираем все сделки
    {
      const ulong Ticket = HistoryDealGetTicket(i); // Тикет сделки
      const double Price = HistoryDealGetDouble(Ticket, DEAL_PRICE); // Цена сделки
      
      if (NormalizeDouble(Price, 5) != Price) // Если цена сделки не нормализована,      
        Print(Ticket);                        // печатаем тикет сделки.
    }
}
 

Las flechas para abrir/cerrar posiciones, que MT5 coloca automáticamente en tiempo real, se basan en los eventos de TradeTransaction.


Ahora mismo he visto que estos eventos (apertura y cierre de una docena de posiciones) no llegaban al terminal por un fallo de conexión momentáneo, fue tan casual, que estaba sentado en mi PC y los miré a ojo. Por lo tanto, no hay flechas correspondientes.


Y, como se ha dicho a veces aquí, no se puede confiar en OnTradeTransaction en los EA de combate. Es una pena que no exista un mecanismo público fiable para tratar con OrderSendAsync.

 
fxsaber:

Lástima que no exista un mecanismo público fiable para tratar con OrderSendAsync.

¿pueden los servicios acceder a los oficios? - si es así, entonces es posible monitorear cada 10 ms y enviar el evento al gráfico

He mirado la ayuda, creo que podría haber añadido alguna información sobre los servicios, pero creo que era así el año pasado:

-Se trata de un programa que, a diferencia de los indicadores, los Asesores Expertos y los scripts, no requiere vincularse a un gráfico. Al igual que los scripts, los servicios no manejan ningún evento excepto el de lanzamiento. Para iniciar un servicio, su código debe contener la función manejadora OnStart. Los servicios no aceptan ningún otro evento excepto Start, pero pueden enviar eventos personalizados a los propios gráficos utilizando EventChartCustom

UPD: He escrito un script de servicio.

struct SOrderInfo
{
   int positionstotal;
   int orderstotal;
   int historyorderstotal;
   bool operator==(const SOrderInfo &v){return(positionstotal==v.positionstotal && orderstotal==v.orderstotal && historyorderstotal==v.historyorderstotal);}
};
//+------------------------------------------------------------------+
int OnStart()
{
   SOrderInfo CurrState = UpdateOrdersInfo();
   SOrderInfo LastState = CurrState;
   while(!IsStopped())
   {
      Sleep(10);
      CurrState = UpdateOrdersInfo();
      if(CurrState == LastState) continue;
      LastState = CurrState;
      Print("Orders changed!");
   }
   return(0);
}
//+------------------------------------------------------------------+
SOrderInfo UpdateOrdersInfo()
{
   SOrderInfo result;
   result.positionstotal     = PositionsTotal();
   result.orderstotal        = OrdersTotal();
   result.historyorderstotal = HistoryOrdersTotal();
   return(result);
}
//+------------------------------------------------------------------+

He abierto varios pedidos y los he cerrado manualmente.

 
Igor Makanu:

¿pueden los servicios acceder a los oficios? - si es así, es posible monitorear cada 10ms y enviar un evento al gráfico

Esto no es diferente al mismo rebasamiento en sowtronic. Sólo que no basta con comparar la cantidad, los internos pueden cambiar.

 
Andrey Khatimlianskii:

No es diferente de la misma exageración en Owletnik. Sólo que no basta con comparar la cantidad, los internos pueden cambiar.

Servicios como Alerters son muy buenos. No necesitas gráficos, se ejecutan automáticamente con el Terminal. Sólo tienes que resolver las situaciones de cambio entre cuentas.

El servicio también puede ser un asesor de combate. Sin la interfaz gráfica, no es muy conveniente.
 
Andrey Khatimlianskii:

No es diferente de la misma exageración en Owletnik. Sólo que no basta con comparar la cantidad, los internos pueden cambiar.

es diferente.

existen las llamadas tareas de control y gestión

EA - gestión, servicio - control

el control no debe ser superfluo - se tomarán todos los recursos del sistema y se obtendrá un sistema inestable en lugar de control

hay que definir la criticidad de los eventos, imho, el cierre y la apertura de las órdenes - estos son eventos críticos que necesitan control, mientras que el cambio de TP y SL podría hacerse como antes (algunos intentos fallidos - dejarlo ir, en el próximo tick vamos a tratar de nuevo)

y de la forma que sugieres - controlando todo es posible - puedes repetir el estado de los pedidos en SQLite, entonces habrá un problema de sincronización de la base de datos con el servicio y EA.... todo esto es innecesario


Creo que el esquema debería ser más simple - debería ser como sigue: obtener el eventoOnTradeTransaction del terminal en EA y generar el evento OnChartEvent del servicio para el control adicional en EA

Razón de la queja: