Caractéristiques du langage mql5, subtilités et techniques - page 86

 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Bugs, bugs, questions

fxsaber, 2018.06.20 23:18

J'ai décidé de vérifier combien de temps durent ces situations de commandes fantômes, lorsqu'une commande est dans le système mais pas dans le 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;
}


Résultat

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 millisecondes un ordre est là mais pas dans le Terminal ! Imaginez les conséquences si la logique de trading était exécutée dans cet intervalle ...


Il est intéressant de constater que les ordres fantômes ne sont le plus souvent présents que pour les types de transactionTRADE_TRANSACTION_ORDER_DELETE et TRADE_TRANSACTION_DEAL_ADD (beaucoup plus rares).


Très mauvaise nuance de plate-forme.


ZZY La vitesse des transactions commerciales sur 5 est malheureusement discutable.

 
Le HistorySelect est lent, si vous faites la demande d'historique depuis le début. Il est donc souhaitable de faire quelque chose comme ceci

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Conseiller expert 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;
}


Il est clair que la solution est sur le point de devenir une béquille. Les autres implémentations ne seront plus aussi succinctes. Un moyen simple de contourner les freins ne fonctionne généralement pas.

 
fxsaber:
Implémentation rapide de OnTick multisymbole

Je n'arrive pas à comprendre,

pourquoi OnTick est avec le paramètre Symbol et pourquoi est-il sans le paramètre ?

et pourquoi c'est encore en dessous du commentaire ?

pourquoi pas un simpleOnChartEvent?

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 nous avons un code druker cool. Je n'arrive pas à comprendre cette puce
 
Fast528:

pourquoi ne pas simplement utiliser unOnChartEvent de base?

Parce que c'est pratique de garder les "mouches et les escalopes" séparées. Écrire toute la logique dans un OnTick multisymbole. Les coïncidences dans les noms sont aléatoires...

 
fxsaber:

Parce que c'est pratique de garder les "mouches et les escalopes" séparées. Écrire toute la logique dans un OnTick multisymbole. Les coïncidences dans les noms sont des coïncidences...

...avec vous tous jusqu'en 2028...

c'est ton code, je vais trouver le code complet.

Индикатор

#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:

Personne ne vous oblige à utiliser cette variante de la mise en œuvre de l'événement multi-symboles NewTick. Dans cette branche, j'ai assemblé toutes sortes de choses simplement.

 
fxsaber:

Personne ne vous oblige à utiliser cette variante de la mise en œuvre de l'événement multi-symboles NewTick. Dans ce fil, j'ai juste mis toutes sortes de choses ensemble.

Je me suis intéressé à OnTick, également avec des paramètres, le compilateur avale

 
Fast528:

Je me demandais pourquoi OnTick ????

Je ne sais pas moi-même, coïncidence aléatoire.

 
fxsaber:

Je ne sais pas moi-même, juste une coïncidence.

Ne me dites pas, j'ai trouvé une fonction, les MCs n'ont toujours pas fixé le nom d'une des fonctions principales, j'ai passé beaucoup de temps à lire et à chercher.

à la recherche d'une fonctionnalité non documentée.