如何在Pine Script中获取strategy.closedtrades中每笔交易的买入年份?
获取Pine Script中已平仓交易的买入年份
当然可以实现!你遇到的两个问题其实都有对应的解决方案,咱们一步步来看:
方法一:直接从交易入场时间提取年份
你提到用strategy.closedtrades.entry_time[num_trade]但不知道怎么提取年份——其实这个值本身就是datetime类型(不是Unix时间戳),可以直接用Pine Script内置的year()函数来提取年份,完全不需要额外转换。
示例代码:
//@version=5 strategy("提取已平仓交易买入年份", overlay=true) if barstate.islast // 遍历所有已平仓交易 for i = 0 to strategy.closedtrades - 1 entry_year = year(strategy.closedtrades.entry_time[i]) // 在图表上标注年份 label.new(bar_index, high - i*15, str.tostring(entry_year), color=color.blue, textcolor=color.white) // 控制台输出交易信息 var table trade_table = table.new(position.top_right, 2, 1) table.cell(trade_table, 0, i+1, str.tostring(i+1) + "号交易") table.cell(trade_table, 1, i+1, "买入年份:" + str.tostring(entry_year)) // 模拟交易(方便测试) if bar_index % 100 == 0 strategy.entry("Test Long", strategy.long) if bar_index % 100 == 50 strategy.close("Test Long")
这个方法最直接,也不会出现K线数量不足的报错,因为entry_time是交易记录自带的属性,不需要依赖图表加载的K线。
方法二:通过入场Bar索引提取年份(解决报错问题)
如果你一定要用strategy.closedtrades.entry_bar_index,报错的原因是:当这笔交易对应的入场K线不在当前图表加载的K线范围内时,直接访问year[entry_bar_index]会触发越界错误。解决方式是先判断该Bar索引是否有效(即对应的K线存在于当前图表中)。
示例代码:
//@version=5 strategy("通过Bar索引提取买入年份", overlay=true) if barstate.islast total_closed = strategy.closedtrades for i = 0 to total_closed - 1 entry_bar = strategy.closedtrades.entry_bar_index[i] // 先检查Bar索引是否在当前图表的加载范围内 if not na(entry_bar) and entry_bar >= bar_index - bar_count + 1 entry_year = year[entry_bar] label.new(bar_index, high - i*15, str.tostring(entry_year), color=color.red, textcolor=color.white) else label.new(bar_index, high - i*15, "无历史K线数据", color=color.gray, textcolor=color.white)
这里的bar_count是当前图表加载的K线总数,通过entry_bar >= bar_index - bar_count + 1可以判断该Bar是否在加载范围内,避免越界报错。
总结
优先推荐方法一,因为它更简洁可靠,不需要依赖图表加载的K线数量,直接从交易记录的入场时间提取年份即可。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

