Bibliotheken: MT4Orders - Seite 23

 
Sergey Likho:

Gleichzeitig zeigt das Protokoll auch eine Meldung an, dass alles normal ist.

Auf dieser Seite gibt es mehrere Links zu diesem Thema. Kurz gesagt, Sie können im Protokoll ein null Result.deal sehen. Sie können im Protokoll sehen (nicht null Request.position), dass ein OrderClose durchgeführt wurde, der angeblich erfolgreich abgeschlossen wurde (Result.code), aber gleichzeitig erschien eine Sekunde lang kein Eintrag (DEAL_ENTRY_OUT deal) darüber im Terminal (die Bibliothek hat gewartet). Dies deutet auf zwei Szenarien hin:

  1. Ein MT5-Handelsauftrag wurde erfolgreich übermittelt, aber der MT5-Handel wurde nicht durchgeführt.
  2. Der Handel wurde durchgeführt, aber er erschien nicht in der Handelshistorie.

Beide Szenarien sind nicht immer gut für MT5 (siehe den Link oben für eine detaillierte Diskussion). Die Bibliothek funktionierte eindeutig, leider. All diese Nuancen wurden einmal durchdacht analysiert, und die Bibliothek hat dementsprechend vernünftige Reaktionen darauf entwickelt.

 
Sergey Likho:

Wenn ich den fhtm-Demo-Broker für Tests nehme, öffnet die OrderSend-Funktion einen Handel, gibt aber einen Fehler zurück.

Ich habe es nachgestellt und festgestellt, dass es mein Fehler war. Danke für die Nachricht, interessantes Verhalten von MT5 auf diesem Handelsserver.

Ich habe es behoben. Wenn Sie es brauchen, kann ich es Ihnen per PM schicken. Und um die Moderatoren nicht zu belästigen, werde ich es in KB posten, wenn die Entwickler DEAL_SL/TP in neuen Builds lösen werden.

 
fxsaber:

Wiederholte es und stellte fest, dass es mein Fehler war. Vielen Dank für Ihre Nachricht, interessantes Verhalten von MT5 auf diesem Handelsserver es stellte sich heraus.

Ich habe es behoben. Wenn Sie es brauchen, kann ich es Ihnen per PM schicken. Und um die Moderatoren nicht zu belästigen, werde ich es in KB posten, wenn die Entwickler DEAL_SL/TP in neuen Builds lösen werden.

Ja, bitte senden Sie es per PM

 
Sergey Likho:

Ja, bitte senden Sie mir eine PM

Gesendet.

Selten, aber es können solche Alerts auftreten

Alert: OrderSend(2210958493) - BUG!
Alert: Please send the logs to the author - https://www.mql5.com/en/users/fxsaber
::AccountInfoString(ACCOUNT_SERVER) = ForexTimeFXTM-Demo01
(bool)::TerminalInfoInteger(TERMINAL_CONNECTED) = true
::TerminalInfoInteger(TERMINAL_PING_LAST) = 66676
::TerminalInfoDouble(TERMINAL_RETRANSMISSION) = 13.63636363636363
::TerminalInfoInteger(TERMINAL_BUILD) = 1861
(bool)::TerminalInfoInteger(TERMINAL_X64) = true
MT4ORDERS::IsHedging = true
Res = true
MT4ORDERS::OrderSendBug = 1
Request.action = TRADE_ACTION_DEAL (1)
Request.magic = 0
Request.order = 0
Request.symbol = EURUSD
Request.volume = 1.0
Request.price = 1.15758
Request.stoplimit = 0.0
Request.sl = 0.0
Request.tp = 0.0
Request.deviation = 0
Request.type = ORDER_TYPE_SELL (1)
Request.type_filling = ORDER_FILLING_FOK (0)
Request.type_time = ORDER_TIME_GTC (0)
Request.expiration = 1970.01.01 00:00:00
Request.comment = 
Request.position = 0
Request.position_by = 0
Result.retcode = 10009
Result.deal = 2208425527
Result.order = 2210958493
Result.volume = 1.0
Result.price = 0.0
Result.bid = 0.0
Result.ask = 0.0
Result.comment = Request executed 180.441 + 9.521 (1) ms.
Result.request_id = 153
Result.retcode_external = 0

