Problème lors d’un backtest avec des timeframes Heikin Ashi

Viewing 11 posts - 1 through 11 (of 11 total)
  • Author
    Posts
  • #248461 quote
    whbh
    Participant
    New

    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,

    Timeframe-30-secondes.png Timeframe-30-secondes.png Timeframe-15-Minutes.png Timeframe-15-Minutes.png
    #248467 quote
    robertogozzi
    Moderator
    Master

    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).

    #248468 quote
    GraHal
    Participant
    Master

    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.

    robertogozzi thanked this post
    #248472 quote
    whbh
    Participant
    New

    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”
    //

    #248475 quote
    GraHal
    Participant
    Master

    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 ?

    #248476 quote
    whbh
    Participant
    New

    Oui, cela fait une différence en ma défaveur

    #248478 quote
    GraHal
    Participant
    Master

    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 ?

    Iván González thanked this post
    #248479 quote
    GraHal
    Participant
    Master

    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  ?

    #248481 quote
    whbh
    Participant
    New

    OK. Merci Grahal

    GraHal thanked this post
    #248483 quote
    robertogozzi
    Moderator
    Master

    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"
    GraHal and Iván González thanked this post
    #248497 quote
    whbh
    Participant
    New

    C’est magnifique !!!
    Bravo l’équipe, vous avez trouvé la solution !!!
    Mille Merci

    robertogozzi thanked this post
Viewing 11 posts - 1 through 11 (of 11 total)
  • You must be logged in to reply to this topic.

Problème lors d’un backtest avec des timeframes Heikin Ashi


ProOrder : Trading Automatique & Backtests

New Reply
Author
author-avatar
whbh @whbh Participant
Summary

This topic contains 10 replies,
has 3 voices, and was last updated by whbh
8 months, 1 week ago.

Topic Details
Forum: ProOrder : Trading Automatique & Backtests
Language: French
Started: 06/21/2025
Status: Active
Attachments: 2 files
Logo Logo
Loading...