
Strategi ini menggunakan prinsip jurang harga, membeli apabila titik rendah telah dilanggar, dan menetapkan pesanan berhenti dan berhenti untuk mengesan harga terendah untuk berhenti dan membuat keuntungan.
Apabila harga jatuh di bawah paras terendah dalam masa N jam terakhir, masuklah ke dalam selang penempatan dan buat keuntungan mengikut peratusan yang ditetapkan, sambil menetapkan hentian dan hentian. Kemudian, garis hentian dan hentian akan bergerak mengikut keadaan pasaran. Logiknya adalah seperti berikut:
Strategi ini mempunyai kelebihan berikut:
Strategi ini mempunyai beberapa risiko:
Strategi ini juga boleh dioptimumkan dengan:
Strategi ini secara keseluruhan merupakan strategi tracking stop loss yang mudah dan berkesan berdasarkan pemikiran jurang harga. Ia mengurangkan kemungkinan masuk silap, dapat mengunci keuntungan dengan berkesan, dan masih ada ruang untuk pengoptimuman yang besar dalam pengoptimuman dan penapisan parameter, yang patut diteliti dan diperbaiki.
/*backtest
start: 2022-11-21 00:00:00
end: 2023-11-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="Squeeze Backtest by Shaqi v1.0", overlay=true, pyramiding=0, currency="USD", process_orders_on_close=true, commission_type=strategy.commission.percent, commission_value=0.075, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, backtest_fill_limits_assumption=0)
strategy.risk.allow_entry_in(strategy.direction.long)
R0 = "6 Hours"
R1 = "12 Hours"
R2 = "24 Hours"
R3 = "48 Hours"
R4 = "1 Week"
R5 = "2 Weeks"
R6 = "1 Month"
R7 = "Maximum"
buyPercent = input( title="Buy, %", type=input.float, defval=3, minval=0.01, step=0.01, inline="Percents", group="Squeeze Settings") * 0.01
sellPercent = input(title="Sell, %", type=input.float, defval=1, minval=0.01, step=0.01, inline="Percents", group="Squeeze Settings") * 0.01
stopPercent = input(title="Stop Loss, %", type=input.float, defval=1, minval=0.01, maxval=100, step=0.01, inline="Percents", group="Squeeze Settings") * 0.01
isMaxBars = input( title="Max Bars To Sell", type=input.bool, defval=true , inline="MaxBars", group="Squeeze Settings")
maxBars = input( title="", type=input.integer, defval=2, minval=0, maxval=1000, step=1, inline="MaxBars", group="Squeeze Settings")
bind = input( title="Bind", type=input.source, defval=close, group="Squeeze Settings")
isRange = input( title="Fixed Range", type=input.bool, defval=true, inline="Range", group="Backtesting Period")
rangeStart = input( title="", defval=R4, options=[R0, R1, R2, R3, R4, R5, R6, R7], inline="Range", group="Backtesting Period")
periodStart = input(title="Backtesting Start", type=input.time, defval=timestamp("01 Aug 2021 00:00 +0000"), group="Backtesting Period")
periodEnd = input( title="Backtesting End", type=input.time, defval=timestamp("01 Aug 2022 00:00 +0000"), group="Backtesting Period")
int startDate = na
int endDate = na
if isRange
if rangeStart == R0
startDate := timenow - 21600000
endDate := timenow
else if rangeStart == R1
startDate := timenow - 43200000
endDate := timenow
else if rangeStart == R2
startDate := timenow - 86400000
endDate := timenow
else if rangeStart == R3
startDate := timenow - 172800000
endDate := timenow
else if rangeStart == R4
startDate := timenow - 604800000
endDate := timenow
else if rangeStart == R5
startDate := timenow - 1209600000
endDate := timenow
else if rangeStart == R6
startDate := timenow - 2592000000
endDate := timenow
else if rangeStart == R7
startDate := time
endDate := timenow
else
startDate := periodStart
endDate := periodEnd
afterStartDate = (time >= startDate)
beforeEndDate = (time <= endDate)
notInTrade = strategy.position_size == 0
inTrade = strategy.position_size > 0
barsFromEntry = barssince(strategy.position_size[0] > strategy.position_size[1])
entry = strategy.position_size[0] > strategy.position_size[1]
entryBar = barsFromEntry == 0
notEntryBar = barsFromEntry != 0
buyLimitPrice = bind - bind * buyPercent
buyLimitFilled = low <= buyLimitPrice
sellLimitPriceEntry = buyLimitPrice * (1 + sellPercent)
sellLimitPrice = strategy.position_avg_price * (1 + sellPercent)
stopLimitPriceEntry = buyLimitPrice - buyLimitPrice * stopPercent
stopLimitPrice = strategy.position_avg_price - strategy.position_avg_price * stopPercent
if afterStartDate and beforeEndDate and notInTrade
strategy.entry("BUY", true, limit = buyLimitPrice)
strategy.exit("INSTANT", limit = sellLimitPriceEntry, stop = stopLimitPriceEntry)
strategy.cancel("INSTANT", when = inTrade)
if isMaxBars
strategy.close("BUY", when = barsFromEntry >= maxBars, comment = "Don't Sell")
strategy.exit("SELL", limit = sellLimitPrice, stop = stopLimitPrice)
showStop = stopPercent <= 0.03
plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", style=plot.style_linebr, color=color.red, linewidth=1)
plot(sellLimitPrice, title="Take Profit Limit Order", style=plot.style_linebr, color=color.purple, linewidth=1)
plot(strategy.position_avg_price, title="Buy Order Filled Price", style=plot.style_linebr, color=color.blue, linewidth=1)
plot(buyLimitPrice, title="Trailing Buy Limit Order", style=plot.style_stepline, color=color.new(color.blue, 30), offset=1)