Chiến lược giao dịch mua và bán bộ lọc phạm vi ngắn hạn


Ngày tạo: 2023-09-21 21:17:40 sửa đổi lần cuối: 2023-09-21 21:17:40
sao chép: 0 Số nhấp chuột: 854
1
tập trung vào
1617
Người theo dõi

Tổng quan

Chiến lược này dựa trên phạm vi biến động của giá để xác định thời gian mua và bán. Nó tính toán phạm vi biến động giá trong một chu kỳ nhất định và tạo tín hiệu giao dịch với phạm vi đó như là điều kiện lọc.

Nguyên tắc chiến lược

Chỉ số cốt lõi của chiến lược này là phạm vi biến động của giá.

  1. Tính chênh lệch giữa giá cao nhất và giá thấp nhất trong N chu kỳ trước như là giá tăng

  2. Phương pháp làm mịn giá theo đường trung bình, có được bộ lọc phạm vi

  3. Khi giá tăng vượt quá bộ lọc phạm vi, tạo ra tín hiệu mua

  4. Khi giá giảm vượt quá bộ lọc phạm vi, tạo ra tín hiệu bán

Bằng cách này, bạn có thể sử dụng giá phá vỡ phạm vi biến động để đánh giá xu hướng, lọc 123 tiếng ồn giao dịch và có được tín hiệu giao dịch rõ ràng hơn.

Lợi thế chiến lược

  • Sử dụng phạm vi giá thực thể, dễ dàng đánh giá đột phá
  • Phạm vi sóng xử lý mượt mà, lọc tiếng ồn hiệu quả
  • Tín hiệu đột phá, dễ dàng nắm bắt xu hướng đường ngắn
  • Tần số giao dịch cao, phù hợp với hoạt động ngắn
  • Các tham số có thể điều chỉnh, dễ dàng tối ưu hóa cho các giống khác nhau

Rủi ro chiến lược

  • Phân đoạn đột phá dễ bị tăng trở lại
  • Cần tính toán dữ liệu lịch sử dài hơn
  • Thiết lập tham số không đúng sẽ quá nhạy cảm hoặc chậm chạp
  • Không có khả năng kiểm soát hiệu quả, có sự rút lui lớn
  • Hiệu quả có thể bị ảnh hưởng bởi phí giao dịch

Những biện pháp sau đây có thể làm giảm nguy cơ:

  • Phép biến của bộ lọc phạm vi mở rộng thích hợp
  • Tối ưu hóa các tham số, tìm các tham số kết hợp tốt nhất
  • Thiết lập dừng lỗ đường dây hoặc di chuyển dừng lỗ
  • Giảm tần suất giao dịch, giảm chi phí giao dịch
  • Các tham số thử nghiệm theo các giống khác nhau

Hướng tối ưu hóa

Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:

  1. Các tham số chu kỳ khác nhau trong phạm vi tính toán thử nghiệm

  2. Tỷ lệ biến động lọc phạm vi tối ưu hóa

  3. Thêm MACD để xác nhận thứ hai

  4. Sử dụng di chuyển dừng hoặc theo dõi dừng

  5. Các tham số điều chỉnh khác nhau tùy theo giống cụ thể

  6. Cân nhắc tối ưu hóa hệ thống quản lý vị thế

Tóm tắt

Chiến lược này sử dụng phạm vi phá vỡ giá để tạo ra tín hiệu giao dịch ngắn. Điều này có thể xác định hiệu quả các cơ hội xu hướng ngắn hạn. Nhưng cũng dễ bị rủi ro đột phá. Chúng ta có thể cải thiện hệ thống chiến lược bằng các phương pháp như tối ưu hóa tham số, thiết lập quy tắc dừng lỗ, thêm bộ lọc chỉ số để kiểm soát rủi ro và giảm sự rút lui trong khi vẫn giữ được khả năng nhận dạng phá vỡ của nó. Ngoài ra, điều chỉnh tham số cho các đặc điểm khác nhau cũng rất quan trọng.

