Bibliotheken: MT4Orders - Seite 46

 
traveller00:

Und in diesem Fall gibt es keine Möglichkeit, den Begrenzer zu umgehen. Oder gibt es eine Möglichkeit?

Ich schließe Positionen, indem ich einen Take-Out zum aktuellen Kurs setze. Aber der Takeout erfolgt nicht immer in Form eines Limits (hängt von der Software des Brokers ab). Deshalb ist diese Lösung nicht immer geeignet.

Wenn es notwendig ist, mit einem Limiter genau zu sein. Ich setze einen Limiter und schließe im Falle einer Absicherung gegenläufige Positionen über OrderCloseBy.

 

Ich nehme an, dass der Take so gewählt ist, dass Sie zur Absicherung eine Take-Anfrage an den Server senden können, anstatt 2 separate Limit- und CloseBy-Anfragen zu stellen? Und für das Netting macht es keinen Unterschied.

Übrigens, soweit ich mich erinnere, war es an der Börse nicht möglich, einen Take oder Stop Loss direkt in den aktuellen Kurs zu setzen, es sollte eine Einkerbung geben.

 
traveller00:

Ich gehe davon aus, dass der Take so gewählt ist, dass Sie zur Absicherung eine Take-Anfrage an den Server senden können, anstatt zwei separate Limit- und CloseBy-Anfragen? Und für Netting macht es keinen Unterschied.

Die CloseBy-Operation ist kein Handel, daher gibt es keinen großen Unterschied.

 
Es ist sehr einfach, eine Teilausführung im MT5 zu finden.
// true - Transaktion als Ergebnis einer Teilausführung.
bool IsPartial( const ulong TicketDeal )
{
  const ulong TicketOrder = HistoryDealGetInteger(TicketDeal, DEAL_ORDER);
  
  return((HistoryDealGetInteger(TicketDeal, DEAL_TYPE) <= DEAL_TYPE_SELL) &&
         (!TicketOrder ||
          (HistoryDealGetDouble(TicketDeal, DEAL_VOLUME) != HistoryOrderGetDouble(TicketOrder, ORDER_VOLUME_INITIAL))));
}


Ich werde die Besonderheit der Verwendung von MT5-Stil und MT4-Stil zusammen mit dieser Funktion als Beispiel zeigen.

// Ausgabe aller teilweise ausgeführten Transaktionen.

#include <MT4Orders.mqh>

input datetime inFrom = D'2020.01.01';

void OnStart()
{
  if (HistorySelect(inFrom, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong TicketDeal = HistoryDealGetTicket(i);
      
      if (IsPartial(TicketDeal))
      {
        Print(TicketDeal);
        
        if (OrderSelect(TicketDeal, SELECT_BY_TICKET) && // Nach OrderSelect by ticket wird die Historientabelle geändert,
            HistorySelect(inFrom, INT_MAX))              // daher sollte sie bei Bedarf zurückgegeben werden.
          OrderPrint();        
      }
    }
  }
}

Berücksichtigen Sie dies, wenn Sie mit HistorySelect+MT4Orders arbeiten.

 

Es gibt mehrere Stellen, an denen die Auswahl der Positionsreihenfolge erfolgt. Mit dem Kommentar

// Während der Suche kann sich die Anzahl der Aufträge ändern

wird überprüft, dass sich die Anzahl der Aufträge ändern kann. Streng genommen kann es aber vorkommen, dass sich die Anzahl der Aufträge nicht geändert hat, aber die Aufträge selbst haben sich geändert, z. B. 1 geschlossener und 1 neuer offener. Und dann kann sich die Nummerierung in der Mitte des Falles ändern. Eine solche Situation ist während der gesamten Nutzungsdauer noch nie aufgetreten? Ist das Fehlen strengerer Überprüfungen ein Fehler oder ein absichtliches Ignorieren einer unwahrscheinlichen Situation, um den Code nicht zu sehr zu verkomplizieren? Oder habe ich etwas übersehen und es gibt hier keinen Fehler?

 
traveller00:

Es gibt mehrere Stellen, an denen die Auswahl der Positionsreihenfolge erfolgt. Mit Kommentar

wird geprüft, ob sich die Anzahl der Aufträge ändern kann. Streng genommen kann es aber vorkommen, dass sich die Anzahl der Aufträge nicht geändert hat, aber die Aufträge selbst haben sich geändert, z. B. 1 geschlossener und 1 neuer offener. Und dann kann sich die Nummerierung in der Mitte des Falles ändern. Eine solche Situation ist während der gesamten Nutzungsdauer noch nie aufgetreten? Ist das Fehlen strengerer Überprüfungen ein Fehler oder ein absichtliches Ignorieren einer unwahrscheinlichen Situation, um den Code nicht zu sehr zu verkomplizieren? Oder habe ich etwas übersehen und es gibt hier keinen Fehler?

