Bibliotheken: MT4Orders - Seite 43

 
traveller00:
Auf einem realen Konto an der Börse und realen Handel, Broker Otkritie, auch für 10 Sekunden warten nicht helfen, immer noch Pop-up-Warnungen, dass es unsynchronisiert mit der Geschichte. Und sie tauchen ziemlich oft auf. Was meiner Meinung nach ziemlich seltsam ist, in den anderen speziellen Lags sind nicht gesehen, ping 4 ms, um die Ausführung ist in der Regel weniger als 15 ms. Ich fange sogar an zu zweifeln, ob da alles korrekt ist, vielleicht hängt es mit dem Netting zusammen? Obwohl ich INOUT nicht benutze, alle IN und OUT getrennt. Gibt es irgendwelche Pläne, diesen Fall zu umgehen? Zum Beispiel, um die Karten selbst auswendig zu lernen. Und wie viel Priorität wird der Lösung dieses Problems eingeräumt?

Bitte posten Sie beide Logs.

 

Hallo fxsaber,

die besten Wünsche für 2020!

Ist es eine Design-Entscheidung, keine magische Zahl in die Handelsanforderung für die MT4OrderClose-Funktion aufzunehmen?

Derzeit hat DEAL_ENTRY_OUT von MT4OrderClose magic == 0.

Dies macht keinen großen Unterschied, da Sie mit der Positions-ID die magische Zahl von DEAL_ENTRY_IN nachverfolgen können, aber für die Analyse der Historie würde eine Übereinstimmung von DEAL_ENTRY_IN / DEAL_ENTRY_OUT wahrscheinlich mehr Flexibilität bieten.


Hi fxsaber,

Beste Wünsche für 2020!

Ist es eine Design-Entscheidung, die magische Zahl nicht in die Handelsanforderung für die MT4OrderClose-Funktion aufzunehmen?

Derzeit hat DEAL_ENTRY_OUT bei MT4OrderClose den Wert magic == 0.

Es ist keine große Sache, weil es mit der Positions-ID möglich ist, die magische Zahl von DEAL_ENTRY_IN zurückzuverfolgen, aber für die Analyse der Historie bietet die Übereinstimmung von DEAL_ENTRY_IN/DEAL_ENTRY_OUT vielleicht mehr Flexibilität.

 
Enrique Dangeroux:

Ist es eine Designentscheidung, die magische Zahl nicht in die Handelsanforderung für die Funktion MT4OrderClose aufzunehmen?

Derzeit hat DEAL_ENTRY_OUT von MT4OrderClose magic == 0.

Dies macht keinen großen Unterschied, da Sie mit der Positions-ID die magische Zahl von DEAL_ENTRY_IN verfolgen können, aber für die Analyse der Historie würde eine Übereinstimmung von DEAL_ENTRY_IN / DEAL_ENTRY_OUT wahrscheinlich mehr Flexibilität bieten.

In OrderClose können Sie die MagicNumber einstellen, wenn Sie dies wünschen.

Im MT5 können Sie bei der teilweisen Schließung einer Position die MagicNumber der offenen Position ändern, so dass Sie eine Auswahlmöglichkeit haben.

Wenn Sie zum Beispiel eine offene Position mit MagicNumber = 5 haben und die Position manuell schließen, dann ist DEAL_ENTRY_OUT_MAGIC = 0. Die Bibliothek gibt trotzdem OrderMagicNumber() = 5 zurück.

 
// Liste ändern:
// 12.01.2020
// Korrektur: OrderTicketID() für Saldo-Transaktionen gibt jetzt den richtigen Wert zurück.
// Fix: Korrigierte SELECT_BY_TICKET-Auswahl durch OrderTicketID() (MT5-PositionID).
// Korrektur: Der Name der bibliotheksinternen Methode wurde geändert, um die Kompatibilität mit Makros zu verbessern.
 
Ich weiß nicht, ob es ein Fehler oder eine Funktion ist, aber bei Futures werden der Gewinn und der Eröffnungskurs nicht genau wie erwartet berechnet. Nehmen wir an, eine Position wird um 12.00 Uhr eröffnet, um 18.40 Uhr wird die Position gelöscht und automatisch wieder eröffnet, und um 20.00 Uhr wird die Position geschlossen. GetHistoryPositionData für das Ticket des vierten Trades (Ausstieg aus der Position) wählt den Gewinn als MT4ORDERS::Order.Profit = ::HistoryDealGetDouble(Ticket, DEAL_PROFIT); Dies liefert im Wesentlichen die Differenz zwischen den Trades 3-4 (Clearing und Ausstieg). Aber es wird den Eröffnungskurs zurückgeben als MT4ORDERS::Order.OpenPrice = ::HistoryDealGetDouble(OpenTicket, DEAL_PRICE);. D.h. es wird der Eröffnungspreis des 1. Trades zurückgegeben. Meiner Meinung nach wäre es sinnvoll, es einheitlich zu machen und entweder alles vom ersten Handel zu nehmen (sowohl Eröffnungskurs als auch Gewinn) oder alles von der letzten Eröffnung (vom 3. Handel bis zum Clearing) zu nehmen. Oder ist dies eine Funktion, und es sollte so sein, und ich übersehe etwas?
 
