CLOSE_BY

 

Ich beziehe mich auf den Artikel: https://www.mql5.com/de/articles/2299 (aus dem Jahr 2016):

Neue Konstanten

Da der neue Typ der Handelsoperation "Schließen zur Gegenposition" hinzugefügt wurde, erschienen neue Handelseigenschaften:

  • TRADE_ACTION_CLOSE_BY — neuer Typ der Handelsoperation — Position zur Gegenposition schließen.
  • ORDER_TYPE_CLOSE_BY — neuer Ordertyp — Position zur Gegenposition schließen.
  • ORDER_POSITION_BY_ID  — neue Ordereigenschaft — Ticket der Gegenposition, die bei der Schließung der laufenden verwendet wird.
  • DEAL_ENTRY_OUT_BY — neuer Tradetyp — Position zur Gegenposition schließen.

Mein Ziel (ohne konkrete Situation, sondern nur um zu sehen, was geht) ist eine Pending Order zu platzieren, die teilweise (partially) eine  anderer Pending Order bzw. eine offenen Position mit einer Pending Order zu schließen.

SL und TP einer Position schließen immer die ganze Position. Eine offene Position kann ich mit einer anderen offenen Position (teilweise) schließen (siehe Trade.mqh), um so zB. das Volumen der offenen Position zu schließen.

Jetzt hätte ich gerne platzierte Pending Orders, die (teilweise) die offene Position schließen und die ich je nach Marktentwicklung hin- und herschieben könnte - wie gesagt, ein akademisches Zenario.

Anbei ein Test EA der auf dem Zeitraum D'2022.10.05 00:00' bis D'2022.10.06 00:00' und EURUSD abgestimmt ist, damit die StopLimit-Order nicht an den Preisen scheitert.

Es gibt einen schönen Gewinn, aber ich kenne ja die Kursentwicklung honi soit qui mal y pense ;)


Hier das etwas designte Journal des Debuggers:


00:03:48   sell stop limit 1 EURUSD at 0.99600 (0.99900) (0.99846 / 0.99880)
00:03:48   
00:03:48   #######################  OK: place ORDER_TYPE_SELL_STOP_LIMIT
00:03:48   127  eurusd 1000  00:03:48  penStpLimit Sell Mag: 1000
00:03:48        SELL-STOP with SL & TP  r.ID: 0  d.O: 0  r.O: 2  r.ret: 10009


