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

 

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

Bichos, errores, preguntas

fxsaber, 2018.06.20 23:18

Decidí comprobar cuánto duran estas situaciones de pedidos fantasma, cuando un pedido está en el sistema pero no en la Terminal.

// Советник отслеживает длительность ситуаций, когда ордер отсутствует среди текущих и исторических

#define  TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define  TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

bool OrderIsExist( const ulong &OrderTicket )
{
  return(OrderTicket ? OrderSelect(OrderTicket) || HistoryOrderSelect(OrderTicket) : true);
}

void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest&, const MqlTradeResult& )
{
  static bool PrevIsExist = true;
  static ulong StartTime = 0;
  static ulong MaxInterval = 0;
  
  const ulong NowTime = GetMicrosecondCount();
  const bool IsExist = OrderIsExist(Trans.order);
    
  if (!IsExist)
  {
    Print(TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
  
    if (PrevIsExist) 
      StartTime = NowTime;
  }
  else if (!PrevIsExist)
  {
    const ulong Interval = NowTime - StartTime;
    
    Print(TOSTRING(Interval) + TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
    
    if (Interval > MaxInterval)
    {
      MaxInterval = Interval;
      
      Comment(TOSTRING(MaxInterval) + TOSTRING(Trans.order)); // mcs.
    }
  }
          
  PrevIsExist = IsExist;
}


Resultado

2018.06.21 00:10:31.047 Trans.type = TRADE_TRANSACTION_ORDER_DELETE (2)
2018.06.21 00:10:31.047 Trans.order = 2210967406
2018.06.21 00:10:31.047 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 HistoryOrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 
2018.06.21 00:10:31.080 Interval = 32643
2018.06.21 00:10:31.080 Trans.type = TRADE_TRANSACTION_HISTORY_ADD (3)
2018.06.21 00:10:31.080 Trans.order = 2210967406
2018.06.21 00:10:31.080 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.080 HistoryOrderSelect(Trans.order) = true


¡32 milisegundos una orden está ahí pero no en el Terminal! Imagínese las consecuencias si la lógica comercial se ejecutara en este intervalo...


Es interesante que las órdenes fantasma se presentan con mayor frecuencia sólo en los tipos de transacciónTRADE_TRANSACTION_ORDER_DELETE y en TRADE_TRANSACTION_DEAL_ADD (mucho más raro).


Muy mal el matiz de la plataforma.


ZZY La velocidad de las transacciones comerciales en el 5 es cuestionable, por desgracia.

 
El HistorySelect es lento, si se hace la solicitud del historial desde el principio. Por lo tanto, es deseable hacer algo así

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

OrderCloseTime Asesor Experto MQL5

fxsaber, 2018.07.06 09:27

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  static datetime PrevTime = 0;
  
  if (HistorySelect(PrevTime, INT_MAX)) // HistorySelect(0, INT_MAX) - slow.
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
  
      if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
          OpenTime = (datetime)HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME);
          
        break;
      }
    }
  }
  
  PrevTime = CloseTime;
}


Está claro que la solución está a punto de ser una muleta. Las otras implementaciones ya no serán tan sucintas. Una forma sencilla de evitar los frenos generalmente no funcionará.

 
fxsaber:
Implementación rápida multisímbolo OnTick

No puedo entenderlo,

¿por qué es OnTick con el parámetro Symbol y por qué es sin el parámetro?

¿y por qué está otra vez debajo del comentario?

¿Por qué no unOnChartEvent básico?

void OnTick()
{
  OnTick(_Symbol); 
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    OnTick(Symbols[(int)lparam]);
}

// Мультисимвольный OnTick
void OnTick( const string &Symb )
{
}
 
fxsaber tenemos un código genial druker. No puedo entender este chip
 
Fast528:

¿por qué no a través de unOnChartEvent básico?

Porque es conveniente mantener las "moscas y chuletas" separadas. Escribe toda la lógica en un multisímbolo OnTick. Las coincidencias en los nombres son aleatorias...

 
fxsaber:

Porque es conveniente mantener las "moscas y chuletas" separadas. Escribe toda la lógica en un multisímbolo OnTick. Las coincidencias en los nombres son casuales...

...con todos ustedes hasta el año 2028...

es tu código, encontraré el completo.

Индикатор

#property indicator_chart_window
#property indicator_plots 0

input long Chart = 0; // идентификатор графика-получателя события
input int Index = 0;

int OnCalculate( const int rates_total, const int prev_calculated, const int, const double &[] )
{
  if (prev_calculated)
    EventChartCustom(Chart, 0, Index, 0, NULL);
  
  return(rates_total);
}


Советник

input int AmountSymbols = 1;

const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"};

void OnInit()
{
  for (int i = 0; i < AmountSymbols; i++)
    if (Symbols[i] != _Symbol)
      iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5
}

void OnTick()
{
  OnTick(_Symbol); 
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    OnTick(Symbols[(int)lparam]);
}

// Мультисимвольный OnTick
void OnTick( const string &Symb )
{
}
 
Fast528:

Nadie te obliga a utilizar esta variante de la implementación del evento NewTick multisímbolo. En esta rama, pongo todo tipo de cosas de forma sencilla.

 
fxsaber:

Nadie te obliga a utilizar esta versión de la implementación del evento NewTick multisímbolo. En este hilo, acabo de poner todo tipo de cosas juntas.

Me interesaba OnTick, también con parámetros, el compilador se traga

 
Fast528:

Me preguntaba por qué OnTick????

No lo sé, una coincidencia al azar.

 
fxsaber:

No lo sé, una coincidencia al azar.

No me digas, he encontrado una función, los MCs todavía no han arreglado el nombre de una de las funciones principales, he pasado mucho tiempo leyendo y buscando.

buscando una característica no documentada.

Razón de la queja: