Search code examples
pine-scriptpine-script-v5

How Do I Calculate The Average Time For All Trades Of A Strategy?


Okay, there are two things I can't seem to do.

  1. I need to calculate the time between all trades of the strategy (from each individual trade's entry to exit), then out of all of these, average them. Then, convert that output to minutes. Let's call it AverageTradeDurationTime =

  2. Next, similarly, calculate the time between the trades inactive period: Aka, when the trade was "flat" and there weren't any trades going on. Average all of them together, to get an average amount, in days, between all trades. The average. So let's call it TotalDaysBetweenAveraged =

How?

So, from arrays, to i loops, to persistent vars .... nothing I am doing is working here.

#1 - Code Attempt.

FirstTradeTime = strategy.opentrades.entry_time(0)

LastTradeTime = strategy.closedtrades.exit_time(99999) //What do I even put here?

DaysElapsed = (LastTradeTime - FirstTradeTime) / 86400000

DaysConvertedToWholeNumber = math.round((DaysElapsed / 86400000), 2)

plot(DaysConvertedToWholeNumber, "Total Days Between First And Last Trades", color=color.purple)

#2 - Code Attempt.

LastTradeTimeClose = strategy.closedtrades.exit_time(99999) //What do I even put here?

NextTradeTimeEntry = strategy.opentrades.entry_time(0)

DaysBetween = (LastTradeTime - FirstTradeTime) / 86400000

var TotalDaysBetween = 0

if DaysBetween > 0
     TotalDaysBetween := +1

TotalDaysBetweenAveraged = (TotalDaysBetween / DaysBetween)

DaysBetweenConvertedToWholeNumber = math.round((TotalDaysBetweenAveraged / 86400000), 2)

plot(TotalDaysBetweenAveraged, "Total Days Between Trades", color=color.purple)

Solution

  • Here is a piece of code I use to do this :

    MeanDuratinOfATrade_m is the average duration of the closed trades.
    MeanDurationBetweenTrade_m is the average duration between the closed trades : if there are 2 trades, it is the unique duration between the end of the first closed trade and the beginning of the ast closed trade.

    var Affichage = table.new(position=position.top_right,  columns=3, rows=25, border_color = color.black, border_width = 1)
    if barstate.isrealtime
        // Mean duration of trades
        DurationInTrade_ms = 0
        MeanDuratinOfATrade_m = 0.0
        MeanDurationBetweenTrade_m = 0.0
        if strategy.closedtrades > 0
            for i = 0 to strategy.closedtrades - 1
                DurationInTrade_ms := DurationInTrade_ms + strategy.closedtrades.exit_time(i) - strategy.closedtrades.entry_time(i) // Duration in milliseconds (from UNIX time)
            MeanDuratinOfATrade_m := (DurationInTrade_ms / strategy.closedtrades) / 1000 / 60
            // Mean duration between trades
            if strategy.closedtrades > 1
                TotalTimeBetweenFirstAndLastTrade_ms = strategy.closedtrades.exit_time(strategy.closedtrades-1) - strategy.closedtrades.entry_time(0)
                MeanDurationBetweenTrade_m := (TotalTimeBetweenFirstAndLastTrade_ms - DurationInTrade_ms)/(strategy.closedtrades -1) / 1000 / 60
            // Affichage
            table.cell(Affichage, 0, 0, "Duration of a trade [m]")
            table.cell(Affichage, 1, 0, str.tostring(MeanDuratinOfATrade_m, "#.##"))
            table.cell(Affichage, 0, 1, "Duration Betweentrade [m]")
            table.cell(Affichage, 1, 1, str.tostring(MeanDurationBetweenTrade_m, "#.##"))
    

    On the screen, it will appear once the current bar close : enter image description here