traveller00:
Ich weiß nicht, ob es ein Fehler oder eine Funktion ist, aber bei Futures werden der Gewinn und der Eröffnungskurs nicht genau wie erwartet berechnet. Nehmen wir an, eine Position wird um 12.00 Uhr eröffnet, um 18.40 Uhr wird die Position gelöscht und automatisch wieder eröffnet, und um 20.00 Uhr wird die Position geschlossen. GetHistoryPositionData für das Ticket des vierten Trades (Ausstieg aus der Position) wählt den Gewinn als MT4ORDERS::Order.Profit = ::HistoryDealGetDouble(Ticket, DEAL_PROFIT); was im Wesentlichen die Differenz zwischen den Trades 3-4 (Clearing und Ausstieg) zurückgibt. Aber es wird den Eröffnungskurs zurückgeben als MT4ORDERS::Order.OpenPrice = ::HistoryDealGetDouble(OpenTicket, DEAL_PRICE);. D.h. es wird der Eröffnungspreis des 1. Trades zurückgegeben. Meiner Meinung nach wäre es sinnvoll, es einheitlich zu machen und entweder alles vom ersten Handel zu nehmen (sowohl Eröffnungskurs als auch Gewinn) oder alles von der letzten Eröffnung (vom 3. Handel bis zum Clearing) zu nehmen. Oder ist dies eine Funktion, und es sollte so sein, und ich übersehe etwas?

Sie analysieren also die Historie von Netting über die Bibliothek. Dies ist genau der Fall, der anfangs geäußert wurde und für den die Bibliothek noch nicht fertiggestellt wurde. Und ob sie es wird, ist eine große Frage. Denn es wird viel getüftelt, und in der Praxis ist das nicht nötig.

Bei Netting verwende ich immer noch die gleiche Bibliothek, aber ich umgehe die Arbeit mit der Geschichte.

 

https://www.mql5.com/ru/blogs/post/733393


Messung der Geschwindigkeit in einer Situation aus einem Blogeintrag.

#include <MT4Orders.mqh>

#define  BENCH(A)                                                               \
{                                                                              \
  const ulong _StartTime = GetMicrosecondCount();                              \
  A;                                                                           \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - _StartTime)); \
}

void OnStart()
{
  BENCH(HistorySelectByPosition(270107))
  BENCH(HistorySelectByPosition(270107))

  BENCH(HistorySelect(0, INT_MAX))
  BENCH(HistorySelect(0, INT_MAX))

  BENCH(OrdersHistoryTotal())
  BENCH(OrdersHistoryTotal())

  BENCH(OrderSelect(270107, SELECT_BY_TICKET, MODE_HISTORY))
  BENCH(OrderPrint());

  BENCH(OrderSelect(1000, SELECT_BY_POS, MODE_HISTORY))
  BENCH(OrderPrint());
}


Das Ergebnis.

Time[HistorySelectByPosition(270107)] = 9232 // Kaltstart.
Time[HistorySelectByPosition(270107)] = 8571 // Heißer Start.

Time[HistorySelect(0,INT_MAX)] = 152856 // Kaltstart.
Time[HistorySelect(0,INT_MAX)] = 94924  // Heißer Start.

Time[OrdersHistoryTotal()] = 155735 // Kaltstart.
Time[OrdersHistoryTotal()] = 6774   // Heißer Start.

Time[OrderSelect(270107,1,1)] = 23 // Frei.
#85469 2020.02.05 22:32:12 buy 0.01 USDCNH 6.97767 0.00000 6.98533 2020.02.05 22:32:13 6.97533 0.00 0.00 -0.34 OrderSendTest_Position 0
Time[OrderPrint()] = 20 // Frei.

Time[OrderSelect(1000,0,1)] = 11 // Frei.
#10613 2020.02.06 02:34:32 buy 0.01 EURUSD 1.10049 0.00000 1.11046 2020.02.06 02:34:32 1.10046 0.00 0.00 -0.03 OrderSendTest_Position 0
Time[OrderPrint()] = 13 // Frei.


Sie können deutlich sehen, wie viel die HistorySelect-Funktionen kosten.

OrdersHistoryTotal auf heiß, obwohl es weniger ist, aber es ist immer noch spürbar, so war es immer empfohlen, um zu versuchen, nicht zu rufen es mehr als einmal pro On-Ereignis.

OrderSelect nach Historie erwies sich als kostenlos.

Особенности исполнения торговых приказов MT5
Особенности исполнения торговых приказов MT5
  • www.mql5.com
Анализировал с владельцем MT5-сервера тормоза торговых приказов. Запускался OrderSend-Test2.mq5 в том же месте, где MT5-сервер стоит. Т.е. нулевой пинг. Демо, все внутри. Изучались логи MT5-сервера (2170) и MT5-клиента (2280). Логи сервера не буду приводить, просто словами опишу. Думаю, результаты буду интерсны всем, т.к. это поможет раскрыть...
 

