如何计算交易策略的平均交易时长及空仓间隔平均天数?
问题描述
我需要实现两项计算需求,但尝试数组、循环、持久变量等方法均未成功:
- 计算策略中每笔交易从入场到离场的时长,对所有交易时长取平均值后转换为分钟,记为
AverageTradeDurationTime; - 计算交易空仓期(无任何持仓的flat状态)的间隔时长,对所有间隔时长取平均值后转换为天数,记为
TotalDaysBetweenAveraged。
我的代码尝试
代码尝试1
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
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)
解决方案
1. 计算平均交易时长(AverageTradeDurationTime)
通过遍历已平仓交易,累加每笔交易的时长并统计交易总数,最终计算平均值并转换为分钟:
//@version=5 // 初始化持久变量:累计总交易时长(毫秒)、已平仓交易数量 var float totalTradeDuration = 0.0 var int tradeCount = 0 // 监测新平仓的交易,更新累计值与计数 if strategy.closedtrades > tradeCount latestClosedIdx = strategy.closedtrades - 1 // 单笔交易时长 = 离场时间 - 入场时间 singleDuration = strategy.closedtrades.exit_time(latestClosedIdx) - strategy.closedtrades.entry_time(latestClosedIdx) totalTradeDuration := totalTradeDuration + singleDuration tradeCount := tradeCount + 1 // 计算平均交易时长(转换为分钟),避免除数为0 AverageTradeDurationTime = tradeCount > 0 ? (totalTradeDuration / tradeCount) / 60000 : na // 输出结果到数据窗口 plot(AverageTradeDurationTime, "平均交易时长(分钟)", color=color.blue, display=display.data_window)
2. 计算平均空仓间隔(TotalDaysBetweenAveraged)
记录上一笔交易的平仓时间,当新交易入场时计算空仓间隔,累加后求平均值并转换为天数:
//@version=5 // 初始化持久变量:上一笔交易平仓时间、累计空仓总时长(毫秒)、空仓间隔次数 var float lastExitTime = na var float totalFlatDuration = 0.0 var int flatCount = 0 // 新交易入场时,计算与上一笔平仓的间隔 if strategy.opentrades > 0 and not na(lastExitTime) latestOpenIdx = strategy.opentrades - 1 singleFlatDuration = strategy.opentrades.entry_time(latestOpenIdx) - lastExitTime totalFlatDuration := totalFlatDuration + singleFlatDuration flatCount := flatCount + 1 // 交易平仓时,更新上一笔平仓时间 if strategy.closedtrades > 0 latestClosedIdx = strategy.closedtrades - 1 lastExitTime := strategy.closedtrades.exit_time(latestClosedIdx) // 计算平均空仓间隔(转换为天数) TotalDaysBetweenAveraged = flatCount > 0 ? (totalFlatDuration / flatCount) / 86400000 : na // 输出结果到数据窗口 plot(TotalDaysBetweenAveraged, "平均空仓间隔(天数)", color=color.red, display=display.data_window)
完整整合代码
将两个计算逻辑合并,同时在图表上显示结果标签:
//@version=5 strategy("交易时长与空仓间隔统计", overlay=true) // ---------------------- 平均交易时长计算 ---------------------- var float totalTradeDuration = 0.0 var int tradeCount = 0 if strategy.closedtrades > tradeCount latestClosedIdx = strategy.closedtrades - 1 singleDuration = strategy.closedtrades.exit_time(latestClosedIdx) - strategy.closedtrades.entry_time(latestClosedIdx) totalTradeDuration := totalTradeDuration + singleDuration tradeCount := tradeCount + 1 AverageTradeDurationTime = tradeCount > 0 ? (totalTradeDuration / tradeCount) / 60000 : na // ---------------------- 平均空仓间隔计算 ---------------------- var float lastExitTime = na var float totalFlatDuration = 0.0 var int flatCount = 0 if strategy.opentrades > 0 and not na(lastExitTime) latestOpenIdx = strategy.opentrades - 1 singleFlatDuration = strategy.opentrades.entry_time(latestOpenIdx) - lastExitTime totalFlatDuration := totalFlatDuration + singleFlatDuration flatCount := flatCount + 1 if strategy.closedtrades > 0 latestClosedIdx = strategy.closedtrades - 1 lastExitTime := strategy.closedtrades.exit_time(latestClosedIdx) TotalDaysBetweenAveraged = flatCount > 0 ? (totalFlatDuration / flatCount) / 86400000 : na // ---------------------- 结果展示 ---------------------- // 数据窗口输出 plot(AverageTradeDurationTime, "平均交易时长(分钟)", color=color.blue, display=display.data_window) plot(TotalDaysBetweenAveraged, "平均空仓间隔(天数)", color=color.red, display=display.data_window) // 图表标签展示 var label tradeLabel = label.new(bar_index, high, "", color=color.blue, textcolor=color.white) var label flatLabel = label.new(bar_index, high - ta.atr(10), "", color=color.red, textcolor=color.white) if barstate.islast label.set_text(tradeLabel, str.format("平均交易时长: %.2f 分钟", AverageTradeDurationTime)) label.set_text(flatLabel, str.format("平均空仓间隔: %.2f 天", TotalDaysBetweenAveraged)) label.set_xy(tradeLabel, bar_index, high) label.set_xy(flatLabel, bar_index, high - ta.atr(10))
内容的提问来源于stack exchange,提问作者TheLegendOfA
相关产品推荐
相关产品推荐