Dies ist ein rein informativer (hat keinen Einfluss auf den Handel) Alarm, dass MT5-OrderSend mit einem Fehler arbeitet. Dieser Fehler wird hier im Detail besprochen. Die Entwickler sind jedoch der Meinung, dass es sich hierbei noch nicht um ein fehlerhaftes Verhalten von MT5 handelt...


ZY Eine Raffinesse von MT5 ist aufgedeckt worden. Phantom-Orders werden beim Handel über die Bibliothek nicht auftreten.

 
Andrey Khatimlianskii:

Die Arbeit mit einer langen Geschichte fliegt jetzt einfach!

Einige unerwartete Ergebnisse. Das Skript berechnet den Zeitpunkt der Eröffnung/Schließung der letzten "Position".

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

OrderCloseTime Expert Advisor MQL5

fxsaber, 2018.07.06 00:49

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

void LastTimeMQL4( datetime &OpenTime, datetime &CloseTime )
{
  if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
  {
    OpenTime = OrderOpenTime();
    CloseTime = OrderCloseTime();
  }
}

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  if (HistorySelect(0, INT_MAX))
  {
    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;
      }
    }
  }
}

typedef void (*GetLastTime)( datetime&, datetime& );

void Bench( GetLastTime LastTime, const int Amount = 10000 )
{
  datetime OpenTime, CloseTime;
  datetime Tmp = 0;

  for (int i = 0; i < Amount; i++)
  {
    LastTime(OpenTime, CloseTime);
    
    Tmp += CloseTime - OpenTime;        
  }
  
  Print(Tmp);
}

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

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

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
    PRINT(HistoryDealsTotal());

  BENCH(Bench(LastTimeMQL4))
  BENCH(Bench(LastTimeMQL5))  
}


Ergebnis

HistoryDealsTotal() = 343
1970.01.01 00:00:00
Time[Bench(LastTimeMQL4)] = 88705
1970.01.01 00:00:00
Time[Bench(LastTimeMQL5)] = 749410

Ich habe nicht analysiert, warum die Leistung der Bibliothek so viel besser ist als reines MQL5. Ich gehe davon aus, dass HistorySelect in Echtzeit langsamer wird. Ich habe es nicht im Tester überprüft.


Ja, HistorySelect verlangsamt sich.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bibliotheken: MT4Orders

fxsaber, 2017.09.03 18:52

// Liste ändern:
// 03.09.2017:
// Hinzufügen: OrderTicketOpen() hinzugefügt - MT5-Ticket der Positionseröffnungstransaktion
// OrderOpenReason() - Grund für die MT5-Eröffnungstransaktion (Grund für die Eröffnung einer Position)
// OrderCloseReason() - причина проведения MT5-сделки закрытия (причина закрытия позиции)


Ausdruck aller durch SL geschlossenen Positionen

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wie kann man den Schlusskurs herausfinden, wenn die Position in den Stop Loss gelaufen ist?

fxsaber, 2018.07.10 11:46

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

void OnStart()
{
  const int Total = OrdersHistoryTotal();
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderCloseReason() == DEAL_REASON_SL))
      OrderPrint();  
}
 
fxsaber:

Ein etwas unerwartetes Ergebnis. Das Skript berechnet den Zeitpunkt des Öffnens/Schließens der letzten "Position".

Ich habe nicht analysiert, warum die Leistung der Bibliothek so viel besser ist als bei reinem MQL5. Ich nehme an, dass HistorySelect in Echtzeit langsamer wird. Ich habe es nicht im Tester überprüft.

Ja, HistorySelect verlangsamt sich.