00:06:33   order modified [#2 sell stop limit 1 EURUSD at 0.99600 (0.99900)]
00:06:33   
00:06:33   #######################  OK: CHG ST || TP openOrders
00:06:33   200  eurusd 00:06:33    MODIF ORD SL & TP  r.ID: 1  d.O: 0  r.O: 0  r.ret: 10009



00:08:53   failed close by 0.3 EURUSD at 0.99800 [Invalid request]
00:08:53   
00:08:53   ################  FAIL: ORDER_TYPE_CLOSE_BY  ########
00:08:53   155  ORDER_TYPE_CLOSE_BY OrderSendAsync error 4756 res.order 10013
00:08:53   tC 2022.10.05 00:08:53 ask: 0.99890
00:08:53   158 struct REQUEST[0]:
00:08:53   action[5] TRADE_ACTION_PENDING
00:08:53   Mag.Nr. 1050
00:08:53   Order Ticket 0
00:08:53   Symbol EURUSD
00:08:53   Vol. 0.30
00:08:53   Preis 0.99800
00:08:53   StopLimit 0.00000
00:08:53   SL 0.00000
00:08:53   TP 0.00000
00:08:53   Deviat. 0
00:08:53   Typ order[8] ORDER_TYPE_CLOSE_BY
00:08:53   Typ exec ORDER_FILLING_FOK
00:08:53   Typ  Ablauffrist ORDER_TIME_GTC
00:08:53   Zeit Ablauffrist 1970.01.01 00:00:00
00:08:53   Kommentar penTrailing TGT Mag: 1000
00:08:53   Position ticket 0
00:08:53   Ticket of opposite position 2
00:08:53   
00:08:53   159 struct RESULT[0]
00:08:53   retCode 10013
00:08:53   Deal-Ticket 0
00:08:53   Order-Ticket 0
00:08:53   conf. Vol 0.00
00:08:53   conf. Preis 0.00000
00:08:53   akt.Bid (Requote Preis) 0.00000
00:08:53   akt.Ask (Requote Preis) 0.00000
00:08:53   Kommentar Invalid request
00:08:53   Term.ID 2
00:08:53   exter. RestCode 0
00:08:53   


05:47:56   order [#2 sell stop limit 1 EURUSD at 0.99600 (0.99900)] triggered


09:37:58   order [#2 sell limit 1 EURUSD at 0.99900] triggered
09:37:58   deal #2 sell 1 EURUSD at 0.99903 done (based on order #2)
09:37:58   deal performed [#2 sell 1 EURUSD at 0.99903]
09:37:58   order performed sell 1 at 0.99903 [#2 sell limit 1 EURUSD at 0.99900]
09:37:58   failed close by 0.4 EURUSD at 0.99830 [Invalid request]
09:37:58   
09:37:58   ################  FAIL: POS _CLOSE_BY Pen.Ord. ########
09:37:58   267  ORDER_TYPE_CLOSE_BY OrderSendAsync error 4756 res.order 10013
09:37:58   tC 2022.10.05 09:37:58 ask: 0.99906
09:37:58   270 struct REQUEST[0]:
09:37:58   action[5] TRADE_ACTION_PENDING
09:37:58   Mag.Nr. 1200
09:37:58   Order Ticket 0
09:37:58   Symbol EURUSD
09:37:58   Vol. 0.40
09:37:58   Preis 0.99830
09:37:58   StopLimit 0.00000
09:37:58   SL 0.00000
09:37:58   TP 0.00000
09:37:58   Deviat. 0
09:37:58   Typ order[8] ORDER_TYPE_CLOSE_BY
09:37:58   Typ exec ORDER_FILLING_FOK
09:37:58   Typ  Ablauffrist ORDER_TIME_GTC
09:37:58   Zeit Ablauffrist 1970.01.01 00:00:00
09:37:58   Kommentar penTrailing TGT Mag: 0
09:37:58   Position ticket 0
09:37:58   Ticket of opposite position 2
09:37:58   
09:37:58   271 struct RESULT[0]
09:37:58   retCode 10013
09:37:58   Deal-Ticket 0
09:37:58   Order-Ticket 0
09:37:58   conf. Vol 0.00
09:37:58   conf. Preis 0.00000
09:37:58   akt.Bid (Requote Preis) 0.00000
09:37:58   akt.Ask (Requote Preis) 0.00000
09:37:58   Kommentar Invalid request
09:37:58   Term.ID 3
09:37:58   exter. RestCode 0
09:37:58   


09:40:01   position modified [#2 sell 1 EURUSD 0.99903 sl: 1.00102 tp: 0.99202]
09:40:01   
09:40:01   #######################   OK: CHG StTP Position
09:40:01   314  eurusd 1000  09:40:01    MODIF POS SL & TP  r.ID: 4  d.O: 0  r.O: 0  r.ret: 10009



13:05:23   take profit triggered #2 sell 1 EURUSD 0.99903 sl: 1.00102 tp: 0.99202 [#3 buy 1 EURUSD at 0.99202]
13:05:23   deal #3 buy 1 EURUSD at 0.99199 done (based on order #3)
13:05:23   deal performed [#3 buy 1 EURUSD at 0.99199]
13:05:23   order performed buy 1 at 0.99199 [#3 buy 1 EURUSD at 0.99202]
13:06:25   
13:06:25   2022.10.05 13:06:25  Time to kill me..
13:06:25   
13:06:25   Printout of Deals
13:06:25   D[2] 3 DEAL_ENTRY_OUT m 1000 o 3 p 2 R DEAL_REASON_TP T DEAL_TYPE_BUY t 2022.10.05 13:05:23
13:06:25   D[1] 2 DEAL_ENTRY_IN m 1000 o 2 p 2 R DEAL_REASON_EXPERT T DEAL_TYPE_SELL t 2022.10.05 09:37:58
13:06:25   ExpertRemove() function called

Hedging-System zur Verrechnung von Positionen in MetaTrader 5 verfügbar
Hedging-System zur Verrechnung von Positionen in MetaTrader 5 verfügbar
  • www.mql5.com
Um Möglichkeiten von Retail-Tradern zu erweitern, wurde das zweite System der Aufrechnung von Positionen — Hedging — auf der Plattform hinzugefügt. Nun kann man eine Vielzahl von Positionen pro Symbol haben, darunter auch gegenläufige. Dank Hedging kann man Handelstrategien mit dem sogenannten "Locking" umsetzen: wenn sich der Preis gegen den Trader entwickelt, kann der Trader eine Position in einer entgegengesetzten Richtung eröffnen.
Dateien:
 

Was ORDER_TYPE_CLOSE_BY anbelangt, so scheint mir der englische Artikel Aufschluss zu geben:

https://www.mql5.com/en/docs/constants/tradingconstants/orderproperties

ORDER_TYPE_CLOSE_BY

Order to close a position by an opposite one


Das heißt, dies ist der Ordertyp für TRADE_ACTION_CLOSE_BY, wenn man einen Ordertyp dazu angeben möchte bzw. muss. Order ist hier wohl nicht im Sinn einer Pending-Order gemeint, sondern im Sinn von SendOrder(tradeRequest, tradeResult) gemeint.

Hast du dir schon einmal diesen Artikel angeschaut? https://www.mql5.com/en/articles/5206

Documentation on MQL5: Constants, Enumerations and Structures / Trade Constants / Order Properties
Documentation on MQL5: Constants, Enumerations and Structures / Trade Constants / Order Properties
  • www.mql5.com
Order Properties - Trade Constants - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
Ja, aber:
  1. anscheinend können nur offene Positionen durch eine andere offene (oder extra geöffnete) Position geschlossen werden.
  2. Ich kann natürlich eine Limit-Order absenden,
    ABER ich muss die ständig kontrollieren: Wurde sie getriggert, um dann zwei offene Positionen zu matchen.

Also statt einem Fire and Forgett heißt es Fire and Follow :(


Wozu arbeite ich mit zwei Computern (Terminal & Server), wenn ich doch wieder alles selber machen muss. :(

 
Close_By wurde eingeführt um Positionen umzudrehen. das Spart den Spread, daher nur direkte Umkehr möglich
 
Naja, ich hatte gedacht, man könnte eine Position öffnen und mit einer 'nahen' Pending Order zB. die Hälfte der Position sichern, um mit dem Rest auf mehr zu spekulieren. Aber der dafür nötige Aufwand ist viel zu umfangreich und lohnt nicht :(
 

Bei diesem Thema ist es wohl eine entscheidende Frage, ob man einen "Netting-EA" oder einen "Hedging-EA" programmieren will, d.h. ob der EA mehrere gegenläufige Positionen offen halten soll oder nicht.

Falls man in einem "Netting-EA" mit einem Hedging-Account obiges Verhalten programmieren will, dann könnte man in der OnTrade() Methode alle offenen Positionen des EA in dem jeweiligen Symbol abfragen und, falls es gegenläufige gibt, diese mit CLOSE_BY miteinander verrechnen. Dadurch würde jede zur offenen Position gegenläufige Pending-Order, die gefüllt wird und damit eine Position öffnet, sofort mit der offenen Position verrechnet werden.

Falls du aber einen "Hedging-EA" programmieren willst, dann wird das tatsächlich sehr kompliziert. Da müsste man die verschiedenen IDs bzw. Tickets der Pending-Orders und der Positionen einander zuordnen und verfolgen.

 

Nachtrag: Im Hedging-Modus könnte man eine Position auch durch mehrere kleine Positionen simulieren und diesen eigene Take-Profits und Stop-Losses zuordnen.

Eine nächste alternative wäre natürlich die Verwendung von Market-Orders, wenn gewisse Schwellen erreicht werden. Aber da hat man natürlich die Spread-Kosten, welche bei Limit-Orders als Stops wegfallen.

 
Ich glaub da verwechselst du was. Du sparst nur 1x spread nicht 2x. Trade schliessen mit close by geht nicht, nur umdrehen
 

@amando

Also ich habe das mit einem Skript ausprobiert. 1. Öffne eine Sell-Position mit Market-Order und Volumen 1.0; 2. Setze eine Buy-Limit-Order mit Volumen 0.5; 3. warte bis diese gefillt wird; 4. schließe die 1.0 Sell-Position teilweise mit der 0.5 Sell-Order mithilfe von CLOSE_BY; 5. schließe die Position ganz. Und mit einer Buy-Limit-Order mit Volumen 1.0 werden beide offene Positionen via CLOSE_BY geschlossen, und in diesem Fall würde ich über CLOSE_BY beide Spreads für das Schließen via Market-Order sparen ... im Vergleich zum Schließen der offenen Position mithilfe von Market-Orders wird durch die Kombination von Pending-Limit und CLOSE_BY natürlich nur 1x der Spread gespart, da man dann selbstverständlich die gegenläufige Position erst gar nicht eröffnet.

 
Benjamin Fotteler #:

@amando

Also ich habe das mit einem Skript ausprobiert. 1. Öffne eine Sell-Position mit Market-Order und Volumen 1.0; 2. Setze eine Buy-Limit-Order mit Volumen 0.5; 3. warte bis diese gefillt wird; 4. schließe die 1.0 Sell-Position teilweise mit der 0.5 Sell-Order mithilfe von CLOSE_BY; 5. schließe die Position ganz. Und mit einer Buy-Limit-Order mit Volumen 1.0 werden beide offene Positionen via CLOSE_BY geschlossen, und in diesem Fall würde ich über CLOSE_BY beide Spreads für das Schließen via Market-Order sparen ... im Vergleich zum Schließen der offenen Position mithilfe von Market-Orders wird durch die Kombination von Pending-Limit und CLOSE_BY natürlich nur 1x der Spread gespart, da man dann selbstverständlich die gegenläufige Position erst gar nicht eröffnet.

Ich hab kein wort verstanden

wenn du keine gegenläufige position eröffnest sparst du gar nix