该策略主要用于自动化BTC的长线投资。通过双EMA和LSMA的交叉来判断趋势方向,并使用ATR指标计算动态止损,实现对BTC多头趋势的有效跟踪。
使用25期EMA和100期LSMA构成双均线,它们的交叉用来判断行情趋势。EMA快速响应价格变化,LSMA滤波假突破。
当快速EMA上穿缓慢LSMA时判断为仍处于多头趋势,这时做多;反之当快速EMA下穿缓慢LSMA时判断为进入空头,此时平仓。
进入做多后,使用ATR指标计算的动态止损不断调整,实现对BTC上涨趋势的有效跟踪。具体来说,止损线初始点为进场价格,之后每次调整都会向上滑移固定比例的ATR幅度。
止损线能够有效锁定BTC上涨带来的浮盈,同时防止止损点过于靠近最新价格导致频繁止损。此外,策略还设置了两个不同比例的移动止盈,用于锁定更多利润。
使用双均线判断趋势更可靠,能有效防止产生假信号。
ATR动态跟踪止损,既能锁定大部分利润,也可避免频繁小止损。
无论多头行情是否结束,只要均线发出退出信号就会止损了结,风险控制到位。
自动化程度高,无需人工干预,便于实盘长时间运行。
仍需关注突发重大消息面,避免巨额滑点损失。
虽然双均线结合能减少假信号,但在震荡行情中也难以完全避免。
ATR参数设置不当也会影响止损效果,需要根据不同品种调整。
均线周期不合理或者未能及时更新也会导致信号产生滞后。
保证服务器稳定性,避免异常宕机导致自动交易中断。
可以尝试加入更多指标判断趋势,如布林带。或者使用机器学习模型预测价格。
ATR动态止损的计算方法还可进行调整优化,使止损更平滑。
可以添加基于交易量、日内轮动 FEATURE的报警机制来防范重大消息面的冲击。
不同币种参数不尽相同,可以使用更多历史数据训练出个性化参数。
本策略总体来说是一个非常实用的BTC自动投资程序。使用双EMA判断大趋势非常可靠,再辅以ATR跟踪止损,既可以获得不错的盈利,有效期也可以拉的很长。随着参数不断优化调整,本策略的效果还大有提升空间,非常值得实盘验证。
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Wunderbit Trading
//@version=4
strategy("Automated Bitcoin (BTC) Investment Strategy", overlay=true, initial_capital=5000,pyramiding = 0, currency="USD", default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent,commission_value=0.1)
//////////// Functions
Atr(p) =>
atr = 0.
Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1])))
atr := nz(atr[1] + (Tr - atr[1])/p,Tr)
//TEMA
TEMA(series, length) =>
if (length > 0)
ema1 = ema(series, length)
ema2 = ema(ema1, length)
ema3 = ema(ema2, length)
(3 * ema1) - (3 * ema2) + ema3
else
na
tradeType = input("LONG", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH", "NONE"])
///////////////////////////////////////////////////
/// INDICATORS
source=close
/// TREND
trend_type1 = input("TEMA", title ="First Trend Line : ", options=["LSMA", "TEMA","EMA","SMA"])
trend_type2 = input("LSMA", title ="First Trend Line : ", options=["LSMA", "TEMA","EMA","SMA"])
trend_type1_length=input(25, "Length of the First Trend Line")
trend_type2_length=input(100, "Length of the Second Trend Line")
leadLine1 = if trend_type1=="LSMA"
linreg(close, trend_type1_length, 0)
else if trend_type1=="TEMA"
TEMA(close,trend_type1_length)
else if trend_type1 =="EMA"
ema(close,trend_type1_length)
else
sma(close,trend_type1_length)
leadLine2 = if trend_type2=="LSMA"
linreg(close, trend_type2_length, 0)
else if trend_type2=="TEMA"
TEMA(close,trend_type2_length)
else if trend_type2 =="EMA"
ema(close,trend_type2_length)
else
sma(close,trend_type2_length)
p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)
//Upward Trend
UT=crossover(leadLine1,leadLine2)
DT=crossunder(leadLine1,leadLine2)
// TP/ SL/ FOR LONG
// TAKE PROFIT AND STOP LOSS
long_tp1_inp = input(15, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(20, title="Long Take Profit 1 Qty", step=1)
long_tp2_inp = input(30, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(20, title="Long Take Profit 2 Qty", step=1)
long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)
long_sl_input = input(5, title='stop loss in %', step=0.1)/100
long_sl_input_level = strategy.position_avg_price * (1 - long_sl_input)
// Stop Loss
multiplier = input(3.5, "SL Mutiplier", minval=1, step=0.1)
ATR_period=input(8,"ATR period", minval=1, step=1)
// Strategy
//LONG STRATEGY CONDITION
SC = input(close, "Source", input.source)
SL1 = multiplier * Atr(ATR_period) // Stop Loss
Trail1 = 0.0
Trail1 := iff(SC < nz(Trail1[1], 0) and SC[1] < nz(Trail1[1], 0), min(nz(Trail1[1], 0), SC + SL1), iff(SC > nz(Trail1[1], 0), SC - SL1, SC + SL1))
Trail1_high=highest(Trail1,50)
// iff(SC > nz(Trail1[1], 0) and SC[1] > nz(Trail1[1], 0), max(nz(Trail1[1], 0), SC - SL1),
entry_long=crossover(leadLine1,leadLine2) and Trail1_high < close
exit_long = close < Trail1_high or crossover(leadLine2,leadLine1) or close < long_sl_input_level
///// BACKTEST PERIOD ///////
testStartYear = input(2016, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)
testStopYear = input(9999, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)
testPeriod() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
if testPeriod()
if tradeType=="LONG" or tradeType=="BOTH"
if strategy.position_size == 0 or strategy.position_size > 0
strategy.entry("long", strategy.long, comment="b8f60da7_ENTER-LONG_BINANCE_BTC/USDT_b8f60da7-BTC-Investment_4H", when=entry_long)
strategy.exit("TP1", "long", qty_percent=long_tp1_qty, limit=long_take_level_1)
strategy.exit("TP2", "long", qty_percent=long_tp2_qty, limit=long_take_level_2)
strategy.close("long", when=exit_long, comment="b8f60da7_EXIT-LONG_BINANCE_BTC/USDT_b8f60da7-BTC-Investment_4H" )
// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? Trail1_high : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")