
该策略是基于著名的海龟交易系统开发的,尽可能遵循原始规则。它是一个追踪趋势的系统,通过双均线形成进入和退出信号。
该策略具有以下优势:
该策略也存在一些风险:
可以通过以下方式降低风险:
该策略可以从以下几个方面进行优化:
本策略通过追踪趋势获得收益,具有一定的回测优势。但实盘效果仍需检验,需要进一步优化参数稳健性,完善止损和仓位管理模块,才能使策略更适合实盘交易。总体来说,该策略思路合理,有很大的改进潜力。
/*backtest
start: 2022-10-30 00:00:00
end: 2023-11-05 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="Turtle", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, commission_type=strategy.commission.percent, commission_value=0.1, pyramiding=5)
stopInput = input(2.0, "Stop N", step=.5)
pyramidInput = input(1, "Pyramid N", step=.5)
l1LongInput = input(20, "L1 Long", minval=5)
l2LongInput = input(55, "L2 Long", minval=5)
l1LongExitInput = input (10, "L1 Long Exit", minval=5)
l2LongExitInput = input (20, "L2 Long Exit", minval=5)
FromYear = input(2000, "From Year", minval=1900), FromMonth = input(1, "From Month", minval=1, maxval=12), FromDay = input(1, "From Day", minval=1, maxval=31)
ToYear = input(9999, "To Year", minval=1900), ToMonth = input(1, "To Month", minval=1, maxval=12), ToDay = input(1, "To Day", minval=1, maxval=31)
FromDate = timestamp(FromYear, FromMonth, FromDay, 00, 00), ToDate = timestamp(ToYear, ToMonth, ToDay, 23, 59)
TradeDateIsAllowed() => time >= FromDate and time <= ToDate
l1Long = highest(l1LongInput)
l1LongExit = lowest(l1LongExitInput)
l2Long = highest(l2LongInput)
l2LongExit = lowest(l2LongExitInput)
//
// ADX, +-DI
// https://www.tradingview.com/script/rlMJ05yl-ADX-and-DI-pine-script-3-0/
//
len = 14
th = 20
TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus = 0.0
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus
DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = sma(DX, len)
// Back to Turtle
filter = true // not (DIPlus < ADX and DIMinus < ADX) and DIPlus > DIMinus
var win = false
var totalPrice = 0.0
var buyPrice = 0.0
var avgPrice = 0.0
var nextBuyPrice = 0.0
var stopPrice = 0.0
var totalBuys = 0
var bool inBuy = false
var float l1LongPlot = highest(l1LongInput)
var float l2LongPlot = highest(l2LongInput)
n = atr(14)
var mode = 'L1'
string longLevel = na
if not inBuy
l1LongPlot := highest(l1LongInput)[1]
l2LongPlot := highest(l2LongInput)[1]
if (close > l2Long[1] and filter)
mode := 'L2'
if TradeDateIsAllowed()
strategy.close_all()
strategy.entry("long", strategy.long, comment="L2")
longLevel := 'L2'
win := false
buyPrice := close
totalBuys := 1
totalPrice := buyPrice
avgPrice := buyPrice
stopPrice := close-(stopInput*n)
nextBuyPrice := high+(pyramidInput*n)
inBuy := true
else
if (close > l1Long[1] and filter)
mode := 'L1'
if not win
if TradeDateIsAllowed()
strategy.close_all()
strategy.entry("long", strategy.long, comment="L1")
longLevel := 'L1'
win := false
buyPrice := close
totalBuys := 1
totalPrice := buyPrice
avgPrice := buyPrice
stopPrice := close-(stopInput*n)
nextBuyPrice := high+(pyramidInput*n)
inBuy := true
else
inBuy := false
else
l1LongPlot := l1LongPlot[1]
l2LongPlot := l2LongPlot[1]
if close > nextBuyPrice and TradeDateIsAllowed() and totalBuys < 6
strategy.entry("long", strategy.long, comment="LP")
longLevel := 'P'
stopPrice := close-(stopInput*n)
nextBuyPrice := high+(pyramidInput*n)
totalBuys := totalBuys + 1
totalPrice := totalPrice + buyPrice
avgPrice := totalPrice / totalBuys
if (close < stopPrice)
inBuy := false
if TradeDateIsAllowed()
if (close >= avgPrice)
longLevel := 'SG'
else
longLevel := 'SR'
strategy.close("long", strategy.long)
win := false
buyPrice := 0
avgPrice := 0
else
if (mode == 'L1' and close > l2Long[1] and filter)
if win
inBuy := true
win := false
mode := 'L2'
if TradeDateIsAllowed()
strategy.close_all()
longLevel := 'L2'
strategy.entry("long", strategy.long, comment="L2")
buyPrice := close
totalBuys := 1
totalPrice := buyPrice
avgPrice := buyPrice
stopPrice := close-(stopInput*n)
nextBuyPrice := close+(pyramidInput*n)
else
if (close < l1LongExit[1] or close < l2LongExit[1])
inBuy := false
if TradeDateIsAllowed()
strategy.close("long", strategy.long)
if close < avgPrice
longLevel := 'SR'
win := false
else
longLevel := 'SG'
win := true
buyPrice := 0
plot(l1LongPlot, title="l1 long", linewidth=3, style=plot.style_stepline, color=color.green)
plot(l1LongExit[1], title="l1 exit", linewidth=3, style=plot.style_stepline, color=color.red)
plot(l2LongPlot, title="l2 long", linewidth=2, style=plot.style_stepline, color=color.green)
plot(l2LongExit[1], title="l2 exit", linewidth=2, style=plot.style_stepline, color=color.red)
plot(stopPrice, title="stop", linewidth=2, style=plot.style_stepline, color=color.purple)
plotarrow(longLevel == 'L1' ? 1 : 0, colordown=color.black, colorup=color.green, transp=40)
plotarrow(longLevel == 'L2' ? 1 : 0, colordown=color.black, colorup=color.purple, transp=40)
plotarrow(longLevel == 'SR' ? -1 : 0, colordown=color.red, colorup=color.purple, transp=40)
plotarrow(longLevel == 'SG' ? -1 : 0, colordown=color.green, colorup=color.purple, transp=40)