Bibliotheken: MT4Orders - Seite 81

 

Wenn die Direktive #define MT4ORDERS_FASTHISTORY_OFF aktiviert ist, lässt sich das Programm nicht kompilieren - es erzeugt eine Menge Fehler.

Früher musste ich diese Direktive aktivieren, weil einige Funktionen (die hier besprochen werden), die in diesem Artikel verwendet werden, ohne sie nicht verfügbar sind. Wenn die Funktionalität immer noch eingeschränkt ist, ist es wünschenswert, dies zu korrigieren.

Библиотеки: MT4Orders - Попробуйте отключить этот медленный режим. Выделенная ссылка отвечает за игнорирование закрытых позиций по CloseBy, а поиск соответствующего выхода
Библиотеки: MT4Orders - Попробуйте отключить этот медленный режим. Выделенная ссылка отвечает за игнорирование закрытых позиций по CloseBy, а поиск соответствующего выхода
  • 2019.09.27
  • www.mql5.com
что такой простой код не работал корректно в MT5 со старой версией библиотеки. Было бы очень желательно указать как минимум в шапке комменатриев исходника. а поиск соответствующего выхода как раз обложен условной компиляцией на MT4ORDERS
 
Stanislav Korotky #:

Mit der aktivierten Direktive #define MT4ORDERS_FASTHISTORY_OFF lässt sie sich nicht kompilieren - sie erzeugt eine Menge Fehler.

Dies ist ein historisches Überbleibsel, das ich nicht beseitigen kann.

MQ hat so viele Kopfschmerzen verursacht, dass es sich nur lohnt, ausgeklügelte Varianten zu verwenden.

Es sollte ein größeres Bibliotheksupdate geben, trotz des seltsamen Mangels an Fehlerberichten. Es ist noch nicht fertig.

 
OrderSelect(i, SELECT_BY_POS)

Bei dieser Operation gibt es immer offene Positionen auf den niedrigeren Indizes und schwebende Aufträge auf den höheren Indizes.

Mit Hilfe dieser Tatsache können Sie die Suche nach den erforderlichen MT4-Aufträgen etwas beschleunigen.

 

Ich habe mich gefragt, ob es möglich ist, den Tester in der Geschwindigkeit zu schlagen, wo es keine Chance geben sollte?

Ich habe einen Expert Advisor "ohne Chancen" geschrieben - maximal auf Geschwindigkeit optimiert.

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

input int inAmountMagics = 50; // Wie viele TCs sollen emuliert werden?

// Eröffnen Sie eine Position und einen Auftrag für jeden TS. MT4-Code der Kürze halber.
void OnInit()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))  
    for (int i = 0; i < inAmountMagics; i++)
    {
      OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0, NULL, i);
      
      OrderSend(_Symbol, OP_BUYLIMIT, 1, Tick.ask - 1 e4*_Point, 0, 0, 0, NULL, i);
    }
}

// Sammeln Sie Informationen von den richtigen Positionen/Aufträgen. Maximal schneller MT5-Code.
double CountOrders( const int Type, const int Magic )
{
  double Res = 0;
  
  if (Type <= OP_SELL)
  {
    for (int i = PositionsTotal() - 1; i >= 0; i--)
      if (PositionGetTicket(i) && (PositionGetInteger(POSITION_TYPE) == Type) && PositionGetInteger(POSITION_MAGIC) == Magic)
        Res += PositionGetDouble(POSITION_PRICE_OPEN) + PositionGetDouble(POSITION_PRICE_CURRENT) +
               PositionGetDouble(POSITION_TP) + PositionGetDouble(POSITION_SL);
  }
  else
    for (int i = OrdersTotal(true) - 1; i >= 0; i--)
      if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) == Type) && OrderGetInteger(ORDER_MAGIC) == Magic)
        Res += OrderGetDouble(ORDER_PRICE_OPEN) + OrderGetDouble(ORDER_PRICE_CURRENT) +
               OrderGetDouble(ORDER_TP) + OrderGetDouble(ORDER_SL);
        
  return(Res);
}

// Nummer zur Kontrolle der Korrektheit alternativer Implementierungen.
double OnTesterValue = 0;
double OnTester() { return(OnTesterValue); }

