此策略是一个简单但盈利的趋势跟踪策略,它基于一小时时间框架上的ICHIMOKU标识系统的TENKAN线和KIJUN线的交叉来判断趋势方向,并结合ADX指标来过滤掉趋势较弱的市场从而发出交易信号。该策略主要适用于ETH/BTC等大市值altcoin的BTC交易对。
该策略使用ICHIMOKU云图的Conversion Line(TENKAN线)和Base Line(KIJUN线)的交叉来判断市场趋势方向。其中,TENKAN线计算方法是过去18根K线的最近高点和最近低点的平均值,代表快速转换线;KIJUN线计算方法是过去58根K线的最近高点和最近低点的平均值,代表标准转换线。
当快速转换线从下方上穿标准转换线时,为看涨信号;当快速转换线从上方下穿标准转换线时,为看跌信号。这样可以捕捉到中短期趋势的转折。
同时,策略还结合ADX指标来过滤调整市场趋势强度。ADX指标能判断趋势的力度,当ADX值大于20时,表示当前趋势较强。所以策略只在ADX大于20时才发出交易信号。
综上,该策略通过TENKAN线和KIJUN线的交叉判断中短期趋势方向,配合ADX指标过滤假突破从而锁定真实趋势,实现追踪中长期趋势的目的。
该策略主要有以下几个优势:
使用ICHIMOKU云图判断趋势方向,这套指标系统本身就较为成熟和可靠,能准确判断趋势转折点。
结合ADX指标过滤调整强度较弱的市场,避免在盘整中频繁交易。
采用1小时线开发策略,能过滤短期市场噪音,只捕捉中长线趋势。
策略较为简单直观,容易理解和跟踪,适合趋势跟踪者使用。
策略回测效果较好,特别在ETH/BTC等大市值币对上表现不俗。
该策略也存在一些风险需要注意:
ICHIMOKU云图本身对参数敏感,不同周期参数的效果差异很大,需要针对不同币对自定义最佳参数。
ADX指标在某些情况下会延迟给出信号,可能导致错过最佳入场时机。
追踪中长线趋势策略,在震荡行情中表现不佳,容易止损。
不同币对和不同时间周期该策略效果差异很大,需要根据自己擅长的品种选择使用。
长期持有仓位风险大,需要适当设定止损和止盈条件。
该策略可以通过调整ADX参数,或加入MACD等其他指标来辅助过滤信号,以减少虚拟信号和提高策略稳定性。也可以通过动态调整参数以适应不同行情类型来获得更好的鲁棒性。
该策略还有以下几个主要优化方向:
动态优化TENKAN线和KIJUN线的参数,使之更好适应实时行情和不同币种。
优化或替换ADX指标,寻找更加灵敏和高效的趋势判断手段。
加入止损止盈策略,控制单笔交易的风险收益比,避免巨亏。
进行组合优化,寻找互补指标形成集成策略,提高稳定性。
对代码结构进行模块化改造,增加自定义参数的灵活度,适应更多品种。
添加量化风控手段,如最大回撤、相关系数等,防范极端行情的风险。
综上所述,该策略整体而言是一个简单实用的趋势跟踪策略。它主要基于TENKAN KIJUN交叉结合ADX指标判断中长线趋势方向并发出交易信号。该策略回测效果较佳,特别适合作用在ETH/BTC等大市值币对,可以获得较为稳定的盈利。但该策略也存在一定的参数依赖性,需要针对不同币种和行情类型进行优化。同时也需要控制单笔交易风险,避免亏损扩大。总的来说,该策略为量化交易者提供了一个有价值的趋势跟踪策略参考。
/*backtest
start: 2023-11-07 00:00:00
end: 2023-12-07 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
strategy(title="Odin's Kraken (TK Cross Strategy)", shorttitle="Odin's Kraken", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
src = input(close, title="Source")
// define tk in ichimoku
conversionPeriods = input(18, minval=1, title="Conversion Line Periods (Tenkan)"),
basePeriods = input(58, minval=1, title="Base Line Periods (Kijun)")
donchian(len) => avg(lowest(len), highest(len))
conversionLine = donchian(conversionPeriods)
baseLine = donchian(basePeriods)
TK_Uptrend = crossover(conversionLine,baseLine)
TK_Downtrend = crossunder(conversionLine,baseLine)
plot(conversionLine, color=lime, title="Tenkan", linewidth=3)
plot(baseLine, color=red, title="Kijun", linewidth=3)
// define ADX
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
th = input(title="threshold", defval=20)
dirmov(len) =>
up = change(high)
down = -change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
truerange = rma(tr, len)
plus = fixnan(100 * rma(plusDM, len) / truerange)
minus = fixnan(100 * rma(minusDM, len) / truerange)
[plus, minus]
adx(dilen, adxlen) =>
[plus, minus] = dirmov(dilen)
sum = plus + minus
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
[plus, minus] = dirmov(dilen)
sig = adx(dilen, adxlen)
// backtesting range
// From Date Inputs
fromDay = input(defval = 3, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2018, title = "From Year", minval = 1970)
// To Date Inputs
toDay = input(defval = 3, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 9, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2019, title = "To Year", minval = 1970)
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true
// open long and short
longCondition = TK_Uptrend
if (longCondition and sig > 12 and time_cond)
strategy.entry("LONG", strategy.long)
shortCondition = TK_Downtrend
if (shortCondition and sig > 12 and time_cond)
strategy.entry("SHORT", strategy.short)
// close trade if backtesting criteria not met
if (not time_cond)
strategy.close_all()