未来一段时间,我会从tradingview上挑选优秀的策略分享给大家。 如何判定一个策略的优秀呢? 对比特币和以太坊进行日线级别回测,平均表现都中等偏上的策略。前期我先主观挑选,后期策略多了之后,在对比平均值。 今天分享的策略是利用不同的加权移动平均线、指数移动平均线、交易量加权移动平均线和MACD等参数综合形成的一个策略,其中运用了多重但并不复杂的运算。 作者:SeaSide420 在Tradingview可以直接搜索,作者和此策略链接见文末。 数据使用:Bitstamp交易所 btc/usd 起始日期 2011年8月18日,时价10.9美元,之后最低2.22美元。 eth/usd 起始日期 2017年8月17日,时价300美元 手续费:千二 截止到当下,回测结果: btc/usd 收益率 1852288.48%,18522.88倍。 eth/usd 收益率 4419%,44.19倍 这是固定交易策略的收益率,尽量不要和买了就拿着不动对比,否则策略就没了意义。 下面给出策略的完整代码以及每一行代码的详解。 完整代码如下: strategy(“MultiCross420”, overlay=true, calc_on_order_fills= true, calc_on_every_tick=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=0) keh=input(title=”Double HullMA 1”,type=integer,defval=7, minval=1) teh=input(title=”Double HullMA 2”,type=integer,defval=14, minval=1) meh=input(title=”VWMA”,type=integer,defval=1, minval=1) meh1=vwma(close,round(meh)) n2ma=2*wma(close,round(keh/2)) nma=wma(close,keh) diff=n2ma-nma,sqn=round(sqrt(keh)) n2ma1=2*wma(close[2],round(keh/2)) nma1=wma(close [2],keh) diff1=n2ma1-nma1,sqn1=round(sqrt(keh)) n1=wma(diff,sqn) n2=wma(diff1,sqn) b=n1>n2?lime:red c=n1>n2?green:red n2ma3=2*wma(close,round(teh/2)) nma2=wma(close,teh) diff2=n2ma3-nma2,sqn2=round(sqrt(teh)) n2ma4=2*wma(close [2],round(teh/2)) nma3=wma(close [2],teh) diff3=n2ma4-nma3,sqn3=round(sqrt(teh)) n3=wma(diff2,sqn2) n4=wma(diff3,sqn3) fastLength = input(title=”MacD fastLength”, type=integer,defval=7) slowlength = input(title=”MacD slowlength”, type=integer,defval=14) MACDLength = input(title=”MacD Length”, type=integer,defval=3) MACD = ema(close, fastLength) - ema(close, slowlength) aMACD = ema(MACD, MACDLength) delta = MACD - aMACD a1=plot(n1,color=c),a2=plot(n2,color=c) plot(cross(n1, n2) ? n1 : na, style = cross, color=b, linewidth = 3) a3=plot(n3,color=c),a4=plot(n4,color=c) plot(cross(n3, n4) ? n1 : na, style = cross, color=b, linewidth = 3) //a5=plot(meh1,color=c) long = input(title=”TSI Long Length”, type=integer, defval=5) short = input(title=”TSI Short Length”, type=integer, defval=3) signal = input(title=”TSI Signal Length”, type=integer, defval=2) linebuy = input(title=”TSI Upper Line”, type=integer, defval=4) linesell = input(title=”TSI Lower Line”, type=integer, defval=-4) price = close double_smooth(src, long, short) => fist_smooth = ema(src, long) ema(fist_smooth, short) pc = change(price) double_smoothed_pc = double_smooth(pc, long, short) double_smoothed_abs_pc = double_smooth(abs(pc), long, short) tsi_value = 100 * (double_smoothed_pc / double_smoothed_abs_pc) closelong = n1<n2 and="" n3meh1 if(closelong) strategy.close(“Long”) closeshort = n1>n2 and n3>n4 and n1<meh1 if (closeshort) strategy.close(“Short”) longCondition = strategy.opentrades<1 and n1>n2 and MACD>aMACD and n1n4 and ema(tsi_value, signal)>linesell if (longCondition) strategy.entry(“Long”,strategy.long) shortCondition = strategy.opentrades<1 and n1<n2 and="" macdmeh1 and n3<n4 and ema(tsi_value, signal)<linebuy if (shortCondition) strategy.entry(“Short”,strategy.short)
定义策略标题和初始参数 strategy(“MultiCross420”, overlay=true, calc_on_order_fills= true, calc_on_every_tick=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=0) “MultiCross420”:标题(title),必填参数。 overlay=true:是设置此策略最终现实再K线图上。 calc_on_order_fills=true:是可选布尔参数,当为true时,策略在订单执行后立即执行附加的K线柱内其他的订单计算。 default_qty_type=strategy.percent_of_equity:可选参数,默认订单形式,strategy.percent_of_equity是指基于仓位权益比例的大小下订单。比如每次开单的比例为总仓位的10%等。 default_qty_value=100:可选浮点参数,设置默认订单大小的数量,也就是上面的‘10%’,这里为100,含义是每次开单都是全仓。 pyramiding=0:同一方向可以开单的数量,为0是默认只能开一单。即当下的单子平仓之前,不能再开单子。 定义输入函数 keh=input(title=”Double HullMA 1”,type=integer,defval=7, minval=1) teh=input(title=”Double HullMA 2”,type=integer,defval=14, minval=1) meh=input(title=”VWMA”,type=integer,defval=1, minval=1) 利用input()函数来设置输入选项。 Keh和teh是两条双HullMA移动平均线的参数输入函数,分别定义了输入类型,默认值和最小值。 Meh是成交量加权移动平均线的参数输入函数,定义了输入类型,默认值和最小值。 计算交易策略变量 meh1=vwma(close,round(meh)) n2ma=2*wma(close,round(keh/2)) nma=wma(close,keh) diff=n2ma-nma,sqn=round(sqrt(keh)) n2ma1=2*wma(close[2],round(keh/2)) nma1=wma(close[2],keh) diff1=n2ma1-nma1,sqn1=round(sqrt(keh)) n1=wma(diff,sqn) n2=wma(diff1,sqn) b=n1>n2?lime:red c=n1>n2?green:red n2ma3=2*wma(close,round(teh/2)) nma2=wma(close,teh) diff2=n2ma3-nma2,sqn2=round(sqrt(teh)) n2ma4=2*wma(close[2],round(teh/2)) nma3=wma(close[2],teh) diff3=n2ma4-nma3,sqn3=round(sqrt(teh)) n3=wma(diff2,sqn2) n4=wma(diff3,sqn3) meh1=vwma(close,round(meh)) 定义成交量加权移动平均线,数据源为收盘价,取K线柱数为meh结果的四舍五入值。 n2ma=2*wma(close,round(keh/2)) 定义2倍的加权移动平均线n2ma,数据源为收盘价,取K线柱数为(keh/2)结果的四舍五入值。 nma=wma(close,keh) 定义加权移动平均线nma,数据源为收盘价,取K线柱数为整形自变量keh diff=n2ma-nma,sqn=round(sqrt(keh)) 定义两条加权移动平均线的差值diff,变量sqn为—keh的开平方再进行四舍五入 n2ma1=2*wma(close[2],round(keh/2)) 定义2倍的加权移动平均线n2ma1,数据源为从当前K线柱往左数两个的K线柱的收盘价,取K线柱数为(keh/2)结果的四舍五入值 nma1=wma(close[2],keh) 定义加权移动平均线nma1,数据源为从当前K线柱往左数两个的K线柱的收盘价,取K线柱数为keh diff1=n2ma1-nma1,sqn1=round(sqrt(keh)) 定义两条加权移动平均线的差值diff,变量sqn为—keh的开平方再进行四舍五入 n1=wma(diff,sqn) 定义加权移动平均线n1,数据源为diff,取数据个数为sqn n2=wma(diff1,sqn) 定义加权移动平均线n2,数据源为diff1,取数据个数为sqn b=n1>n2?lime:red 用三元条件运算定义变量b,若n1>n2为true,赋值颜色lime给b,若n1>n2为false,则赋值颜色red给b c=n1>n2?green:red 用三元条件运算定义变量c,若n1>n2为true,赋值颜色green给c,若n1>n2为false,则赋值颜色red给c n2ma3=2*wma(close,round(teh/2)) 定义2倍的加权移动平均线n2ma3,数据源为收盘价,取K线柱数为取K线柱数为(teh/2)结果的四舍五入值 nma2=wma(close,teh) 定义加权移动平均线nma2,数据源为收盘价,取K线柱数为keh diff2=n2ma3-nma2,sqn2=round(sqrt(teh)) 定义两条加权移动平均线的差值diff2,变量sqn2为—teh的开平方再进行四舍五入 n2ma4=2*wma(close[2],round(teh/2)) 定义2倍的加权移动平均线n2ma4,数据源为从当前K线柱往左数两个的K线柱的收盘价,取K线柱数为(teh/2)结果的四舍五入值 nma3=wma(close[2],teh) 定义加权移动平均线nma3,数据源为从当前K线柱往左数两个的K线柱的收盘价,取K线柱数为teh diff3=n2ma4-nma3,sqn3=round(sqrt(teh)) 定义两条加权移动平均线的差值diff3,变量sqn3为—teh的开平方再进行四舍五入 n3=wma(diff2,sqn2) 定义加权移动平均线n3,数据源为diff2,取数据个数为sqn2 n4=wma(diff3,sqn3) 定义加权移动平均线n4,数据源为diff3,取数据个数为sqn3 定义MACD相关输入函数 fastLength = input(title=”MacD fastLength”, type=integer,defval=7) slowlength = input(title=”MacD slowlength”, type=integer,defval=14) 定义两个Macd数据长度MacD fastLengthhe和MacD slowlength的输入函数,设置了title、类型和默认值 MACDLength = input(title=”MacD Length”, type=integer,defval=3) 定义Macd数据长度MacD Lengthhe的输入函数,设置了title、类型和默认值 MACD = ema(close, fastLength) - ema(close, slowlength) 定义MACD aMACD = ema(MACD, MACDLength) 定义aMACD delta = MACD - aMACD 定义差值 a1=plot(n1,color=c),a2=plot(n2,color=c) 两个以n1和n2为自变量的输出变量a1和a2 plot(cross(n1, n2) ? n1 : na, style = cross, color=b, linewidth = 3) 输出显示函数,若n1和n2交叉,则输出显示形式为“+”号,颜色为b,线宽为3,如果无交叉,则不输出。 a3=plot(n3,color=c),a4=plot(n4,color=c) 两个以n3和n4为自变量的输出变量a3和a4 plot(cross(n3, n4) ? n1 : na, style = cross, color=b, linewidth = 3) 输出显示函数,若n3和n4交叉,则输出显示形式为“+”号,颜色为b,线宽为3,如果无交叉,则不输出。 //a5=plot(meh1,color=c) 以meh1为自变量的输出变量a5 long = input(title=”TSI Long Length”, type=integer, defval=5) 定义数据长度TSI Long Length的输入函数long,设置了title、类型和默认值 short = input(title=”TSI Short Length”, type=integer, defval=3) 定义数据长度TSI Short Length的输入函数short,设置了title、类型和默认值 signal = input(title=”TSI Signal Length”, type=integer, defval=2) 定义数据长度TSI Signal Length的输入函数signal,设置了title、类型和默认值 linebuy = input(title=”TSI Upper Line”, type=integer, defval=4) 定义数据长度TSI Upper Line的输入函数linebuy,设置了title、类型和默认值 linesell = input(title=”TSI Lower Line”, type=integer, defval=-4) 定义数据长度TSI Lower Line的输入函数linesell,设置了title、类型和默认值 计算交易策略变量2 price = close 赋值收盘价给变量price double_smooth(src, long, short) => fist_smooth = ema(src, long) ema(fist_smooth, short) 定义函数double_smooth,自变量为src, long, short,输出为ema (fist_smooth, short) pc = change(price) 赋值当前收盘价和前一个收盘价的变化量给变量pc double_smoothed_pc = double_smooth(pc, long, short) 赋值定义变量double_smoothed_pc,为函数double_smooth,自变量为src, long, short double_smoothed_abs_pc = double_smooth(abs(pc), long, short) 赋值定义变量double_smoothed_abs_pc,为函数double_smooth,自变量为abs(pc), long, short tsi_value = 100 * (double_smoothed_pc / double_smoothed_abs_pc) 赋值定义变量tsi_value,为double_smoothed_pc /和double_smoothed_abs_pc的比值百分比 定义开单条件并建立头寸 closelong = n1<n2 and="" n3meh1 定义关闭做多的条件变量closelong if(closelong) strategy.close(“Long”) 退出多头交易头寸命令 closeshort = n1>n2 and n3>n4 and n1<meh1 定义关闭做空的条件变量closeshort if (closeshort) strategy.close(“Short”) 退出多头交易头寸命令 longCondition = strategy.opentrades<1 and n1>n2 and MACD>aMACD and n1n4 and ema(tsi_value, signal)>linesell 定义做多的条件变量closeshort if (longCondition) strategy.entry(“Long”,strategy.long) 用开单命令建立多头交易头寸 shortCondition = strategy.opentrades<1 and n1<n2 and="" macdmeh1 and n3<n4 and ema(tsi_value, signal)<linebuy 定义做空的条件变量closeshort if (shortCondition) strategy.entry(“Short”,strategy.short) 用开单命令建立空头交易头寸 有兴趣的可以复制脚本进行试验,也可以直接点击作者及策略链接。 有想制定自己的指标和交易策略的伙伴,欢迎大家添加微信jinvlog交流。 注册Tradingview平台,点击Tradingview。
—-
编译者/作者:金金
玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。
|