Ich kann mich nicht erinnern. Ich weiß nur, dass ich eine Menge Stresstests durchgeführt habe, um alle Situationen zu prüfen.

 

ORDER_TIME_SETUP(_MSC) für den Zeitpunkt der Ausführung des ersten (vielleicht vorletzten) Geschäfts. Das heißt, es ist nicht möglich, aus der Historie zu ermitteln, wann z. B. BuyLimit platziert wurde.


Infolgedessen kann eine Hedge-Position einen Bruchteil des Eröffnungskurses aufweisen, wie dies beim Netting häufig zu beobachten ist.

In diesem Fall wird über MT4Orders OrderOpenPrice/OrderOpenTime einer solchen MT4-Position den entsprechenden Werten des ersten MT5-Geschäfts entsprechen.

D.h. es gibt leider keinen Bruchteilspreis für die Eröffnung einer Position. Dies ist eine seltene Situation, aber sie kommt vor.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bibliotheken: MT4Orders

fxsaber, 2020.03.18 03:47

Tie Reject.

Diese Situation kann häufig auftreten:

  1. Der Kurs hat den Takeout einer offenen Position erreicht.
  2. MT5 hat eine Market-Order generiert. Eine entsprechende Limit-Order wurde an den Liquiditätsanbieter gesendet.
  3. Die Limit-Order wird erneut registriert. Dann wird die MT5-Order, die dem Take entspricht, gelöscht.
  4. Wechseln Sie zu Punkt 1.
Gute Umsetzung, da man in der Historie die Ablehnungen der Provider sehen kann. Gute und erzwungene interne Umsetzung von Takeouts als Limiter.

MT4Orders zeigt diese MT5-Aufträge in solchen Situationen eines Teejk-Rejacks nicht an, ebenso wie in Fällen, in denen der Take-Auftrag teilweise ausgeführt und dann gelöscht wurde. Und das ist richtig so!

 

Neueste Version MT5 2361 mit MT4Orders, real, hedge. Mehrere EAs, verschiedene Magics. Situation von einem der Expert Advisors.

Eine BUY-Order wurde platziert, Ticket 216684. Nach einiger Zeit war es an der Zeit, die Position zu schließen, ein SELL-Limit wurde platziert, um sie zu schließen, und ein weiteres SELL-Limit, um eine umgekehrte Position zu eröffnen, Tickets 216975 und 216978. Alle Aufträge haben die gleiche Losgröße. Als das Limit 216978 ausgelöst wurde, wurden 216684 und 216978 über CloseBy aufgelöst und nur 216975 blieb übrig.

Teil des Protokolls aus dem Journal

2020.04.15 07:33:24.203 : deal #107485  sell 0.15 XXXXXX at 1.05555 done (based on order #216978)
2020.04.15 07:33:24.203 : close position #216684  buy 0.15 XXXXXX by position #216978  sell 0.15 XXXXXX
2020.04.15 07:33:24.305 : accepted close position #216684  buy 0.15 XXXXXX by position #216978
2020.04.15 07:33:24.307 : deal #107487  sell 0.15 XXXXXX at 1.05555 done (based on order #216986)
2020.04.15 07:33:24.307 : close position #216684  buy 0.15 XXXXXX by position #216978  done in 103.841 ms
2020.04.15 07:33:24.309 : deal #107489  sell 0.15 XXXXXX at 1.05563 done (based on order #216975)

Ein Teil des Protokolls des Expert Advisors

2020.04.15 07:33:24.180 OrdersTotal 216978 216975 216684
2020.04.15 07:33:24.305 OrdersTotal

D.h. wir können sehen, dass es 3 Aufträge gab. Aber während des Zusammenbruchs von 2 Orders und des Wechsels zum Markt der 3. Order war die Liste der Orders leer, obwohl 1 hätte übrig bleiben müssen. Diese Situation kann zur doppelten Eröffnung einer Position führen.

Ich erhalte Aufträge durch den folgenden Code

  int PrevTotal;
  ulong OrderTickets[];
  do
  {
    PrevTotal=OrdersTotal();
    for(int i=PrevTotal-1;i>=0;--i)
    {
      int Total=OrdersTotal();
      if(Total!=PrevTotal)
      {
        PrevTotal=Total;
        i=PrevTotal;
        ArrayFree(OrderTickets);
        continue;
      }
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES) || OrderMagicNumber()!=inTradeMagic)
        continue;

      ArrayResize(OrderTickets,ArraySize(OrderTickets)+1);
      OrderTickets[ArraySize(OrderTickets)-1]=OrderTicket();
    }
  }while(PrevTotal!=OrdersTotal());

Und so habe ich eine Prüfung eingefügt, für den Fall, dass sich die Anzahl während der Aufzählung ändert. Aber sie scheint zu fehlen. Ist das ein Fehler, ein Feature oder habe ich einen unfertigen Bereich betreten?

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...