Bonjour à toutes et à tous,
J’aurais besoin de votre aide pour résoudre un problème lié au calcul de la taille de la position.
Effectivement, j’aimerais que dans mon backtest le calcul de taille se fasse automatiquement en fonction du montant du portefeuille, du % de risque par trade, du niveau d’entrée et du niveau de stop de protection.
Pour illustrer ça voici un exemple :
- Montant du portefeuille 1000€
- % risque par trade : 2% (perte max 20€ par trade)
- Stop de protection : le plus bas sur x période – 1*atr
- Stop loss en point : abs(niveau d’entrée – top de protection)
- Taille de la position : (20€/Stop loss en point/PointValue)*pipsize
Le problème : lorsque je lance le backtest, aucun trade n’est pris sur sur l’ensemble de l’historique et cela peut importe le montant du portefeuille que je renseigne.
En pièce jointe le résultat du backtest. Je ne sais pas d’où peut venir le problème. J’ai développé l’indicateur de la stratégie que me donne bien les signaux d’achat, donc les conditions d’achat sont valides. Peut-être de la manière dont je calcule la taille de la position ?
Le problème persiste également lorsque j’entre une quantité spécifique : 0.01, 0.1, 0.5, etc.
Pour réaliser la partie de calcul taille de position je me suis basé sur ces ressources :
https://www.prorealcode.com/topic/money-management-how-to-get-the-available-capital-from-the-broker/
https://www.prorealcode.com/blog/learning/money-management-prorealtime-code/
DEFPARAM CumulateOrders = False // Ne pas cumuler les ordres
DEFPARAM NoCashUpdate = False
DEFPARAM MaxOrder = 500
once startCapital = 1000
// Calcul des indicateurs EMA et CCI
ema = ExponentialAverage[emaPeriod](Close)
fastCCI = CCI[fastCCIperiod](Close)
interCCI = CCI[interCCIperiod](Close)
slowCCI = CCI[slowCCIperiod](Close)
atrValue = AverageTrueRange[atrLength](Typicalprice)
// ************************************************* BUY ************************************************* //
// Conditions d'achat
buyCond1 = (Close > ema) AND (fastCCI > 0) AND (interCCI > 0) AND (slowCCI crosses over 0)
buyCond2 = (Close > ema) AND (slowCCI > 0) AND ((fastCCI crosses over 0) OR (interCCI crosses over 0))
buyCond = buyCond1 OR buyCond2
// Calcul du stop-loss
capital = startCapital + STRATEGYPROFIT // La valeur de mon portefeuille
longStop = Lowest[BarLookback](Low) - (atrValue * atrMult) // La valeur de mon stop loss
riskAmount = ROUND(RiskPercent / 100.0) * capital // Le montant max que je risque par trade
longRisk = Close - longStop // L'écart entre l'entrée et le stop loss
longPositionSize = abs(round((riskAmount/longRisk)/PointValue)*pipsize)
// Entrée en position longue
IF not ONMARKET and buyCond THEN
BUY longPositionSize SHARES AT MARKET
SET STOP LOSS longRisk
ENDIF
// Sortie du bay
IF LongOnMarket THEN
SET STOP TRAILING longRisk
ENDIF
Merci d’avance pour votre aide !!!
Le problème réside dans le capital initial. Dans votre code, vous avez mis 1 000 $. Ce n'est pas suffisant pour l'actif que vous négociez "MOIS". Si vous passez à 10 000 par exemple vous verrez que vous obtenez déjà des résultats.
Bonjour,
Merci pour votre précision. Je viens de faire la manipulation, mais j’ai toujours le même résultat !
En PJ un portefeuille à 10k, à 100k et à 1000k.
Je ne sais pas où est mon erreur. Ce qui est embêtant pour réaliser un backtest.
si vous mettez
longPositionSize = 1 il marche
mettre en bas du code
graph longPositionSize
pour connaitre le nombre de contract
Effectivement en mettant :
longPositionSize = 1
Cela fonction, mais comment je peux faire pour avoir une taille de position qui s’adapte en fonction de l’évolution du portefeuille et de la règle de 2%?
Je pensais que ce bout de code allait me permettre justement de réaliser ce calcul :
// Calcul du stop-loss
capital = startCapital + STRATEGYPROFIT // La valeur de mon portefeuille
longStop = Lowest[BarLookback](Low) - (atrValue * atrMult) // La valeur de mon stop loss
riskAmount = ROUND(RiskPercent / 100.0) * capital // Le montant max que je risque par trade
longRisk = Close - longStop // L'écart entre l'entrée et le stop loss
longPositionSize = abs(round((riskAmount/longRisk)/PointValue)*pipsize)
Merci pour l’astuce de la taille de position à 1.
pourquoi vous utilisé pas ce code
REM Money Management
Capital = 10000
Risk = 0.01
StopLoss = 10 // Could be our variable X
REM Calculate contracts
equity = Capital + StrategyProfit
maxrisk = round(equity*Risk)
PositionSize = abs(round((maxrisk/StopLoss)/PointValue)*pipsize)
Je n’utilise pas ce code car mon stop loss se calcule différemment en fonction du sens du trade. Le code ici c’est uniquement pour une position longue. Or je viens de rédiger la suite pour une position courte.
vous avez testé avec ce code
graph longPositionSize
le nombre de contract ?
Oui, comme vous m’avez dit de l’initialiser à 1, j’ai soit +1 pour position longue soit -1 pour position courte.
J’ai trouvé le problème ! Je viens de le résoudre 🙂
// Ouverture d'une position longue
IF NOT ONMARKET AND buyCond THEN
BUY PositionSizeLong CONTRACTS AT MARKET
buySL = LongStopLoss
SET STOP PRICE buySL
ENDIF
// Stop suiveur pour la position longue
IF LongOnMarket AND LongStopLoss > buySL THEN
buySL = LongStopLoss
SET STOP PRICE buySL
ENDIF
// Ouverture d'une position courte
IF NOT ONMARKET AND sellCond THEN
SELLSHORT PositionSizeShort SHARES AT MARKET
sellSL = ShortStopLoss
SET STOP PRICE sellSL
ENDIF
// Stop suiveur pour la position courte
IF ShortOnMarket AND ShortStopLoss > sellSL THEN
sellSL = ShortStopLoss
SET STOP PRICE sellSL
ENDIF
Merci à vous !