Détecter le déclenchement du stop dans le backtest OnTradeTransaction - page 3

 
angevoyageur:

J'ai vérifié. Lorsqu'un SL/TP est déclenché, vous avez cette transaction :

  1. TRADE_TRANSACTION_POSITION avec SL et TP réglés (mais pas encore de transaction), puis
  2. TRADE_TRANSACTION_DEAL_ADD

Lorsque je suis short - à partir d'une position vierge, j'obtiens 3 transactions :

A entrée )

20130507 21:52:28:943 entry short at 1.31060 time=2013.01.10 11:43

20130507 21:52:28:943 symbol=EURUSD price=1.3106000 volume=0.01 sl=1.3119000 tp=1.3088000 order=2 deal=2 entry-type=IN trans-type=DEAL_ADD order_type=BUY deal_type=DEAL_TYPE_SELL type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00

20130507 21:52:28:943 symbol=EURUSD price=1.3106000 volume=0.01 sl=1.3119000 tp=1.3088000 order=2 deal=0 entry-type=IN trans-type=ORDER_DELETE order_type=SELL deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00

20130507 21:52:28:943 symbol=EURUSD price=1.3106000 volume=0.00 sl=1.3119000 tp=1.3088000 order=2 deal=0 entry-type=IN trans-type=HISTORY_ADD order_type=SELL deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00

Une fois le stop loss déclenché, j'obtiens

B sortie )

20130507 21:52:28:945 symbol=EURUSD price=1.3119000 volume=0.01 sl=0.0000000 tp=0.0000000 order=3 deal=3 entry-type=IN trans-type=DEAL_ADD order_type=BUY deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00

Pas deTRADE_TRANSACTION_POSITION. Je pense que vous ne pouvez pas l'utiliser ici.

Résumé :

Un short est ouvert, la première transaction est

entry-type=IN trans-type=DEAL_ADD order_type=BUYsl=1.3119000 tp=1.3088000

Short fermé, par stop ou cible, première transaction réfléchie

entry-type=IN trans-type=DEAL_ADD order_type=BUY sl=0.0 tp=0.0

Ceci est confus. Cela devrait être :

ouvert court :

entry-type=IN trans-type=DEAL_ADD order_type=SELLsl=1.3119000 tp=1.3088000

fermer le short :

entry-type=OUT trans-type=DEAL_ADD order_type=BUY sl=0.0 tp=0.0

angevoyageur:

J'ai vérifié. Quand un SL/TP est déclenché, vous avez ces transactions :

  1. TRADE_TRANSACTION_POSITION avec SL et TP réglés (mais pas encore de transaction), puis
  2. TRADE_TRANSACTION_DEAL_ADD
 
chinaski:

Lorsque je suis à découvert - à partir d'une position vierge, j'obtiens 3 transactions :

Une entrée )

Une fois le stop loss déclenché, j'obtiens

B sortie )

Pas deTRADE_TRANSACTION_POSITION.Je pense que vous ne pouvez pas l'utiliser ici.

...

Il vous manque des transactions, je ne sais pas pourquoi. A cause du backtesting ?

 

Petite digression, au lieu de :

ORDER_TYPE_to_string(t.order_type)

vous pouvez utiliser :

EnumToString(t.order_type)


 
angevoyageur:

Petite digression, au lieu de :

vous pouvez utiliser :


Merci pour EnumToString, bien plus intelligent à utiliser.

Oui, ma préoccupation concerne la transaction dans le backtest. Mais pour qu'il soit le plus réel possible, la transaction doit être la même que dans le trading réel.

TRADE_TRANSACTION_POSITION n'est pas lié à une transaction, comme vous l'avez déjà mentionné. Je suppose qu'elle indique, par exemple, quand vous avez déplacé de l'argent sur votre compte.

 
chinaski:

...

Le problème semble être que certaines transactions ne sont pas disponibles lors du backtesting. Il s'agit d'un bug ou d'une limitation du backtesting. Lors de l'exécution d'un test à terme, j'ai une TRADE_TRANSACTION_POSITION lorsque le SL/TP est déclenché.