Sie können Statistiken über die für die Ausführung von Marktaufträgen (einschließlich TP/SL) aufgewendete Zeit erstellen.

//Statistiken über die für die Ausführung von Marktaufträgen aufgewendete Zeit (einschließlich TP/SL).
#property script_show_inputs

input datetime inFrom = 0;
input datetime inTo = INT_MAX;

struct ORDER
{
  ulong Ticket;
  
  ulong FillingTime;
  
  string ToString( void ) const
  {
    return((string)Ticket + ": " + ::TimeToString(this.FillingTime / 1000, TIME_SECONDS) +
                            "." + ::IntegerToString(this.FillingTime % 1000, 3, '0'));
  }
};

// Sammelt Daten über die für die Ausführung von Marktaufträgen aufgewendete Zeit
int GetOrders( ORDER &Orders[], const datetime From = 0, const datetime To = INT_MAX )
{
  int Amount = 0;
  
  if (HistorySelect(From, To)) // Wenn es Datensätze in der Historie gibt
    for (int i = ArrayResize(Orders, HistoryOrdersTotal()) - 1; i >= 0; i--) // Auswahl der Aufträge durchlaufen
    {
      const ulong TicketOrder = HistoryOrderGetTicket(i); // Wir haben einen Haftbefehl ausgewählt
      
      if ((HistoryOrderGetInteger(TicketOrder, ORDER_TYPE) <= ORDER_TYPE_SELL) &&   // Wenn der Marktauftrag
          (HistoryOrderGetInteger(TicketOrder, ORDER_STATE) == ORDER_STATE_FILLED)) // Wenn der Auftrag ausgeführt wurde
      {
        Orders[Amount].Ticket = TicketOrder;
        
        // Erinnert sich an die Zeit, die für die Ausführung benötigt wird.
        Orders[Amount++].FillingTime = HistoryOrderGetInteger(TicketOrder, ORDER_TIME_DONE_MSC) -
                                       HistoryOrderGetInteger(TicketOrder, ORDER_TIME_SETUP_MSC);
      }
      }
  
  return(ArrayResize(Orders, Amount));
}

// #include <MT4Orders.mqh> // https://www.mql5.com/de/code/16006

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  ORDER Orders[];
  
  if (GetOrders(Orders, inFrom, inTo))
  {
    ArraySortStruct(Orders, FillingTime); // https://www.mql5.com/ru/forum/170952/page166#comment_15151387
    
    // Druckt die am längsten ausgeführten Marktaufträge aus.
    for (int i = ArraySize(Orders) - 1, k = 0; (i >= 0) && (k < 10); i--, k++)
    {
      Print((string)k + " - " + Orders[i].ToString());

    #ifdef __MT4ORDERS__
      if (OrderSelect(Orders[i].Ticket, SELECT_BY_TICKET))
      {
        OrderPrint();
        
        PRINT(OrderTicketID());
        PRINT(OrderTicketOpen());
  
        Print("-------------------");      
      }
    #endif // __MT4ORDERS__ 
    }
  }
}


Ergebnis.

0 - 348806: 00:01:57.311
1 - 348530: 00:01:39.027
2 - 348494: 00:01:15.259
3 - 348406: 00:01:07.671
4 - 348950: 00:01:04.869
5 - 348960: 00:01:02.888
6 - 348814: 00:01:00.654
7 - 348392: 00:01:00.642
8 - 348508: 00:00:54.515
9 - 348550: 00:00:54.467


Bis zu zwei Minuten für die Ausführung auf einem laufenden Konto. Teilen Sie Ihre Statistiken hier. Das Skript verwendet keine Bibliotheken, es ist für Netting/Hedge geeignet.

 

In MT4/5 ist die Fehlersuche bei der Arbeit mit der Handelshistorie eher unangenehm. Man muss auf verschiedene Krückenlösungen zurückgreifen.


In MT5 können Sie sofort alle Felder der über MT4Orders ausgewählten Order sehen. Dazu müssen Sie MT4ORDERS::Order zur MT4ORDERS::Order Beobachtung hinzufügen.


Auf diese Weise können Sie alle Eigenschaften der ausgewählten Order sehen.

 
fxsaber:

Teilen Sie Ihre Statistiken hier. Das Skript verwendet keine Bibliotheken, geeignet für Netting/Hedge.

Dies ist, wie die reale ist:

2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      0 - 34487054: 00:00:06.768
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      1 - 34487223: 00:00:06.166
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      2 - 49869622: 00:00:03.656
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      3 - 34486559: 00:00:02.833
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      4 - 34486482: 00:00:02.051
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      5 - 34486480: 00:00:02.023
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      6 - 34486467: 00:00:01.983
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      7 - 42624984: 00:00:01.589
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      8 - 33738445: 00:00:01.088
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      9 - 42625044: 00:00:00.932