Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 86

 

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Bug, bug, domande

fxsaber, 2018.06.20 23:18

Ho deciso di controllare quanto durano queste situazioni di ordine fantasma, quando un ordine è nel sistema ma non nel terminale.

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

#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;
}


Risultato

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 millisecondi un ordine c'è ma non nel terminale! Provate a immaginare le conseguenze se la logica di trading fosse eseguita in questo intervallo...


È interessante che gli ordini fantasma sono più spesso presenti solo nei tipi di transazioneTRADE_TRANSACTION_ORDER_DELETE e TRADE_TRANSACTION_DEAL_ADD (molto più rari).


Una pessima sfumatura della piattaforma.


ZZY La velocità delle transazioni commerciali su 5 è discutibile, purtroppo.

 
La HistorySelect è lenta, se si fa la richiesta della storia dall'inizio. Perciò è auspicabile fare qualcosa del genere

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Consulente esperto OrderCloseTime 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;
}


Chiaramente la soluzione è sul punto di essere una stampella. Le altre implementazioni non saranno più così succinte. Un modo semplice per aggirare i freni generalmente non funziona.

 
fxsaber:
Implementazione rapida di OnTick multisimbolo

Non riesco a capirlo,

perché OnTick è con il parametro Symbol e perché è senza il parametro?

e perché è di nuovo sotto il commento?

perché non un sempliceOnChartEvent di base?

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 abbiamo un bel druker di codici. Non riesco a capire questo chip
 
Fast528:

perché non semplicemente attraverso unOnChartEvent di base?

Perché è comodo tenere separate le "mosche e le cotolette". Scrivere tutta la logica in un multisimbolo OnTick. Le coincidenze nei nomi sono casuali...

 
fxsaber:

Perché è comodo tenere separate le "mosche e le cotolette". Scrivere tutta la logica in un multisimbolo OnTick. Le coincidenze nei nomi sono casuali...

...con tutti voi fino all'anno 2028...

è il tuo codice, troverò quello 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:

Nessuno ti obbliga a usare questa variante dell'implementazione dell'evento NewTick multisimbolo. In questo ramo, ho messo insieme ogni sorta di cose in modo semplice.

 
fxsaber:

Nessuno ti obbliga a usare questa variante dell'implementazione dell'evento NewTick multisimbolo. In questo thread, ho messo insieme un sacco di cose.

Ero interessato a OnTick, anche con parametri, il compilatore ingoia

 
Fast528:

Mi stavo chiedendo perché OnTick????

Non lo so io, coincidenza casuale.

 
fxsaber:

Non lo so io, è solo una coincidenza.

Non ditemi, ho trovato una funzione, gli MC non hanno ancora fissato il nome di una delle funzioni principali, ho passato molto tempo a leggere e a cercare.

alla ricerca di una caratteristica non documentata.