2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    TRADE_TRANSACTION_ORDER_ADD
2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    trans=symbol=EURUSD price=1.3170100 volume=0.01 sl=0.0000000 tp=0.0000000 order=19683612 deal=0 entry-type=IN trans-type=ORDER_ADD order_type=BUY deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00
2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    TRADE_TRANSACTION_ORDER_DELETE
2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    trans=symbol=EURUSD price=1.3170100 volume=0.01 sl=0.0000000 tp=0.0000000 order=19683612 deal=0 entry-type=IN trans-type=ORDER_DELETE order_type=BUY deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00
2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    TRADE_TRANSACTION_HISTORY_ADD
2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    trans=symbol=EURUSD price=1.3170100 volume=0.00 sl=0.0000000 tp=0.0000000 order=19683612 deal=0 entry-type=IN trans-type=HISTORY_ADD order_type=BUY deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00
2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    TRADE_TRANSACTION_POSITION
2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    trans=symbol=EURUSD price=1.3173500 volume=0.01 sl=1.3174200 tp=1.3170100 order=0 deal=0 entry-type=IN trans-type=POSITION order_type=BUY deal_type=DEAL_TYPE_SELL type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00
2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    TRADE_TRANSACTION_DEAL_ADD
2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    trans=symbol=EURUSD price=1.3170100 volume=0.01 sl=0.0000000 tp=0.0000000 order=19683612 deal=16655372 entry-type=OUT trans-type=DEAL_ADD order_type=BUY deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.34

Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.
 
angevoyageur:

Le problème semble être que certaines transactions ne sont pas disponibles lors du backtesting. Il s'agit d'un bug ou d'une limitation du backtesting. Lors de l'exécution d'un test à terme, j'ai une TRADE_TRANSACTION_POSITION lorsque le SL/TP est déclenché.

2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    TRADE_TRANSACTION_ORDER_ADD
2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    trans=symbol=EURUSD price=1.3170100 volume=0.01 sl=0.0000000 tp=0.0000000 order=19683612 deal=0 entry-type=IN trans-type=ORDER_ADD order_type=BUY deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00
2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    TRADE_TRANSACTION_ORDER_DELETE
2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    trans=symbol=EURUSD price=1.3170100 volume=0.01 sl=0.0000000 tp=0.0000000 order=19683612 deal=0 entry-type=IN trans-type=ORDER_DELETE order_type=BUY deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00
2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    TRADE_TRANSACTION_HISTORY_ADD
2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    trans=symbol=EURUSD price=1.3170100 volume=0.00 sl=0.0000000 tp=0.0000000 order=19683612 deal=0 entry-type=IN trans-type=HISTORY_ADD order_type=BUY deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00
2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    TRADE_TRANSACTION_POSITION
2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    trans=symbol=EURUSD price=1.3173500 volume=0.01 sl=1.3174200 tp=1.3170100 order=0 deal=0 entry-type=IN trans-type=POSITION order_type=BUY deal_type=DEAL_TYPE_SELL type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00
2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    TRADE_TRANSACTION_DEAL_ADD
2013.05.08 19:20:29    tc_ea_trans (EURUSD,M1)    trans=symbol=EURUSD price=1.3170100 volume=0.01 sl=0.0000000 tp=0.0000000 order=19683612 deal=16655372 entry-type=OUT trans-type=DEAL_ADD order_type=BUY deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.34

OK, merci pour cette information. Je sais donc que je dois l'inclure dans ma réflexion.
 

Bonjour angevoyageur,

J'ai toujours le problème d'obtenir le prix exécuté d'un stop ou d'une perte attaché à une position - en backtest. Je ne sais pas jusqu'à présent, comment il se comporte dans des conditions réelles.

Ceci est tiré du journal de backtest :

