Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 86

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

fxsaber, 2018.06.20 23:18

Ich beschloss zu prüfen, wie lange diese Phantomaufträge dauern, wenn ein Auftrag im System, aber nicht im Terminal ist.

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

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


Ergebnis

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 Millisekunden lang ist ein Auftrag da, aber nicht im Terminal! Stellen Sie sich die Folgen vor, wenn die Handelslogik in diesem Intervall ausgeführt würde ...


Interessant ist, dass Phantomaufträge meist nur bei den TransaktionsartenTRADE_TRANSACTION_ORDER_DELETE und TRADE_TRANSACTION_DEAL_ADD (viel seltener) vorkommen.


Sehr schlechte Nuancierung der Plattform.


ZZY Die Geschwindigkeit der Handelsgeschäfte auf 5 ist leider fragwürdig.

 
Der HistorySelect ist langsam, wenn Sie die History-Anfrage von Anfang an stellen. Daher ist es wünschenswert, etwas wie folgt zu tun

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

OrderCloseTime Expert Advisor 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;
}


Es ist klar, dass die Lösung kurz davor ist, eine Krücke zu sein. Die anderen Umsetzungen werden nicht mehr so prägnant sein. Eine einfache Umgehung der Bremsen wird in der Regel nicht funktionieren.

 
fxsaber:
Schnelle Multisymbol-OnTick-Implementierung

Ich kann es nicht herausfinden,

Warum ist OnTick mit dem Parameter Symbol und warum ist es ohne den Parameter?

und warum steht sie wieder unter dem Kommentar?

warum nicht einfach ein einfachesOnChartEvent?

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 wir haben einen coolen Code Druker. Ich werde aus diesem Chip nicht schlau
 
Fast528:

warum nicht einfach durch ein einfachesOnChartEvent?

Denn es ist praktisch, die "Fliegen und Schnitzel" getrennt zu halten. Schreiben Sie die gesamte Logik in ein Multisymbol OnTick. Zufälle in Namen sind zufällig...

 
fxsaber:

Denn es ist praktisch, die "Fliegen und Schnitzel" getrennt zu halten. Schreiben Sie die gesamte Logik in ein Multisymbol OnTick. Übereinstimmungen in Namen sind zufällig...

...mit euch allen bis zum Jahr 2028...

es ist dein Code, ich werde den vollständigen Code finden.

Индикатор

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

Niemand zwingt Sie, diese Variante der Implementierung des Multisymbol-Ereignisses NewTick zu verwenden. In diesem Zweig habe ich alle möglichen Dinge einfach zusammengefügt.

 
fxsaber:

Niemand zwingt Sie, diese Variante der Implementierung des Multisymbol-Ereignisses NewTick zu verwenden. In diesem Thread habe ich einfach alles Mögliche zusammengetragen.

Ich war an OnTick interessiert, auch mit Parametern, die der Compiler schluckt

 
Fast528:

Ich habe mich gefragt, warum OnTick????

Ich weiß es selbst nicht, ein zufälliger Zufall.

 
fxsaber:

Ich weiß es selbst nicht, ein zufälliger Zufall.

Sagen Sie nicht, ich habe ein Feature gefunden, die MCs haben den Namen einer der Hauptfunktionen immer noch nicht festgelegt, ich habe viel Zeit mit Lesen und Suchen verbracht.

auf der Suche nach einer undokumentierten Funktion.

Grund der Beschwerde: