ProRealCode - Trading & Coding with ProRealTime™
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,
Le 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).
Sans 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.
Mille 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 sortie
Merci 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 Flag
Once 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 then
MyCalledR81, 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 = SLfirst
Endif
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 > 0
TimeFrame(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 then
If 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
Endif
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 then
MyCalledR81, 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”
//
sortie 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…
TimeFrame(15 Minutes, updateonclose)
Faites-nous savoir si ce qui précède fait une différence ?
Oui, cela fait une différence en ma défaveur
Je 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 ?
Oui, cela fait une différence à mon désavantage.
Peut-être avez-vous besoin de revoir la logique du code ou de la réoptimiser maintenant que vous utilisez updateonclose ?
Essayez cette version modifiée. Je n’ai pas pu l’essayer car vous n’avez pas attaché l’indicateur.
// 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 Flag
Once 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 then
MyCalledR81, 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 = SLfirst
Endif
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 > 0
//
TimeFrame(15 Minutes,UpdateOnClose)
MyExitLong = My240CalledR8
If OnMarket And (MyExitLong) then
MyExitType=12
MyExitBarIndex = BarIndex
If MyFlagHedge = 1 then
//SellShort PositionSize contracts at market
//Quit
Else
Sell PositionSize contracts at market
Endif
Endif
//
IF Not OnMarket THEN
MyExitType = 0
ENDIF
//
TimeFrame(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 then
If OnMarket then
MyOnMarket = 1
Else
MyOnMarket = 0
//MySLDiff = 0
SLfirst = 0
MyNewSL = 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
Endif
//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 then
MyCalledR81, 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"
C’est magnifique !!!
Bravo l’équipe, vous avez trouvé la solution !!!
Mille Merci
Problème lors d’un backtest avec des timeframes Heikin Ashi
This topic contains 10 replies,
has 3 voices, and was last updated by whbh
8 months, 1 week ago.
| Forum: | ProOrder : Trading Automatique & Backtests |
| Language: | French |
| Started: | 06/21/2025 |
| Status: | Active |
| Attachments: | 2 files |
The information collected on this form is stored in a computer file by ProRealCode to create and access your ProRealCode profile. This data is kept in a secure database for the duration of the member's membership. They will be kept as long as you use our services and will be automatically deleted after 3 years of inactivity. Your personal data is used to create your private profile on ProRealCode. This data is maintained by SAS ProRealCode, 407 rue Freycinet, 59151 Arleux, France. If you subscribe to our newsletters, your email address is provided to our service provider "MailChimp" located in the United States, with whom we have signed a confidentiality agreement. This company is also compliant with the EU/Swiss Privacy Shield, and the GDPR. For any request for correction or deletion concerning your data, you can directly contact the ProRealCode team by email at privacy@prorealcode.com If you would like to lodge a complaint regarding the use of your personal data, you can contact your data protection supervisory authority.