![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Wie kann ich wissen, dass SL/TP in OnTradeTransaction() ausgelöst wurde?
Um die Logik der Meldungen in OnTrade* zu verstehen, mache ich einen Ausdruck der Eingabeparameter zu dem Zeitpunkt, an dem das betreffende Ereignis eingetreten ist.
Machen Sie das Gleiche, dann wird alles sofort klar.
Denken Sie daran, dass der TP in MT5 immer (im Gegensatz zu MT4) eine Market Order ist, die auf dem MT5-Server und nicht an der Börse/ECN hängt. Dementsprechend kommt es bei seiner Auslösung zu einer Latenzzeit + Marktabweichung beliebigen Vorzeichens. Bei einigen MT4 TP handelt es sich um Limit-Orders, die direkt beim ECN platziert werden. Es gibt dort also keine Latenz (MT-ECN) und keinen negativen Schlupf, aber es gibt eine Umleitung. TP ist also einer der großen Nachteile von MT5 gegenüber MT4.
Um die Logik der Meldungen in OnTrade* zu verstehen, mache ich einen Ausdruck der Eingabeparameter zu dem Zeitpunkt, an dem das betreffende Ereignis eintrat.
Machen Sie das Gleiche, dann wird alles sofort klar.
Ich habe es ausprobiert. In diesem Fall ist OnTrade() nutzlos und sogar unbrauchbar, da wir die Historie für jedes Handelsereignis verarbeiten müssen.
Es ist sinnvoll, sich über die Auslösung von SL/TP in OnTradeTransaction() zu informieren, da man hier nach Ereignistyp filtern kann. In diesem Fall habe ich den Ereignistyp als "Zur Historie hinzufügen", den Handelstyp als "Beenden" und dann einen Deadlock definiert.
Ich habe es ausprobiert. OnTrade() ist in diesem Fall nutzlos, ja sogar nachteilig, da es die Historie bei jedem Handelsereignis verarbeiten muss.
Es ging um OnTrade*.
bool FirstRun = true;
void OnTick()
{
if (FirstRun)
{
const double Price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
FirstRun = (OrderSend(_Symbol, OP_BUY, 1, Price, 0, 0, Price + 10 * _Point) <= 0);
}
}
void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest &Request, const MqlTradeResult &Result )
{
if (!FirstRun)
Print(ToString(Trans) + ToString(Request) + ToString(Result));
}
#define TOSTRING(A) #A + " = " + (string)(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString(A) + "\n"
string ToString( const MqlTradeTransaction &Trans )
{
return(TOSTRING(Trans.deal) + TOSTRING(Trans.order) + TOSTRING(Trans.symbol) +
TOSTRING2(Trans.type) + TOSTRING2(Trans.order_type) + TOSTRING2(Trans.order_state) +
TOSTRING2(Trans.deal_type) + TOSTRING2(Trans.time_type) +
TOSTRING(Trans.time_expiration) + TOSTRING(Trans.price) + TOSTRING(Trans.price_trigger) +
TOSTRING(Trans.price_sl) + TOSTRING(Trans.price_tp) + TOSTRING(Trans.volume) +
TOSTRING(Trans.position) + TOSTRING(Trans.position_by));
}
string ToString( const MqlTradeRequest &Request )
{
return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) +
TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) + TOSTRING(Request.tp) +
TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
TOSTRING(Request.position) + TOSTRING(Request.position_by));
}
string ToString( const MqlTradeResult &Result )
{
return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +
TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +
TOSTRING(Result.retcode_external));
}
2016.11.23 23:59:57 deal #3 sell 1.00 EURUSD at 1.06245 done (based on order #3)
2016.11.23 23:59:57 deal performed [#3 sell 1.00 EURUSD at 1.06245]
2016.11.23 23:59:57 order performed sell 1.00 at 1.06245 [#3 sell 1.00 EURUSD at 1.06245]
2016.11.23 23:59:57 Trans.deal = 3
2016.11.23 23:59:57 Trans.order = 3
2016.11.23 23:59:57 Trans.type = TRADE_TRANSACTION_DEAL_ADD
2016.11.23 23:59:57 Trans.order_type = ORDER_TYPE_BUY
2016.11.23 23:59:57 Trans.order_state = ORDER_STATE_STARTED
2016.11.23 23:59:57 Trans.deal_type = DEAL_TYPE_SELL
2016.11.23 23:59:57 Trans.time_type = ORDER_TIME_GTC
2016.11.23 23:59:57 Trans.time_expiration = 1970.01.01 00:00:00
2016.11.23 23:59:57 Trans.price = 1.06245
2016.11.23 23:59:57 Trans.price_trigger = 0.0
2016.11.23 23:59:57 Trans.price_sl = 0.0
2016.11.23 23:59:57 Trans.volume = 1.0
2016.11.23 23:59:57 Trans.position = 2
2016.11.23 23:59:57 Trans.position_by = 0
2016.11.23 23:59:57 Request.action = ENUM_TRADE_REQUEST_ACTIONS::0
2016.11.23 23:59:57 Request.magic = 0
2016.11.23 23:59:57 Request.order = 0
2016.11.23 23:59:57 Request.symbol =
2016.11.23 23:59:57 Request.volume = 0.0
2016.11.23 23:59:57 Request.price = 0.0
2016.11.23 23:59:57 Request.sl = 0.0
2016.11.23 23:59:57 Request.tp = 0.0
2016.11.23 23:59:57 Request.deviation = 0
2016.11.23 23:59:57 Request.type = ORDER_TYPE_BUY
2016.11.23 23:59:57 Request.type_filling = ORDER_FILLING_FOK
2016.11.23 23:59:57 Request.type_time = ORDER_TIME_GTC
2016.11.23 23:59:57 Request.expiration = 1970.01.01 00:00:00
2016.11.23 23:59:57 Request.comment =
2016.11.23 23:59:57 Request.position = 0
2016.11.23 23:59:57 Result.retcode = 0
2016.11.23 23:59:57 Result.deal = 0
2016.11.23 23:59:57 Result.order = 0
2016.11.23 23:59:57 Result.volume = 0.0
2016.11.23 23:59:57 Result.price = 0.0
2016.11.23 23:59:57 Result.bid = 0.0
2016.11.23 23:59:57 Result.ask = 0.0
2016.11.23 23:59:57 Result.comment =
2016.11.23 23:59:57 Result.request_id = 0
2016.11.23 23:59:57
2016.11.23 23:59:57 Trans.deal = 0
2016.11.23 23:59:57 Trans.order = 3
2016.11.23 23:59:57 Trans.symbol = EURUSD
2016.11.23 23:59:57 Trans.type = TRADE_TRANSACTION_ORDER_DELETE
2016.11.23 23:59:57 Trans.order_type = ORDER_TYPE_SELL
2016.11.23 23:59:57 Trans.order_state = ORDER_STATE_FILLED
2016.11.23 23:59:57 Trans.deal_type = DEAL_TYPE_BUY
2016.11.23 23:59:57 Trans.time_type = ORDER_TIME_GTC
2016.11.23 23:59:57 Trans.price = 1.06245
2016.11.23 23:59:57 Trans.price_trigger = 0.0
2016.11.23 23:59:57 Trans.price_sl = 0.0
2016.11.23 23:59:57 Trans.price_tp = 0.0
2016.11.23 23:59:57 Trans.volume = 1.0
2016.11.23 23:59:57 Trans.position = 2
2016.11.23 23:59:57 Trans.position_by = 0
2016.11.23 23:59:57 Request.action = ENUM_TRADE_REQUEST_ACTIONS::0
2016.11.23 23:59:57 Request.magic = 0
2016.11.23 23:59:57 Request.symbol =
2016.11.23 23:59:57 Request.volume = 0.0
2016.11.23 23:59:57 Request.price = 0.0
2016.11.23 23:59:57 Request.stoplimit = 0.0
2016.11.23 23:59:57 Request.sl = 0.0
2016.11.23 23:59:57 Request.tp = 0.0
2016.11.23 23:59:57 Request.deviation = 0
2016.11.23 23:59:57 Request.type = ORDER_TYPE_BUY
2016.11.23 23:59:57 Request.type_filling = ORDER_FILLING_FOK
2016.11.23 23:59:57 Request.expiration = 1970.01.01 00:00:00
2016.11.23 23:59:57 Request.comment =
2016.11.23 23:59:57 Request.position = 0
2016.11.23 23:59:57 Request.position_by = 0
2016.11.23 23:59:57 Result.retcode = 0
2016.11.23 23:59:57 Result.deal = 0
2016.11.23 23:59:57 Result.order = 0
2016.11.23 23:59:57 Result.volume = 0.0
2016.11.23 23:59:57 Result.price = 0.0
2016.11.23 23:59:57 Result.ask = 0.0
2016.11.23 23:59:57 Result.comment =
2016.11.23 23:59:57 Result.request_id = 0
2016.11.23 23:59:57 Result.retcode_external = 0
2016.11.23 23:59:57
2016.11.23 23:59:57 Trans.deal = 0
2016.11.23 23:59:57 Trans.order = 3
2016.11.23 23:59:57 Trans.symbol = EURUSD
2016.11.23 23:59:57 Trans.type = TRADE_TRANSACTION_HISTORY_ADD
2016.11.23 23:59:57 Trans.order_state = ORDER_STATE_FILLED
2016.11.23 23:59:57 Trans.deal_type = DEAL_TYPE_BUY
2016.11.23 23:59:57 Trans.time_type = ORDER_TIME_GTC
2016.11.23 23:59:57 Trans.time_expiration = 1970.01.01 00:00:00
2016.11.23 23:59:57 Trans.price = 1.06245
2016.11.23 23:59:57 Trans.price_trigger = 0.0
2016.11.23 23:59:57 Trans.price_sl = 0.0
2016.11.23 23:59:57 Trans.price_tp = 0.0
2016.11.23 23:59:57 Trans.volume = 0.0
2016.11.23 23:59:57 Trans.position_by = 0
2016.11.23 23:59:57 Request.action = ENUM_TRADE_REQUEST_ACTIONS::0
2016.11.23 23:59:57 Request.magic = 0
2016.11.23 23:59:57 Request.order = 0
2016.11.23 23:59:57 Request.symbol =
2016.11.23 23:59:57 Request.volume = 0.0
2016.11.23 23:59:57 Request.price = 0.0
2016.11.23 23:59:57 Request.stoplimit = 0.0
2016.11.23 23:59:57 Request.sl = 0.0
2016.11.23 23:59:57 Request.deviation = 0
2016.11.23 23:59:57 Request.type = ORDER_TYPE_BUY
2016.11.23 23:59:57 Request.type_filling = ORDER_FILLING_FOK
2016.11.23 23:59:57 Request.type_time = ORDER_TIME_GTC
2016.11.23 23:59:57 Request.expiration = 1970.01.01 00:00:00
2016.11.23 23:59:57 Request.comment =
2016.11.23 23:59:57 Request.position = 0
2016.11.23 23:59:57 Request.position_by = 0
2016.11.23 23:59:57 Result.retcode = 0
2016.11.23 23:59:57 Result.order = 0
2016.11.23 23:59:57 Result.volume = 0.0
2016.11.23 23:59:57 Result.price = 0.0
2016.11.23 23:59:57 Result.bid = 0.0
2016.11.23 23:59:57 Result.ask = 0.0
2016.11.23 23:59:57 Result.comment =
2016.11.23 23:59:57 Result.request_id = 0
2016.11.23 23:59:57 Result.retcode_external = 0
fxsaber:
Das Ergebnis des Testers
Ja, aber was dann?
Wo ist angegeben, dass SL/TP ausgelöst wird? - Das ist die Schwierigkeit))
Schließen einer Position zu erfahren.
Das ist das Problem. Aber MT5 bekommt diese Informationen irgendwie, wenn man das Protokoll und die Zeichnung der geschlossenen Positionen betrachtet.
Funktioniert das nicht mehr so?
Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests
Woher weiß ich, ob Take Profit oder Stop Loss ausgelöst wurden?
Stanislav Korotky, 2014.10.16 12:06
Ich habe mit SL/TP der Position (Order) überprüft, dass der Schlusskurs besser oder gleich TP und schlechter oder gleich SL ist.Funktioniert das nicht mehr?
Kann ich den Code haben?
...ja ja, kann ich Mashka am Schenkel haben, sorry... Zeigen Sie mir den Code, bitte.
Funktioniert das nicht mehr so?