void OnTick()
{
  // Simulieren Sie den Betrieb auf allen TCs.
  for (int i = 0; i < inAmountMagics; i++)
    OnTesterValue += CountOrders(POSITION_TYPE_BUY, i) + 
                     CountOrders(POSITION_TYPE_SELL, i) +
                     CountOrders(ORDER_TYPE_BUY_LIMIT, i) +
                     CountOrders(ORDER_TYPE_SELL_LIMIT, i);  
}

Anhand des Codes kann man argumentieren, dass er so geschrieben wurde, dass er langsam ist. Aber der Code emuliert die Arbeit vieler "TS". Und viele TSs arbeiten genau so - zunächst einmal finden sie ihre Positionen/Orders.

OnTester result 54790620.97344553
EURCAD,M1: 192394 ticks, 1440 bars generated. Environment synchronized in 0:00:00.023. Test passed in 0:01:21.775 (including ticks preprocessing 0:00:00.016).
81 Sekunden für die Ausführung. Für einen Tag auf echten Ticks etwas sehr viel. Aber was ist schon dabei.
 
fxsaber #:

81 Sekunden bis zur Fertigstellung. Für einen Tag auf echten Ticks ist das etwas viel. Aber was ist.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bibliotheken: Virtuell

fxsaber, 2023.03.01 20:36

OnTester result 54790620.97344553
EURCAD,M1: 192394 ticks, 1440 bars generated. Environment synchronized in 0:00:00.023. Test passed in 0:00:46.653 (including ticks preprocessing 0:00:00.016).

Die Prüfsumme stimmt überein. Ich habe es geschafft, fast doppelt so schnell zu sein.

Nicht einfach, aber es hat funktioniert.

 
fxsaber #:

Ich habe einen "chancenlosen" EA geschrieben, der maximal auf Geschwindigkeit optimiert ist.

Ein einfacher Weg, um schneller zu werden.
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bibliotheken: MT4Orders

fxsaber, 2022.07.20 00:39

// Liste ändern:
// 20.07.2022
// Hinzufügen: OrderLotsOpen() hinzugefügt - volle Position/Auftragsvolumen vor dem Schließen/Löschen. Funktioniert nur im ByPass-Modus korrekt.

Mit dem gleichen Beispiel (1 Lot geöffnet und schrittweise um 0,1, 0,2, 0,3 und 0,4 Lots geschlossen), aber mit einer anderen Visualisierung.


OrderLotsOpen() im roten Rahmen oben im Bild.
 

Hallo,

Sieht so aus, als gäbe es einen Fehler bei OrderTicket()

Es ist nicht das richtige Ticket aus der MT5 Historie


Dies ist mein Code:

bool isCopyHistory2(string u_symbol, int master_ticket)
  {

   int ticket_copy;

   bool is_exists = false;

// Abrufen von Informationen aus der Handelsgeschichte

   for(int i = 0; i < OrdersHistoryTotal(); i++)
     {
      //---- Auswahlergebnis prüfen

      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false)
        {
         Print("Access to history failed with error (", GetLastError(), ")");
         continue;
        }

      // einige Arbeiten mit Auftrag

      ticket_copy = (int)extract_master_ticket(OrderComment());

      if(ticket_copy == master_ticket)
        {
	//print-for-debug
        Print("c ticket: ", OrderTicket());  // ==> dies ist kein korrektes Ticket auf MT5
         is_exists = true;
         break;
        }

     }

//---

   if(!is_exists)

      Print("New Signal #" + (string)master_ticket);

   return(is_exists);

  }

 
Cuong Le Van #:

Sieht aus wie ein Fehler bei OrderTicket()

Es ist nicht das richtige Ticket aus der MT5 Historie

Offensichtlich wollen Sie es bekommen.

// Liste der Änderungen:
// 13.03.2019
// Hinzufügen: OrderTicketID() hinzugefügt - PositionID of an MT5 transaction or MT5 position, and the ticket of a pending MT4 order.

Die Gründe sind hier ausführlich beschrieben.

 
fxsaber #:

Offensichtlich wollen Sie es bekommen.


Die Gründe dafür sind hier aufgeführt.

Ich danke Ihnen vielmals.

Es ist in Ordnung mit

OrderTicketID()