本文将详细解析一个基于枢轴点的反转交易策略。该策略通过计算一定周期的最高价和最低价,确定可能的枢轴支撑和阻力位。当价格穿越这些枢轴位时,表明趋势发生转折,这时可以进行反转交易。
该策略主要依赖两个指标:枢轴高点(Pivot High)和枢轴低点(Pivot Low)。枢轴高低点是在一个周期内的最高价和最低价,可以通过pivothigh()
和pivotlow()
函数计算获得。计算枢轴点时需要设置左右两边的周期数,本策略中左侧周期数为4,右侧周期数为2。
当最新一个周期的最高点低于上一个周期的枢轴高点时,说明出现了反转信号。这时如果之前是短线操作,现在应该考虑建立做多头寻求翻转机会。同样,当最新一个周期的最低点高于上一个周期的枢轴低点时,做空头应考虑反转建仓。
具体来说,该策略主要逻辑是:
该策略最大的优势在于识别潜在的趋势反转点,这对于反转交易者尤为重要。相比其他指标,枢轴点可以更清晰地判断支撑阻力,而不会出现频繁的假信号。
另外,该策略同时建立做多和做空条件,最大程度覆盖不同市场情况,避免错过交易机会。通过止损来控制风险,使盈亏比能够得到保证。
总的来说,这是一个非常实用的反转策略。
尽管该策略力图降低假信号的概率,但任何以突破为基础的策略都难免会出现超前 Signals 或超迟 Signals 的情况。这可能导致计划建立多头仓位但市场已经开始转熊,或者计划建空仓但牛市突然爆发。这类无法完美预测反转的问题是技术分析本身的局限。
此外,枢轴点并不能百分之百确定关键的支撑阻力位,仅供参考。如果运气不好,枢轴点可能刚好错过真正的支撑位形成 止损 。这种模糊区间的问题也无法完全避免。
周期优化。现有的左右周期数设置为4和2,这可以作为初始设置。但不同市场不同周期的枢轴可能效果更好,可以尝试优化找到最佳参数组合。
结合其他指标过滤。比如可以加入成交量指标,只有在成交量放大的情况下才认为突破是有效的,这样可以减少假突破。
动态止损。现有的止损是枢轴上下各留出一个最小交易单位的空间。这可以根据市场波动程度,采用动态止损去尝试最佳止损位。
仅在趋势方向操作。现在做多做空条件是并行的,其实也可以只在多头市场里寻找做多机会,空头市场里寻找做空机会。结合趋势指标可能获得更好的效果。
该策略整体来说是一个简单实用的反转策略。通过计算枢轴点并监测其突破,来判断潜在的趋势转折,这是其核心思路。该策略同时建立做多做空条件,最大限度捕捉反转机会。止损设置则用来控制风险。
整体而言,该策略思路清晰,易于实施。参数设置也比较直接,对新手友好。通过不断测试和优化,可以逐步改善策略表现,值得推荐。
/*backtest
start: 2022-12-11 00:00:00
end: 2023-12-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Pivot Reversal Strategy", overlay=true)
leftBars = input(4)
rightBars = input(2)
// backtesting date range
from_day = input(defval = 1, title = "From Day", minval = 1)
from_month = input(defval = 3, title = "From Month", minval = 1)
from_year = input(defval = 2018, title = "From Year", minval = 1970)
to_day = input(defval = 1, title = "To Day", minval = 1)
to_month = input(defval = 1, title = "To Month", minval = 1)
to_year = input(defval = 2100, title = "To Year", minval = 1970)
time_cond = (time > timestamp(from_year, from_month, from_day, 00, 00)) and (time < timestamp(to_year, to_month, to_day, 23, 59))
swh = pivothigh(leftBars, rightBars)
swl = pivotlow(leftBars, rightBars)
swh_cond = not na(swh)
hprice = 0.0
hprice := swh_cond ? swh : hprice[1]
le = false
le := swh_cond ? true : (le[1] and high > hprice ? false : le[1])
if (le and time_cond)
strategy.entry("PivRevLE", strategy.long, comment="PivRevLE", stop=hprice + syminfo.mintick)
swl_cond = not na(swl)
lprice = 0.0
lprice := swl_cond ? swl : lprice[1]
se = false
se := swl_cond ? true : (se[1] and low < lprice ? false : se[1])
if (se and time_cond)
strategy.entry("PivRevSE", strategy.short, comment="PivRevSE", stop=lprice - syminfo.mintick)
//plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)