如何在Pine Script中实现交易日自动顺延的年度季节性做多策略?
Pine Script 日线策略:指定日期非交易日自动顺延开仓修改方案
问题背景
需要实现仅做多的日线级交易策略,每年在指定日期开仓、另一指定日期平仓。原代码直接匹配当日月/日,若指定开仓日为非交易日(周末/节假日)则无法触发开仓,导致OANDA:XAGUSD在2018、2019年无交易记录,需修改代码实现非交易日自动顺延至下一交易日开仓。
修改后的完整代码
//@version=5 strategy('Seasonal Trading Strategy', overlay=true, initial_capital = 10000, pyramiding = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100) // Input to enable or disable Rule 1 enableRule1 = input(true, 'Rule 1') // Input for long position opening date - Rule 1 longEntryMonth1 = input.int(6, 'Entry Month (1-12)', minval = 1, maxval = 12) longEntryDay1 = input.int(29, 'Entry Day (1-31)', minval = 1, maxval = 31) // Input for long position closing date - Rule 1 longExitMonth1 = input.int(8, 'Exit Month (1-12)', minval = 1, maxval = 12) longExitDay1 = input.int(30, 'Exit Day (1-31)', minval = 1, maxval = 31) // 记录已开仓的年份,避免单年内重复触发 var int lastEntryYear = 0 // 记录已平仓的年份,避免单年内重复触发 var int lastExitYear = 0 // 生成当年的目标开仓/平仓时间戳 currentYear = year(time) targetEntryTime = timestamp(currentYear, longEntryMonth1, longEntryDay1, 0, 0) targetExitTime = timestamp(currentYear, longExitMonth1, longExitDay1, 0, 0) // 判断是否为目标开仓日之后的第一个交易日,且当年未开仓 enterLong1 = enableRule1 and (time > targetEntryTime) and (time[1] <= targetEntryTime) and (currentYear != lastEntryYear) // 判断是否为目标平仓日之后的第一个交易日,且当年未平仓 exitLong1 = enableRule1 and (time > targetExitTime) and (time[1] <= targetExitTime) and (currentYear != lastExitYear) // Execute strategy if (enterLong1) strategy.entry('Long Rule 1', strategy.long) lastEntryYear := currentYear // 更新已开仓年份 if (exitLong1) strategy.close('Long Rule 1') lastExitYear := currentYear // 更新已平仓年份
关键修改说明
- 时间戳精准匹配:通过
timestamp()函数生成当年目标开仓/平仓的精确时间点,替代原代码直接匹配月/日的逻辑 - 顺延交易日判断:对比当前K线与上一根K线的时间,确认当前K线是目标日期之后出现的第一根K线(即第一个交易日)
- 年份锁机制:用
var变量记录已执行开仓/平仓的年份,避免单年内因K线波动重复触发交易信号 - 平仓逻辑同步优化:平仓环节同样采用顺延交易日判断,避免平仓日为非交易日时无法平仓的问题
内容的提问来源于stack exchange,提问作者cxrbon
相关产品推荐
相关产品推荐