KP      0       23:18:29        Core 1  2010.05.11 11:00:00   instant buy 0.01 EURUSD at 1.26882 (1.26871 / 1.26882 / 1.26871)
EM      0       23:18:29        Core 1  2010.05.11 11:00:00   deal #2  buy 0.01 EURUSD at 1.26882 done (based on order #2)
 MG      0       23:18:29        Core 1  2010.05.11 11:00:00   deal performed [#2  buy 0.01 EURUSD at 1.26882]
RI      0       23:18:29        Core 1  2010.05.11 11:00:00   order performed buy 0.01 at 1.26882 [#2  buy 0.01 EURUSD at 1.26882]
JS      0       23:18:29        Core 1  2010.05.11 11:00:00   CTrade::OrderSend: instant buy 0.01 EURUSD at 1.26882 [done at 1.26882]
LP      0       23:18:29        Core 1  2010.05.11 11:00:00   position modified [buy 0.01 EURUSD 1.26882 sl: 1.26809 tp: 1.27028]
LM      0       23:18:29        Core 1  2010.05.11 11:00:00   CTrade::OrderSend: modify EURUSD (sl: 1.26809, tp: 1.27028) [done]
LR      0       23:18:29        Core 1  2010.05.11 11:00:00   trans=symbol=EURUSD price=1.2688200 volume=0.01 sl=0.0000000 tp=0.0000000 order=2 deal=2 entry-type=IN trans-type=DEAL_ADD order_type=BUY deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00 order-open=0.000000 order-current=0.000000 deal-price=0.000000
GG      0       23:18:29        Core 1  2010.05.11 11:18:40   take profit triggered buy 0.01 EURUSD 1.26882 sl: 1.26809 tp: 1.27028 [#3  sell 0.01 EURUSD at 1.27028]
MD      0       23:18:29        Core 1  2010.05.11 11:18:40   deal #3  sell 0.01 EURUSD at 1.27028 done (based on order #3)
 PI      0       23:18:29        Core 1  2010.05.11 11:18:40   deal performed [#3  sell 0.01 EURUSD at 1.27028]
NO      0       23:18:29        Core 1  2010.05.11 11:18:40   order performed sell 0.01 at 1.27028 [#3  sell 0.01 EURUSD at 1.27028]
RS      0       23:18:29        Core 1  2010.05.11 11:18:40   trans=symbol=EURUSD price=1.2702800 volume=0.01 sl=0.0000000 tp=0.0000000 order=3 deal=3 entry-type=IN trans-type=DEAL_ADD order_type=BUY deal_type=DEAL_TYPE_SELL type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00 order-open=0.000000 order-current=0.000000 deal-price=0.000000
JM      0       23:18:29        Core 1  2010.05.20 09:00:00   ut =3.00 candle=o=1.24130 c=1.24170 h=1.24360 l=1.24100 b=39 uw=190 lw=29
FK      0       23:18:29        Core 1  2010.05.20 09:00:00   instant sell 0.01 EURUSD at 1.24180 (1.24180 / 1.24195 / 1.24180)
MG      0       23:18:29        Core 1  2010.05.20 09:00:00   deal #4  sell 0.01 EURUSD at 1.24180 done (based on order #4)
 IG      0       23:18:29        Core 1  2010.05.20 09:00:00   deal performed [#4  sell 0.01 EURUSD at 1.24180]
CN      0       23:18:29        Core 1  2010.05.20 09:00:00   order performed sell 0.01 at 1.24180 [#4  sell 0.01 EURUSD at 1.24180]
EO      0       23:18:29        Core 1  2010.05.20 09:00:00   CTrade::OrderSend: instant sell 0.01 EURUSD at 1.24180 [done at 1.24180]
EQ      0       23:18:29        Core 1  2010.05.20 09:00:00   position modified [sell 0.01 EURUSD 1.24180 sl: 1.24253 tp: 1.24034]
DO      0       23:18:29        Core 1  2010.05.20 09:00:00   CTrade::OrderSend: modify EURUSD (sl: 1.24253, tp: 1.24034) [done]
HI      0       23:18:29        Core 1  2010.05.20 09:00:00   trans=symbol=EURUSD price=1.2418000 volume=0.01 sl=0.0000000 tp=0.0000000 order=4 deal=4 entry-type=IN trans-type=DEAL_ADD order_type=BUY deal_type=DEAL_TYPE_SELL type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00 order-open=0.000000 order-current=0.000000 deal-price=0.000000
JH      0       23:18:29        Core 1  2010.05.20 09:00:40   stop loss triggered sell 0.01 EURUSD 1.24180 sl: 1.24253 tp: 1.24034 [#5  buy 0.01 EURUSD at 1.24253]
HI      0       23:18:29        Core 1  2010.05.20 09:00:40   deal #5  buy 0.01 EURUSD at 1.24253 done (based on order #5)
 MK      0       23:18:29        Core 1  2010.05.20 09:00:40   deal performed [#5  buy 0.01 EURUSD at 1.24253]
NL      0       23:18:29        Core 1  2010.05.20 09:00:40   order performed buy 0.01 at 1.24253 [#5  buy 0.01 EURUSD at 1.24253]
KQ      0       23:18:29        Core 1  2010.05.20 09:00:40   trans=symbol=EURUSD price=1.2425300 volume=0.01 sl=0.0000000 tp=0.0000000 order=5 deal=5 entry-type=IN trans-type=DEAL_ADD order_type=BUY deal_type=DEAL_TYPE_BUY type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00 order-open=0.000000 order-current=0.000000 deal-price=0.000000
PJ      0       23:18:30        Core 1  2010.08.26 09:08:00   ut =3.83 candle=o=1.27238 c=1.27274 h=1.27448 l=1.27238 b=35 uw=174 lw=0
IH      0       23:18:30        Core 1  2010.08.26 09:08:00   instant sell 0.01 EURUSD at 1.27276 (1.27276 / 1.27287 / 1.27276)
GH      0       23:18:30        Core 1  2010.08.26 09:08:00   deal #6  sell 0.01 EURUSD at 1.27276 done (based on order #6)
 MR      0       23:18:30        Core 1  2010.08.26 09:08:00   deal performed [#6  sell 0.01 EURUSD at 1.27276]
HR      0       23:18:30        Core 1  2010.08.26 09:08:00   order performed sell 0.01 at 1.27276 [#6  sell 0.01 EURUSD at 1.27276]
PR      0       23:18:30        Core 1  2010.08.26 09:08:00   CTrade::OrderSend: instant sell 0.01 EURUSD at 1.27276 [done at 1.27276]
FE      0       23:18:30        Core 1  2010.08.26 09:08:00   position modified [sell 0.01 EURUSD 1.27276 sl: 1.27349 tp: 1.27130]
LK      0       23:18:30        Core 1  2010.08.26 09:08:00   CTrade::OrderSend: modify EURUSD (sl: 1.27349, tp: 1.27130) [done]
NE      0       23:18:30        Core 1  2010.08.26 09:08:00   trans=symbol=EURUSD price=1.2727600 volume=0.01 sl=0.0000000 tp=0.0000000 order=6 deal=6 entry-type=IN trans-type=DEAL_ADD order_type=BUY deal_type=DEAL_TYPE_SELL type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00 order-open=0.000000 order-current=0.000000 deal-price=0.000000
HM      0       23:18:30        Core 1  2010.08.26 09:08:40   stop loss triggered sell 0.01 EURUSD 1.27276 sl: 1.27349 tp: 1.27130 [#7  buy 0.01 EURUSD at 1.27349]

Comme vous pouvez le voir dans la dernière ligne, le prix exécuté est indiqué dans le journal -> [#7 buy 0.01 EURUSD at 1.27349].

Mais aucune structure, transaction, opération ou historique d'ordre ne fournit ce prix.

Cette ligne vide la transaction liée au stop déclenché :

NE      0       23:18:30        Core 1  2010.08.26 09:08:00   trans=symbol=EURUSD price=1.2727600 volume=0.01 sl=0.0000000 tp=0.0000000 order=6 deal=6 entry-type=IN trans-type=DEAL_ADD order_type=BUY deal_type=DEAL_TYPE_SELL type_time=0 expiration=1970.01.01 00:00 price_trigger=0.0000000 profit=0.00 order-open=0.000000 order-current=0.000000 deal-price=0.000000

Voici le code de la fonction de dump :

string dump_MqlTradeTransaction(const MqlTradeTransaction& t)
{
    //CDealInfo deal;
    //deal.Ticket(t.deal);
   if(t.deal > 0)
      HistoryDealSelect(t.deal);
   string msg=StringFormat("symbol=%s price=%.7f volume=%.2f sl=%.7f tp=%.7f order=%d deal=%d entry-type=%s trans-type=%s order_type=%s deal_type=%s type_time=%d expiration=%s price_trigger=%.7f profit=%.2f order-open=%.6f order-current=%.6f deal-price=%.6f"
                           
                           ,t.symbol
                           ,t.price
                           ,t.volume                           
                           ,t.price_sl
                           ,t.price_tp
                           ,t.order
                           ,t.deal           
                                                   ,tc_DEAL_ENTRY_to_string_short((ENUM_DEAL_ENTRY)HistoryDealGetInteger(t.deal,DEAL_ENTRY))                                          
                           ,tc_ENUM_TRADE_TRANSACTION_TYPE_to_string_short((ENUM_TRADE_TRANSACTION_TYPE) t.type)
                           ,tc_ORDER_TYPE_to_string(t.order_type)
                           ,tc_DEAL_TYPE_to_string(t.deal_type)
                           ,t.time_type
                           ,TimeToString(t.time_expiration)                           
                           ,t.price_trigger
                           ,HistoryDealGetDouble(t.deal,DEAL_PROFIT)
                                                        ,HistoryOrderGetDouble(t.order,ORDER_PRICE_OPEN)
                                                        ,HistoryOrderGetDouble(t.order,ORDER_PRICE_CURRENT)
                                                        ,HistoryDealGetDouble(t.deal,DEAL_PRICE)
                           );
                        
    return msg;
}

J'ai donc essayé d'obtenir le prix d'exécution à partir de l'historique des ordres et des transactions : aucun résultat.

 
chinaski:

Bonjour angevoyageur,

...
Merci, je vais aller étudier cela dès que possible.
 
angevoyageur:
Merci, je vais aller étudier cela dès que possible.

C'est vraiment bien. Ne vous pressez pas.

J'ai vérifié chaque transaction, requête et résultat transmis à OnTradeTransaction.

Le prix du stop loss déclenché mentionné dans le log du backtest (créé par MetaTrader) est introuvable sauf en tant que sl price, mais pas en tant que price ou deal price ou execution price.

Documentation on MQL5: Standard Constants, Enumerations and Structures / Trade Constants / Deal Properties
Documentation on MQL5: Standard Constants, Enumerations and Structures / Trade Constants / Deal Properties
  • www.mql5.com
Standard Constants, Enumerations and Structures / Trade Constants / Deal Properties - Documentation on MQL5
 
chinaski:

C'est vraiment bien. Ne vous pressez pas.

J'ai vérifié chaque transaction, requête et résultat transmis à OnTradeTransaction.

Le prix de déclenchement du stop loss mentionné dans le journal de backtest (créé par MetaTrader) est introuvable sauf en tant que prix sl, mais pas en tant que prix ou prix de transaction ou prix d'exécution.

Il ne s'agit donc que de backtesting. J'ai testé avec mon propre code et j'ai obtenu 3 transactions lorsqu'un stop est déclenché :

2013.05.15 10:22:27    Core 1    2013.05.10 16:20:37   Symbol : EURUSD  event : TRADE_TRANSACTION_DEAL_ADD(6)
2013.05.15 10:22:27    Core 1    2013.05.10 16:20:37   Symbol : EURUSD  event : TRADE_TRANSACTION_ORDER_DELETE(2)
2013.05.15 10:22:27    Core 1    2013.05.10 16:20:37   Symbol : EURUSD  event : TRADE_TRANSACTION_HISTORY_ADD(3)

Avec le DEAL_ADD j'obtiens le prix de la transaction, donc le SL dans mon cas. Tout me semble correct. Je vous suggère de m'envoyer le code que vous utilisez, le journal du backtest (sous forme de fichier) et une capture d'écran des paramètres du testeur de stratégie. Je pourrai alors reproduire exactement le même test que le vôtre et analyser le résultat. Vous pouvez m'envoyer un MP si vous préférez.
Raison: