Bonsoir,
Je voulais écrire un code pour acheter en 3 fois (iso montant) à un signal donné (croisement sto par ex) et sortir lorsque le pnl du trade est >0 i.e. lorsque le PRU est > prix de revient. Malgré la condition de sortie, certains backtestings me donnent des trades négatifs ! Certes il y a les frais de courtage mais jergardez sur JLL, il y a autre chose. Sauriez-vous éclairer mes lanternes SVP ? (ex Valsoia ou JLL)
DEFPARAM CumulateOrders = True
capital = 10000 + strategyprofit
nbpozouverte=0
pru=0
quantite=0
IF NOT ONMARKET AND STOCHASTIC[14, 3](close) CROSSES OVER AVERAGE[5](STOCHASTIC[14, 3](close)) AND STOCHASTIC[14, 3](close)<20 THEN
BUY ROUND(capital/3) CASH ROUNDEDDOWN at market
nbpozouverte=nbpozouverte+1
pru=tradeprice
quantite=COUNTOFLONGSHARES
ENDIF
IF ONMARKET AND STOCHASTIC[14, 3](close) CROSSES OVER AVERAGE[5](STOCHASTIC[14, 3](close)) AND nbpozouverte<3 THEN
BUY ROUND(capital/3) CASH ROUNDEDDOWN at market
nbpozouverte=nbpozouverte+1
pru=(pru*quantite+tradeprice*(COUNTOFLONGSHARES-quantite))/(COUNTOFLONGSHARES)
quantite=COUNTOFLONGSHARES
ENDIF
If (Open-PositionPrice)*COUNTOFLONGSHARES>0 THEN
SELL AT MARKET
nbpozouverte=0
quantite=0
pru=0
ENDIF
D’avance merci
JF
Bonsoir, Je voulais écrire un code pour acheter en 3 fois (iso montant) à un signal donné (croisement sto par ex) et sortir lorsque le pnl du trade est >0 i.e. lorsque le cours est > prix de revient (PRU). Malgré la condition de sortie, certains backtestings me donnent des trades négatifs ! Certes il y a les frais de courtage mais regardez sur JLL, il y a autre chose. Sauriez-vous éclairer mes lanternes SVP ? (ex Valsoia ou JLL)
Le code ne semble pas être complet ?
Positionprice retourne le prix d’ouverture moyen de l’ensemble des positions ouvertes, je pense qu’à la ligne 22, il n’est pas utile de multiplier par “countoflongshares”.
Bonjour et merci pour la réponse. J’ai bien copié tout le code mais il n’est pas garanti sans erreur ! Pour la ligne 22 c est vrai c est inutile, j’avais utilisé le countoflongshares pour obtenir le PNL en montant et le mettre > aux frais de courtage en pensant que l’erreur venait de là. Mais en réalité, dans les backtesting Valsoia ou JLL on voit que certaines pertes vont bien au dela. Bref que ce soit avec (open-positionprice)>0 ou (open-positionprice)*countoflongshares>2 j’ai le meme probleme de trade négatifs en backtesting et je ne trouve pas l’erreur dans le code…
personne d’autre n’est inspiré ? help please …
Utiliser Close à la place de Open à la ligne 22 ?
merci mais non il y a toujours 9 positions perdantes sur JLL, oh rage, oh…
je prends le code du pyramidage du probacktest et j’ajoute seuleument la condition (open>positionprice) pour la sortie et sur Valsoia, j’ai aussi un trade négatif…:
// Conditions pour ouvrir une position acheteuse
DEFPARAM CumulateOrders = True
REM Ce système entre long de 1 lorsque le RSI est inférieur à 30, si l'on n'est pas déjà en position.
IF NOT ONMARKET AND RSI[14](Close) < 30 THEN
BUY 1 SHARES AT MARKET
ENDIF
REM Si l'on a ouvert une position longue et que le cours de clôture précédent < au cours d'ouverture actuel, alors on entre long de 1 lot à chaque fois que les conditions qui précèdent sont validées, dans la limite de 3 lots au total.
IF LONGONMARKET AND Open > Close[1] AND COUNTOFPOSITION < 3 THEN
BUY 1 SHARES AT MARKET
ENDIF
REM Lorsque le prix croise à la baisse une moyenne mobile simple, toute la position est fermée.
IF Close Crosses Under Average[14](Close) and (Open>positionprice)THEN
SELL AT MARKET
ENDIF
bizarre!
On peut debugger avec l’instruction GRAPH. Si tu graph open et positionprice tu auras toutes les informations pour trouver de où provient ton problème.
Quand un truc nous echappe dans le comportement d’une stratégie, GRAPH peut nous éviter les maux de tête ! 😰
Ok avec graph sur valsoia:
// Conditions pour ouvrir une position acheteuse
DEFPARAM CumulateOrders = True
REM Ce système entre long de 1 lorsque le RSI est inférieur à 30, si l'on n'est pas déjà en position.
IF NOT ONMARKET AND RSI[14](Close) < 30 THEN
BUY 1 SHARES AT MARKET
ENDIF
REM Si l'on a ouvert une position longue et que le cours de clôture précédent < au cours d'ouverture actuel, alors on entre long de 1 lot à chaque fois que les conditions qui précèdent sont validées, dans la limite de 3 lots au total.
IF LONGONMARKET AND Open > Close[1] AND COUNTOFPOSITION < 3 THEN
BUY 1 SHARES AT MARKET
ENDIF
REM Lorsque le prix croise à la baisse une moyenne mobile simple, toute la position est fermée.
IF Close Crosses Under Average[14](Close) and (Open>positionprice)THEN
GRAPH open COLOURED(255,0,0) AS "open" //Red
GRAPH positionprice COLOURED(0,0,255) AS "poz price" //Red
SELL AT MARKET
ENDIF
la position perdante a lieu le 02 septembre 2015. quand je regarde avec graph j’ai un écart aussi bien sur le pru (positionprice) que sur l’open. Comment cela est il possible ? dans le backtest j’ai pru=(22.29+20.02)/2=21.155 contre 21.51667 sur grah et pour l’open j’ai 21.5 contre 22.2 avec graph ! qui dit mieux ?
Bonjour
Grâce à graph j’ai finalement trouvé d’où vienne les trades perdants. Dans mon premier poste j’avais:
If (Open-PositionPrice)*COUNTOFLONGSHARES>0 THEN
SELL AT MARKET
A priori impossible d’avoir des trades perdants sauf que le sell at market est réalisé à l’ouverture de la barre suivante et en cas de gap baissier ma condition basée sur l’ouverture de la barre précédente n’est plus vraie. N’est il pas possible de sortir pendant la barre du jour dès qu’une condition est atteinte car cela fausse le Backtest SVP?
Pour le moment non, puisque l’on ne teste les conditions qu’une seule fois par barre. La seule possibilité serait de placer des ordres en dur à des prix déterminés pour sortir, tel que des SET STOP LOSS ou SET TARGET, ou même des ordres conditionnels de type STOP ou LIMIT.