Ist dies die neueste Version der Bibliothek?

 
Vitaly Muzichenko:

Ist dies die neueste Version der Bibliothek?

Ja.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bibliotheken: MT4Orders

fxsaber, 2017.02.16 15:16

Konnte mit diesem Skript Ausführungsprobleme im MT5 feststellen. Ich empfehle Ihnen, Ihre Terminal+Trading Server Verbindung zu überprüfen und bei Problemen dem Service Desk zu melden.


Aktualisiertes Skript in der Anwendung. Findet schnell z.B. solche Probleme

2018.07.24 10:24:19.177 Trades  '35247942': market buy 0.01 USDHKD
2018.07.24 10:24:19.246 Trades  '35247942': failed market buy 0.01 USDHKD [No prices]
2018.07.24 10:24:19.246 Trades  '35247942': buy limit 0.01 USDHKD at 7.83618
2018.07.24 10:24:19.315 Trades  '35247942': failed buy limit 0.01 USDHKD at 7.83618 [No prices]
2018.07.24 10:24:19.316 Trades  '35247942': buy stop 0.01 USDHKD at 7.85618
2018.07.24 10:24:19.384 Trades  '35247942': failed buy stop 0.01 USDHKD at 7.85618 [No prices]
Dateien:
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bibliotheken: MT4Orders

Andrey Khatimlianskii, 2018.06.06 01:53 pm.

// 30.05.2018
// Hinzufügen: Beschleunigte Arbeit mit der Handelshistorie, Auswahl einer goldenen Mitte der Realisierungen zwischen Leistung und
// Speicherverbrauch - wichtig für VPS. Es wird die generische Standardbibliothek verwendet.
// Wenn Sie die generische Bibliothek nicht verwenden möchten, steht Ihnen die alte Methode der Arbeit mit der Historie zur Verfügung.
// Dazu müssen Sie die folgende Zeile in die MT4Orders-Bibliothek VOR die MT4Orders-Bibliothek schreiben
//
// #define MT4ORDERS_FASTHISTORY_OFF // Schalten Sie die Implementierung der schnellen Handelshistorie aus - verwenden Sie die generische Bibliothek nicht.

Das Arbeiten mit der langen Historie klappt jetzt wie am Schnürchen!

Überprüfung der generischen Gewinne in Zahlen
#define  MT4ORDERS_FASTHISTORY_OFF // Schalten Sie die schnelle Implementierung der Handelshistorie aus - verwenden Sie keine generische Bibliothek.
#include <MT4Orders.mqh>

double HistoryToDouble( void )
{
  double Res = 0;

  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      Res += OrderCloseTimeMsc() - OrderOpenTimeMsc() + OrderProfit() + OrderTicket() - OrderTicketOpen();
    
  return(Res);
}

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

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

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
  {
    PRINT(HistoryDealsTotal());
    PRINT(HistoryOrdersTotal());
  }

  for (int i = 0; i < 3; i++)
  {
    PRINT(i);
    BENCH(Print(HistoryToDouble()))    
  }
}


Ergebnis ohne Generic

HistoryDealsTotal() = 10063
HistoryOrdersTotal() = 20296
i = 0
1195028482.07
Time[Print(HistoryToDouble())] = 829525
i = 1
1195028482.07
Time[Print(HistoryToDouble())] = 885207
i = 2
1195028482.07
Time[Print(HistoryToDouble())] = 918911


Ergebnis mit Generic

HistoryDealsTotal() = 10063
HistoryOrdersTotal() = 20296
i = 0
1195028482.07
Time[Print(HistoryToDouble())] = 52603
i = 1
1195028482.07
Time[Print(HistoryToDouble())] = 39051
i = 2
1195028482.07
Time[Print(HistoryToDouble())] = 34409


Bei einer Historie mit 10K Trades und 20K Orders ist die Generic-Variante ~30 mal schneller. Je größer die Handelshistorie, desto deutlicher ist die Beschleunigung.