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](https://c.mql5.com/36/61/documentation-on-mql5-constants__7.png)
- www.mql5.com
- anscheinend können nur offene Positionen durch eine andere offene (oder extra geöffnete) Position geschlossen werden.
- 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. :(
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.
@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.
@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
![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
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:
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