Problème lors d’un backtest avec des timeframes Heikin Ashi
Forums › ProRealTime forum Français › Support ProOrder › Problème lors d’un backtest avec des timeframes Heikin Ashi
- This topic has 9 replies, 3 voices, and was last updated 22 hours ago by
robertogozzi.
-
-
06/21/2025 at 9:05 AM #248461
Bonjour,
Je rencontre une anomalie lors d’un backtest de mon bot de trading utilisant des graphiques Heikin Ashi avec deux timeframes : 15 minutes et 30 secondes.
Le bot exécute une transaction sur le timeframe de 30 secondes, et la clôture de la transaction est conditionnée par l’apparition d’une bougie rouge (en Heikin Ashi) sur le timeframe de 15 minutes.
Lors d’un backtest, j’ai observé 14 bougies vertes consécutives sur le timeframe de 15 minutes (soit 210 minutes de tendance haussière). Cependant, la transaction s’est clôturée après seulement 12 minutes, ce qui ne correspond pas à la condition de clôture (bougie rouge sur le timeframe de 15 minutes).Pourriez-vous m’aider à identifier la raison de cette clôture prématurée ?
Merci d’avance pour votre support.Cordialement,
06/21/2025 at 11:34 AM #248467Le code serait utile pour comprendre ce qui se passe.
Cependant, je vous suggère d’essayer de placer la sortie dans un timeframe de 15 minutes (en utilisant UpdateOnClose).
06/21/2025 at 11:37 AM #248468Sans le code, nous serions dans l’expectative.
Si vous ne souhaitez pas publier l’intégralité du code, il serait peut-être plus facile de nous expliquer si vous publiiez simplement le code de sortie dans le délai de 15 minutes.
1 user thanked author for this post.
06/21/2025 at 1:42 PM #248472Mille excuses !!!
J’ai complètement oublié de vous envoyer le code
Un peu d’explication pour vous : MyCalledR9 est la condition d’entrée = bougie heikin Ashi verte en TF 30 secondes
tandis que My240CalledR9 (bougie Heikin Ashi Verte en TF 15 minutes) est la condition conjointe avec MyCalledR9
My240CalledR8 (bougie Heikin Ashi Rouge en TF 15 minutes) est la condition de sortieMerci beaucoup.
// Définition des paramètres du code
DefParam CumulateOrders = False // Cumul des positions désactivé
DefParam Preloadbars = 5000
Once PositionSize = 0.5//—– Function : STOP SUIVEUR —–
Once MyNewSL = 0
Once MyEntryBarIndex = 0
Once MyFlagTS = 1 //Trailing Stop Flag
Once MyFlagTP = 0 //Take Profit FlagOnce MyFlagTimeCond = 1 //Time Condition Flag
MyTimeCond1 = (CurrentTime > 060000 And CurrentTime < 210000)
MyTimeCond2 = (CurrentTime > 060000 And CurrentTime < 140000) Or (CurrentTime > 153000 And CurrentTime < 210000)
MyTimeCond3 = (CurrentTime > 180000 And CurrentTime < 235500) Or (CurrentTime > 010000 And CurrentTime < 070000)
MyTimeCond4 = (CurrentTime > 060000 And CurrentTime < 180000) Or (CurrentTime > 193000 And CurrentTime < 210000)
MyTimeCond5 = (CurrentTime > 130000 And CurrentTime < 180000)Once MyFlagHedge = 0 //Hedge Flag
Once FirstLossAndQuit = 0
Once MyFlagReInvest = 0 //ReInvest Flag
Once MyAsset = 1 //1=NQ 2=BTC 3=DAX 4=2K
Once MyCapital = 1000 //Capital
Once MyBroker = 1 //Broker (1=IG <>1=IBKR)MyWorkDayIsValid = CurrentDayOfWeek >= 1 and CurrentDayOfWeek <= 5
//— Timing Conditions —
If MyFlagTimeCond then
MyTimeCond = MyTimeCond5
Else
MyTimeCond = 1
Endif
//— Timing Conditions —//— Price Conditions —
Once PriceTrigger = 99999
If High < PriceTrigger then
PriceTrigger = 99999
MyPriceCond = 1
Else
MyPriceCond = 0
Endif
//— Price Conditions —//— Furtif Date and Time Condition —
MyFurtifDate = Date >= 20221118
MyFurtifTime = CurrentTime > 075000
//— Furtif Date and Time Condition —//— Stop Suiveur Conditions —
If MyFlagTS=1 And OnMarket then
//—–Pose Premier SL dès ACHAT—-
If SLfirst = 0 thenMyCalledR81, MyCalledR82, MyCalledR83, MyCalledR84, MyCalledR85 = CALL “2023JUN_SMART_TRAILING”[1, 1, TradePrice, 1.3, 0.05, 0.05, 9, 9, 9]
SLfirst = MyCalledR82
TSstart = MyCalledR83
TSstep = MyCalledR84
//— Pose du premier SL —
Sell at SLfirst STOP
MyNewSL = SLfirstEndif
Endif
//Graph SLfirst Coloured(255,82,82) As “My SL First”
//GraphOnPrice SLfirst Coloured(255,55,55) As “My SLfirst”
//GraphOnPrice MyNewSL Coloured(0,204,0) As “My MyNewSL”
//Graph MyNewSL Coloured(0,204,0) As “My MyNewSL”
//— Stop Suiveur Conditions —//— Money Management —
MyGain = StrategyProfit
If MyFlagReInvest=1 then
MyCalledR91, MyCalledR92, MyCalledR93, MyCalledR94, MyCalledR95 = CALL “2023JUN_SMART_REINVEST”[10, 9, MyBroker, 0.5, 9, MyAsset, MyCapital, MyGain, 300000]
PositionSize = MyCalledR92
Else
PositionSize = PositionSize
Endif
//— Money Management —TimeFrame(15 Minutes)
//—–OHLC—–
My240Open = Open
My240High = High
My240Low = Low
My240Close = Close
My240HighLow = My240High – My240Low
My240OpenClose = Abs(My240Open – My240Close)
My240Vol = Volume
//—–OHLC—–//——– Appel du Sous Programme ——–
My240CalledR0, My240CalledR1, My240CalledR2, My240CalledR3, My240CalledR4, My240CalledR5, My240CalledR6, My240CalledR7, My240CalledR8, My240CalledR9, My240CalledR10, My240CalledR11, My240CalledR12, My240CalledR13, My240CalledR14, My240CalledR15, My240CalledR16, My240CalledR17, My240CalledR18, My240CalledR19, My240CalledR20 = CALL “2025JUN_STODIHASMA”[10, 9, 1, 9, 9, 1, 0, 10, 0, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
//My240R14cond = My240CalledR14 > My240CalledR14[1]
//MyDailyDiffCond = My240CalledR20 > 0TimeFrame(Default)
//—–OHLC—–
MyOpen = Open
MyHigh = High
MyLow = Low
MyClose = Close
MyHighLow = MyHigh – MyLow
MyOpenClose = Abs(MyOpen – MyClose)
MyVol = Volume
//—–OHLC—–//——– Appel du Sous Programme ——–
MyCalledR0, MyCalledR1, MyCalledR2, MyCalledR3, MyCalledR4, MyCalledR5, MyCalledR6, MyCalledR7, MyCalledR8, MyCalledR9, MyCalledR10, MyCalledR11, MyCalledR12, MyCalledR13, MyCalledR14, MyCalledR15, MyCalledR16, MyCalledR17, MyCalledR18, MyCalledR19, MyCalledR20 = CALL “2025JUN_STODIHASMA”[10, 9, 1, 9, 9, 1, 0, 10, 0, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]MyCondHL = MyHighLow > 15
MyCondVol = MyVol > 2000
MyCondOC = MyOpenClose > 10
MyDojiCond = MyCalledR18 > 3//—– Entry Condition —–
//MyEntryCondForLong = MyPriceCond And MyDojiCond And MyCondOC And MyCondHL And MyCondVol And MyCalledR9
MyEntryCondForLong = MyCalledR9 And My240CalledR9
//—– Exit Condition —–
MyExitCondForLong = My240CalledR8//========== DEBUT PROGRAMME ==========
//——- Debut Test WorkDay ——-
If MyWorkDayIsValid thenIf OnMarket then
MyOnMarket = 1
Else
MyOnMarket = 0
//MySLDiff = 0
SLfirst = 0
MyNewSL = 0
MyExitType = 0
MyGainLatent = 0
MyEntryBarCount=0
Set Target %Profit 0
Endif//— Si le dernier trade est un perdant —
//— L’algo s’arrête automatiquement —
If PositionPerf(1) < 0 And FirstLossAndQuit = 1 then
Quit
Endif//—– Very important : For Bar Index Counting —–
//—– Imperative Not OnMarket syntax here —–
If MyTimeCond then
If MyEntryCondForLong And Not OnMarket then
Buy PositionSize contracts at market
MyEntryBarIndex = BarIndex
If MyFlagTP then
Set Target %Profit 0.18
Endif
Endif
EndifIf OnMarket And (MyExitCondForLong) then
MyExitType=12
MyExitBarIndex = BarIndex
If MyFlagHedge = 1 then
SellShort PositionSize contracts at market
Quit
Else
Sell PositionSize contracts at market
Endif
Endif//===== GESTION du STOP SUIVEUR =====
If OnMarket then
//—– Comptage Gain Latent —–
MyGainLatent = (MyClose – TradePrice)
MyRatioGainLatent = ((MyGainLatent * 100) / TradePrice)
//—– Comptage Gain Latent —–//—– Pour connaitre combien de temps le trade a durer —–
//—– Comptage de Bar —–
MyEntryBarCount = BarIndex – MyEntryBarIndex
//—– Comptage de Bar —–//===== PARTIE STOP SUIVEUR =====
If MyFlagTS then//— Les pas suivants : Incrémentation —
If MyGainLatent >= TSstart thenMyCalledR81, MyCalledR82, MyCalledR83, MyCalledR84, MyCalledR85 = CALL “2023JUN_SMART_TRAILING”[10, 1, MyGainLatent, TSstart, TSstep, MyOpen, MyNewSL, 9, 9]
MyNewSL = MyCalledR81
Endif
//=== End MyGainLatent >= TSstart ===If MyClose > MyNewSL then
Sell at MyNewSL STOP
Else
Sell PositionSize contracts at Market
Endif
//— Je calcule ici l’écart entre —
//— mon prix d’achat et mon SL —
MySLDiff = TradePrice – MyNewSL
//Graph MySLDiff Coloured(255,55,55) As “My SLdiff”//=== End Stop Suiveur (MyFlag) ===
Endif
//===== PARTIE STOP SUIVEUR =====//=== End On Market ===
Endif//=== End WorkDay ===
Endif//GraphOnPrice MyNewSL Coloured(0,204,0) As “My MyNewSL”
//Graph MyExitType Coloured(0,0,0) As “My Exit Type”
//****** Showing Drawn Down ******
//Graph MyGainLatent Coloured(255,82,82) As “My Gain Latent”
//Graph MyDiff Coloured(255,82,82) As “My Diff”
//06/21/2025 at 3:41 PM #248475sortie dans un délai de 15 minutes (en utilisant UpdateOnClose).
Pour commencer… La ligne 83 du code publié doit être telle que décrite par Roberto…
1TimeFrame(15 Minutes, updateonclose)Faites-nous savoir si ce qui précède fait une différence ?
06/21/2025 at 3:51 PM #24847606/21/2025 at 4:17 PM #248478Je résous le problème en exécutant le code, puis en apportant des modifications. Je ne peux pas le faire avec votre code ci-dessus car je n’ai pas les indicateurs appelés .
Yes, it makes a difference to my disadvantage.
Perhaps you need to review the code logic or reoptimize it now that you are using updateonclose ?
06/21/2025 at 4:24 PM #24847906/21/2025 at 5:48 PM #24848106/21/2025 at 8:03 PM #248483Essayez cette version modifiée. Je n’ai pas pu l’essayer car vous n’avez pas attaché l’indicateur.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237// Définition des paramètres du codeDefParam CumulateOrders = False // Cumul des positions désactivéDefParam Preloadbars = 5000Once PositionSize = 0.5//—- Function : STOP SUIVEUR —-Once MyNewSL = 0Once MyEntryBarIndex = 0Once MyFlagTS = 1 //Trailing Stop FlagOnce MyFlagTP = 0 //Take Profit FlagOnce MyFlagTimeCond = 1 //Time Condition FlagMyTimeCond1 = (CurrentTime > 060000 And CurrentTime < 210000)MyTimeCond2 = (CurrentTime > 060000 And CurrentTime < 140000) Or (CurrentTime > 153000 And CurrentTime < 210000)MyTimeCond3 = (CurrentTime > 180000 And CurrentTime < 235500) Or (CurrentTime > 010000 And CurrentTime < 070000)MyTimeCond4 = (CurrentTime > 060000 And CurrentTime < 180000) Or (CurrentTime > 193000 And CurrentTime < 210000)MyTimeCond5 = (CurrentTime > 130000 And CurrentTime < 180000)Once MyFlagHedge = 0 //Hedge FlagOnce FirstLossAndQuit = 0Once MyFlagReInvest = 0 //ReInvest FlagOnce MyAsset = 1 //1=NQ 2=BTC 3=DAX 4=2KOnce MyCapital = 1000 //CapitalOnce MyBroker = 1 //Broker (1=IG <>1=IBKR)MyWorkDayIsValid = CurrentDayOfWeek >= 1 and CurrentDayOfWeek <= 5//— Timing Conditions —If MyFlagTimeCond thenMyTimeCond = MyTimeCond5ElseMyTimeCond = 1Endif//— Timing Conditions —//— Price Conditions —Once PriceTrigger = 99999If High < PriceTrigger thenPriceTrigger = 99999MyPriceCond = 1ElseMyPriceCond = 0Endif//— Price Conditions —//— Furtif Date and Time Condition —MyFurtifDate = Date >= 20221118MyFurtifTime = CurrentTime > 075000//— Furtif Date and Time Condition —//— Stop Suiveur Conditions —If MyFlagTS=1 And OnMarket then//—-Pose Premier SL dès ACHAT—-If SLfirst = 0 thenMyCalledR81, MyCalledR82, MyCalledR83, MyCalledR84, MyCalledR85 = CALL "2023JUN_SMART_TRAILING"[1, 1, TradePrice, 1.3, 0.05, 0.05, 9, 9, 9]SLfirst = MyCalledR82TSstart = MyCalledR83TSstep = MyCalledR84//— Pose du premier SL —Sell at SLfirst STOPMyNewSL = SLfirstEndifEndif//Graph SLfirst Coloured(255,82,82) As "My SL First"//GraphOnPrice SLfirst Coloured(255,55,55) As "My SLfirst"//GraphOnPrice MyNewSL Coloured(0,204,0) As "My MyNewSL"//Graph MyNewSL Coloured(0,204,0) As "My MyNewSL"//— Stop Suiveur Conditions —//— Money Management —MyGain = StrategyProfitIf MyFlagReInvest=1 thenMyCalledR91, MyCalledR92, MyCalledR93, MyCalledR94, MyCalledR95 = CALL "2023JUN_SMART_REINVEST"[10, 9, MyBroker, 0.5, 9, MyAsset, MyCapital, MyGain, 300000]PositionSize = MyCalledR92ElsePositionSize = PositionSizeEndif//— Money Management —TimeFrame(15 Minutes)//—-OHLC—-My240Open = OpenMy240High = HighMy240Low = LowMy240Close = CloseMy240HighLow = My240High - My240LowMy240OpenClose = Abs(My240Open - My240Close)My240Vol = Volume//—-OHLC—-//——- Appel du Sous Programme ——-My240CalledR0, My240CalledR1, My240CalledR2, My240CalledR3, My240CalledR4, My240CalledR5, My240CalledR6, My240CalledR7, My240CalledR8, My240CalledR9, My240CalledR10, My240CalledR11, My240CalledR12, My240CalledR13, My240CalledR14, My240CalledR15, My240CalledR16, My240CalledR17, My240CalledR18, My240CalledR19, My240CalledR20 = CALL "2025JUN_STODIHASMA"[10, 9, 1, 9, 9, 1, 0, 10, 0, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]//My240R14cond = My240CalledR14 > My240CalledR14[1]//MyDailyDiffCond = My240CalledR20 > 0//TimeFrame(15 Minutes,UpdateOnClose)MyExitLong = My240CalledR8If OnMarket And (MyExitLong) thenMyExitType=12MyExitBarIndex = BarIndexIf MyFlagHedge = 1 then//SellShort PositionSize contracts at market//QuitElseSell PositionSize contracts at marketEndifEndif//IF Not OnMarket THENMyExitType = 0ENDIF//TimeFrame(Default)//—-OHLC—-MyOpen = OpenMyHigh = HighMyLow = LowMyClose = CloseMyHighLow = MyHigh - MyLowMyOpenClose = Abs(MyOpen - MyClose)MyVol = Volume//—-OHLC—-//——- Appel du Sous Programme ——-MyCalledR0, MyCalledR1, MyCalledR2, MyCalledR3, MyCalledR4, MyCalledR5, MyCalledR6, MyCalledR7, MyCalledR8, MyCalledR9, MyCalledR10, MyCalledR11, MyCalledR12, MyCalledR13, MyCalledR14, MyCalledR15, MyCalledR16, MyCalledR17, MyCalledR18, MyCalledR19, MyCalledR20 = CALL "2025JUN_STODIHASMA"[10, 9, 1, 9, 9, 1, 0, 10, 0, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]MyCondHL = MyHighLow > 15MyCondVol = MyVol > 2000MyCondOC = MyOpenClose > 10MyDojiCond = MyCalledR18 > 3//—- Entry Condition —-//MyEntryCondForLong = MyPriceCond And MyDojiCond And MyCondOC And MyCondHL And MyCondVol And MyCalledR9MyEntryCondForLong = MyCalledR9 And My240CalledR9//—- Exit Condition —-MyExitCondForLong = My240CalledR8//========== DEBUT PROGRAMME ==========//——- Debut Test WorkDay ——-If MyWorkDayIsValid thenIf OnMarket thenMyOnMarket = 1ElseMyOnMarket = 0//MySLDiff = 0SLfirst = 0MyNewSL = 0MyGainLatent = 0MyEntryBarCount=0Set Target %Profit 0Endif//— Si le dernier trade est un perdant —//— L’algo s’arrête automatiquement —If PositionPerf(1) < 0 And FirstLossAndQuit = 1 thenQuitEndif//—- Very important : For Bar Index Counting —-//—- Imperative Not OnMarket syntax here —-If MyTimeCond thenIf MyEntryCondForLong And Not OnMarket thenBuy PositionSize contracts at marketMyEntryBarIndex = BarIndexIf MyFlagTP thenSet Target %Profit 0.18EndifEndifEndif//If OnMarket And (MyExitCondForLong) then//MyExitType=12//MyExitBarIndex = BarIndex//If MyFlagHedge = 1 then////SellShort PositionSize contracts at market////Quit//Else//Sell PositionSize contracts at market//Endif//Endif//===== GESTION du STOP SUIVEUR =====If OnMarket then//—- Comptage Gain Latent —-MyGainLatent = (MyClose - TradePrice)MyRatioGainLatent = ((MyGainLatent * 100) / TradePrice)//—- Comptage Gain Latent —-//—- Pour connaitre combien de temps le trade a durer —-//—- Comptage de Bar —-MyEntryBarCount = BarIndex - MyEntryBarIndex//—- Comptage de Bar —-//===== PARTIE STOP SUIVEUR =====If MyFlagTS then//— Les pas suivants : Incrémentation —If MyGainLatent >= TSstart thenMyCalledR81, MyCalledR82, MyCalledR83, MyCalledR84, MyCalledR85 = CALL "2023JUN_SMART_TRAILING"[10, 1, MyGainLatent, TSstart, TSstep, MyOpen, MyNewSL, 9, 9]MyNewSL = MyCalledR81Endif//=== End MyGainLatent >= TSstart ===If MyClose > MyNewSL thenSell at MyNewSL STOPElseSell PositionSize contracts at MarketEndif//— Je calcule ici l’écart entre —//— mon prix d’achat et mon SL —MySLDiff = TradePrice - MyNewSL//Graph MySLDiff Coloured(255,55,55) As "My SLdiff"//=== End Stop Suiveur (MyFlag) ===Endif//===== PARTIE STOP SUIVEUR =====//=== End On Market ===Endif//=== End WorkDay ===Endif//GraphOnPrice MyNewSL Coloured(0,204,0) As "My MyNewSL"//Graph MyExitType Coloured(0,0,0) As "My Exit Type"//****** Showing Drawn Down ******//Graph MyGainLatent Coloured(255,82,82) As "My Gain Latent"//Graph MyDiff Coloured(255,82,82) As "My Diff"1 user thanked author for this post.
-
AuthorPosts
Find exclusive trading pro-tools on