Bonjour Nicolas, j’ai un algo sur le Dax H1 qui commence à donner des résultats corrects. Je ne comprends pas pourquoi dans 2 positions à l’achat (sur 177 positions sur une période de 10K) les critères de sortie ne sont pas respectés par l’algo alors que dans l’ensemble çà se passe bien : le backtest me donne 55% de réussite avec un taux de conversion de 1,99 . Mais ces 2 positions m’apportent 2 pertes impressionnantes incompréhensibles , car les critères de sortie sont d’après le graphique respectés. Pourriez-vous m’apporter votre expertise sur ce pb ? si oui comment dois-je procéder ?
Cdlmt, JP
Bonjour, pas de soucis pour t’aider à comprendre ces événements avec ta stratégie.
2 possibilités :
- poster le code ici et nous indiquer les détails des 2 positions problématiques afin de reproduire et de résoudre
- me contacter pour une assistance privée (et payante) via le formulaire dédié du site: https://www.prorealcode.com/trading-programming-services/
Ok merci, je considère pas mon projet comme ultra secret !!!! donc je joins le code dans son état sachant qu’il aura sans doute besoin de qq améliorations.
La période de backtest est sur 10K en H1. Les 2 positions évoquées sont (en remontant le temps) :
1 – entrée 23/7/2020 10h00 sortie 4/8/2020 soit 190 B !!sans sortie et une perte de 633€
2 -entrée 3/5/2019 13h00 sortie 15/5/2019 10h avec une perte de 448€
J’ai essayé de positionner un stploss à 400€ mais là aussi je ne comprends pas il n’set pas pris en compte ???
// DJ- par JP en H1 nouvelle version v2 dernière modif 6/6/2022
// version provisoire en achat uniquement
//
DEFPARAM CumulateOrders = false // Cumul des positions activé
DEFPARAM Preloadbars = 8000
AchatOK=1
//VenteOK=0
nA=1
//nV=1
// *** periode time ***********
CtimeA= time>081000 and time<190000 // 8h10 19h00
// *** filtre Moy Mob
M200 = Average[173](open) // 173
T200B=M200<M200[6]
T200H=M200>M200[3]
M100=average[115](close)
T100H=M100>M100[3]
MH50=HullAverage[55](close) // v1 55
TH50H=MH50>MH50[1] // dmmh50H=1
TH50B=MH50<MH50[1] // =2
M8=Average[6](open) // v1 6
if MPmoy CROSSES OVER MH50 then
ca1=1
cv1=0
endif
if MPmoy CROSSES UNDER MH50 then
cv1=1
ca1=0
endif
// *** filtre Parabolic SAR ***
Indsar=SAR[0.02,0.021,0.20]
csarv=close<Indsar
csara=close>Indsar
// *** filtre MACD ****
C = 12
L = 26
MMC = exponentialAverage[C](close) //
MML = exponentialAverage[L](close)
MACDligne = MMC - MML
ligne = exponentialAverage[9](MACDligne)
MACDHisto = MACDligne - ligne
cmacdA=MACDHisto>MacdHisto[9] // v1 9
// *** filtre amplitude ****
campl=abs(close-open)>4
// Poids moyen
Poids=(close-open)/2+open
MPmoy=average[3](Poids)
MPmoy1=MPmoy[1]
// *** filtre rsi ***
IndrsiA = RSI[12](close) // v1 12
crsiA = IndrsiA >= 63 and IndrsiA<76 // v1 s1 63
// *** sortie de Achats ********************
// Conditions pour fermer une position acheteuse
if longonmarket then
c1stpA= close < M8
c2stpA = close < MPmoy
c3stpa=MPmoy<MPmoy1
c6stpa=close<open[2]// =2
IF cv1 and csarv then
if c1stpA AND c2stpA and c3stpa and c6stpa THEN //
STPA=1
ENDIF
endif
IF STPA then
SELL AT MARKET
STPA=0
ENDIF
endif
// *********** ACHATS ********************
IF not longonmarket and CtimeA THEN
// Conditions pour ouvrir une position acheteuse
if AchatOK then
ca2 = close > MH50
ca4 = MH50 > MH50[1] // v1 1
ca6 = (close > open)
IF T200H AND T100H AND ca2 AND ca4 and ca6 and csara and csara[1] AND cmacdA AND crsiA AND campl THEN
BUY nA CONTRACT AT MARKET
ENDIF
endif
ENDIF
au passage dans les résultats du backtest à quoi correspondent les valeurs MFE et MAE ?
Merci pour ton aide,
Cdlmt, JP
Ces 2 ordres, pourquoi, selon toi, auraient ils dut être sortis ? Suite à une condition du code ?
Si oui, pourquoi ne pas GRAPH ces conditions et les vérifier une à une ?
Bonjour Nicolas et merci pour ce 1er retour. J’ai effectivement transformé chq condition en indicateur et bien vu sur les positions la coïncidence effective qui aurait dû déclencher un stop.
Mais déjà mes excuses pour les infos de contexte, les positions évoquées sont obtenues sur une période de 30k et pas 10k comme je l’avais mentionné.
Je peux te donner les valeurs des différents paramètres sur la zone où normalement le stop doit être activé, mais celà ne va-t-il pas alourdir le forum ??
Qu’appelles-tu Graph ? à introduire dans l’algo ?
Bonjour,
Doc du site pour instruction graph: https://www.prorealcode.com/documentation/graph/
A mettre en fin de stratégie, pour afficher le comportement des variables, très utile pour débugguer son code.
Voir aussi graphonprice si besoin: https://www.prorealcode.com/documentation/graphonprice/
merci à Bywan, je vais consulter çà et essayer.
Cdlmt, JP
Bonjour à tous,
j’ai fait le test avec graph (ci-joint le scan des résultats. Sur les 6 variables qui déclenchent le stop c’est “cv1” (en rouge dans graph) qui ne fonctionne pas.
cv1 est un flip flop généré par le passage au-dessus ou en-dessous de la moyenne MPmoy (poids moyen de la bougie ) en noir sur le graphique par rapport à la moyenne Hull à 55 en marron.
On constate que la bascule ne se fait pas systématiquement. Cette bascule est génére par les instructions crosses over et crosses under .
Je pense que le pb vient de ces 2 instructions, qu’en pensez vous ??
Maintenant il faut vérifier si ces calculs de MM sont les mêmes dans ton code backtest et celles de tes indicateurs, tu peux GRAPHer sur le prix pour comparer:
GRAPHONPRICE MPmoy
GRAPHONPRICE MH50
ok, c’est fait: à part quelques petits écarts minimes les courbes se superposent parfaitement, donc les calculs se déroulent de la même façon dans l’algo et sur le graphique…
J’ai vraiment des doutes sur l’exécution des ordres “crosses” , je vais faire des tests sur un algo bidon .
Par contre j’ai pas la réponse sur la non prise en compte du stoploss : pour essayer d’écrêter les plus grosses pertes j’ai tenté un stploss à x€ (x étant mis en variable pour optimisation). A aucun moment le stpl est déclenché , même pour des valeurs de stpl> aux 2 closes évoqués , j’avoue ne pas très bien comprendre.
Dans ton code tu calcules MPmoy après le test de croisement, donc ce test de croisement utilise la valeur du calcul/bougie précédente. Pour mémoire, le code est lu de haut en bas.
Pour le stoploss en monnaie, il faut faire un
set stop $loss 400
Bon Nicola j’ai trouvé l’erreur du stploss, avec mes excuses : çà marche , donc je protège bien contre les trades perdants bizarres pour lesquels je ne vois toujours pas la cause ! je fais les tests et je t’en reparle.
Cdlmt,JP
Ah yes , j’ai modifié l’emplacement du calcul, çà change complètement les performances de l’algo !!! (en moins bien malheureusement !) .
J’ai essayé dans le test crosses de remplacer MPmoy par Mpmoy[1], logiquement j’aurai dû retrouver les résultats antérieurs puisque les autres tests sont faits après le calcul de MPmoy.
Rien à faire l’algo ne revient pas à ses résultats 🙁 . J’ai qd même du mal à comprendre l’impact constaté par le seul fait de prendre dans un test la valeur[1] d’une variable
surtout en constatant les faibles écarts entre les 2 bougies… J’ai dû inventer un super algo en faisant une erreur de pgm 🙂 !!!
Mais ce n’est pas la 1ère fois que j’ai constaté les conséquences en performance lorsqu’on modifie l’emplacement du calcul des variables, même quand il n’y a pas d’inversion dans l’ordre des calculs.