You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算交易策略的平均交易时长及空仓间隔平均天数?

问题描述

我需要实现两项计算需求,但尝试数组、循环、持久变量等方法均未成功:

  1. 计算策略中每笔交易从入场到离场的时长,对所有交易时长取平均值后转换为分钟,记为AverageTradeDurationTime;
  2. 计算交易空仓期(无任何持仓的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:15:11