Mã nguồn chiến lược
/*backtest
start: 2023-08-21 00:00:00
end: 2023-09-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title="Range Filter Buy and Sell 5min [Strategy]", overlay=true, commission_type=strategy.commission.percent, commission_value=0.025, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, slippage=0)

// === INPUT BACKTEST RANGE ===
useDate = input(true,     title='---------------- Use Date ----------------', type=bool)
FromMonth = input(defval = 7, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 25, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true  // create function "within window of time"
// === INPUT BACKTEST RANGE ===


sources = input(defval=close, title="Source")
isHA = input(false, "Use HA Candles", bool)
src = isHA ? security(heikenashi(tickerid), period, sources) : sources
// Sampling Period
// Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters

per = input(defval=50, minval=1, title="Sampling Period")

// Range Multiplier

mult = input(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range

smoothrng(x, t, m)=>
    wper      = (t*2) - 1
    avrng     = ema(abs(x - x[1]), t)
    smoothrng = ema(avrng, wper)*m
    smoothrng
smrng = smoothrng(src, per, mult)

// Range Filter

rngfilt(x, r)=>
    rngfilt  = x
    rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r))
    rngfilt
filt = rngfilt(src, smrng)

// Filter Direction

upward   = 0.0
upward  := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands

hband = filt + smrng
lband = filt - smrng

// Colors

filtcolor = upward > 0 ? lime : downward > 0 ? red : orange
barcolor  = (src > filt) and (src > src[1]) and (upward > 0) ? lime : (src > filt) and (src < src[1]) and (upward > 0) ? green : 
   (src < filt) and (src < src[1]) and (downward > 0) ? red : (src < filt) and (src > src[1]) and (downward > 0) ? maroon : orange

filtplot = plot(filt, color=filtcolor, linewidth=3, title="Range Filter")

// Target

hbandplot = plot(hband, color=aqua, transp=100, title="High Target")
lbandplot = plot(lband, color=fuchsia, transp=100, title="Low Target")

// Fills

fill(hbandplot, filtplot, color=aqua, title="High Target Range")
fill(lbandplot, filtplot, color=fuchsia, title="Low Target Range")

// Bar Color

//barcolor(barcolor)

// Break Outs 

longCond = na
shortCond = na
longCond := ((src > filt) and (src > src[1]) and (upward > 0)) or ((src > filt) and (src < src[1]) and (upward > 0)) 
shortCond := ((src < filt) and (src < src[1]) and (downward > 0)) or ((src < filt) and (src > src[1]) and (downward > 0))

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

//Alerts

plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = white, style=shape.labelup, size = size.normal, location=location.belowbar, color = green, transp = 0)
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = red, transp = 0)

//strategy.entry("Long", strategy.long, stop = hband, when = window() , comment="Long")
//strategy.entry("Short", strategy.short, stop = lband, when = window() , comment="Short")

strategy.entry("Long", strategy.long, when = longCondition and window() , comment="Long")
strategy.entry("Short", strategy.short, when = shortCondition and window() , comment="Short")



// === Stop LOSS ===
useStopLoss = input(false, title='----- Use Stop Loss / Take profit -----', type=bool)
sl_inp = input(100, title='Stop Loss %', type=float, step=0.25)/100
tp_inp = input(1.5, title='Take Profit %', type=float, step=0.25)/100
stop_level = strategy.position_avg_price * (1 - sl_inp)
take_level = strategy.position_avg_price * (1 + tp_inp)
stop_level_short = strategy.position_avg_price * (1 + sl_inp)
take_level_short = strategy.position_avg_price * (1 - tp_inp)
// === Stop LOSS ===

if useStopLoss
    strategy.exit("Stop Loss/Profit Long","Long", stop=stop_level, limit=take_level)
    strategy.exit("Stop Loss/Profit Short","Short", stop=stop_level_short, limit=take_level_short)