Chiến lược giao dịch động lực lọc hai phạm vi

Tác giả:ChaoZhang, Ngày: 2024-04-01 10:54:47
Tags:

img

Tổng quan

Chiến lược này là một chiến lược giao dịch động lực dựa trên bộ lọc phạm vi kép. Chiến lược tính toán các phạm vi trơn tru cho các giai đoạn nhanh và chậm để có được bộ lọc phạm vi toàn diện, được sử dụng để xác định xu hướng giá hiện tại. Khi giá vượt qua trên / dưới phạm vi này, chiến lược tạo ra tín hiệu mua / bán. Ngoài ra, chiến lược đặt bốn mức lợi nhuận theo gradient và một mức dừng lỗ để kiểm soát rủi ro và khóa lợi nhuận.

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

  1. Tính toán các phạm vi trơn tru cho các khoảng thời gian nhanh và chậm.
  2. Sử dụng trung bình của các phạm vi nhanh và chậm như bộ lọc phạm vi toàn diện (TRF).
  3. Xác định xu hướng tăng và giảm bằng cách so sánh giá hiện tại với giá trước đó.
  4. Tính toán các băng tần động trên (FUB) và dưới (FLB) làm tham chiếu cho xu hướng.
  5. Tạo tín hiệu mua và bán dựa trên mối quan hệ giữa giá đóng cửa và TRF.
  6. Thiết lập bốn mức lợi nhuận gradient và một mức dừng lỗ, tương ứng với tỷ lệ phần trăm vị trí khác nhau và tỷ lệ phần trăm lợi nhuận/mất.

Phân tích lợi thế

  1. Bộ lọc hai phạm vi kết hợp các khoảng thời gian nhanh và chậm, cho phép chiến lược thích nghi với nhịp độ thị trường khác nhau và nắm bắt nhiều cơ hội giao dịch hơn.
  2. Thiết kế các dải trên và dưới năng động giúp chiến lược phù hợp với xu hướng hiện tại và giảm tín hiệu sai.
  3. Bốn mức lợi nhuận giảm dần cho phép chiến lược đảm bảo lợi nhuận nhiều hơn khi xu hướng tiếp tục trong khi khóa lợi nhuận một phần khi xu hướng đảo ngược.
  4. Cài đặt stop-loss giúp kiểm soát mức lỗ tối đa cho mỗi giao dịch và bảo vệ an toàn tài khoản.

Phân tích rủi ro

  1. Trong thời gian biến động thị trường hoặc điều kiện giới hạn phạm vi, chiến lược có thể tạo ra nhiều tín hiệu sai, dẫn đến thương mại và lỗ hoa hồng thường xuyên.
  2. Các cài đặt lợi nhuận theo gradient có thể khiến một số lợi nhuận bị khóa sớm, ngăn chặn chiến lược tận dụng đầy đủ các biến động xu hướng.
  3. Cài đặt stop-loss có thể không hoàn toàn tránh được các lỗ cực lớn do các sự kiện thiên nga đen gây ra.

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

  1. Xem xét việc kết hợp nhiều chỉ số kỹ thuật hoặc chỉ số tâm lý thị trường như là điều kiện phụ cho việc xác định xu hướng để giảm tín hiệu sai.
  2. Đối với các thiết lập lấy lợi nhuận và dừng lỗ, điều chỉnh động theo môi trường thị trường và các công cụ giao dịch khác nhau để cải thiện khả năng thích nghi của chiến lược.
  3. Dựa trên kết quả backtesting, tối ưu hóa thêm các thiết lập tham số, chẳng hạn như lựa chọn các khoảng thời gian nhanh và chậm, và các thiết lập tỷ lệ phần trăm cho mức lợi nhuận và dừng lỗ, để tăng sự ổn định và lợi nhuận của chiến lược.

Tóm lại

Chiến lược giao dịch động lực lọc hai phạm vi xây dựng một bộ lọc toàn diện bằng cách sử dụng các phạm vi mượt mà từ các giai đoạn nhanh và chậm, kết hợp với các băng tần trên và dưới năng động để xác định xu hướng giá và tạo ra tín hiệu mua / bán. Chiến lược cũng thiết lập bốn mức lợi nhuận theo gradient và một mức dừng lỗ để kiểm soát rủi ro và khóa lợi nhuận. Chiến lược này phù hợp để sử dụng trong các thị trường xu hướng nhưng có thể tạo ra nhiều tín hiệu sai hơn trong các thị trường biến động. Trong tương lai, hãy xem xét giới thiệu nhiều chỉ số hơn, tối ưu hóa cài đặt lợi nhuận và dừng lỗ và điều chỉnh các tham số một cách năng động để cải thiện khả năng thích nghi và ổn định của chiến lược.


/*backtest
start: 2024-03-01 00:00:00
end: 2024-03-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
//@version=5
strategy(title='2"Twin Range Filter', overlay=true)
strat_dir_input = input.string(title='İşlem Yönü', defval='Alis', options=['Alis', 'Satis', 'Tum'])
strat_dir_value = strat_dir_input == 'Alis' ? strategy.direction.long : strat_dir_input == 'Satis' ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)

////////////////////////////

// Backtest inputs
BaslangicAy = input.int(defval=1, title='İlk ay', minval=1, maxval=12)
BaslangicGun = input.int(defval=1, title='İlk Gün', minval=1, maxval=31)
BaslangicYil = input.int(defval=2023, title='İlk Yil', minval=2000)
SonAy = input.int(defval=1, title='Son Ay', minval=1, maxval=12)
SonGun = input.int(defval=1, title='Son Gün', minval=1, maxval=31)
SonYil = input.int(defval=9999, title='Son Yıl', minval=2000)

start = timestamp(BaslangicYil, BaslangicAy, BaslangicGun, 00, 00)  // backtest start window
finish = timestamp(SonYil, SonAy, SonGun, 23, 59)  // backtest finish window
window() => true

source = input(defval=close, title='Source')
showsignals = input(title='Show Buy/Sell Signals ?', defval=true)
per1 = input.int(defval=27, minval=1, title='Fast period')
mult1 = input.float(defval=1.6, minval=0.1, title='Fast range')
per2 = input.int(defval=55, minval=1, title='Slow period')
mult2 = input.float(defval=2, minval=0.1, title='Slow range')
smoothrng(x, t, m) =>
    wper = t * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.ema(avrng, wper) * m
    smoothrng
smrng1 = smoothrng(source, per1, mult1)
smrng2 = smoothrng(source, per2, mult2)
smrng = (smrng1 + smrng2) / 2
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(source, smrng)
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])
STR = filt + smrng
STS = filt - smrng
FUB = 0.0
FUB := STR < nz(FUB[1]) or close[1] > nz(FUB[1]) ? STR : nz(FUB[1])
FLB = 0.0
FLB := STS > nz(FLB[1]) or close[1] < nz(FLB[1]) ? STS : nz(FLB[1])
TRF = 0.0
TRF := nz(TRF[1]) == FUB[1] and close <= FUB ? FUB : nz(TRF[1]) == FUB[1] and close >= FUB ? FLB : nz(TRF[1]) == FLB[1] and close >= FLB ? FLB : nz(TRF[1]) == FLB[1] and close <= FLB ? FUB : FUB
al = ta.crossover(close, TRF)
sat = ta.crossunder(close, TRF)
plotshape(showsignals and al, title='Long', text='BUY', style=shape.labelup, textcolor=color.white, size=size.tiny, location=location.belowbar, color=color.rgb(0, 19, 230))
plotshape(showsignals and sat, title='Short', text='SELL', style=shape.labeldown, textcolor=color.white, size=size.tiny, location=location.abovebar, color=color.rgb(0, 19, 230))
alertcondition(al, title='Long', message='Long')
alertcondition(sat, title='Short', message='Short')
Trfff = plot(TRF)
mPlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0)
longFillColor = close > TRF ? color.green : na
shortFillColor = close < TRF ? color.red : na
fill(mPlot, Trfff, title='UpTrend Highligter', color=longFillColor, transp=90)
fill(mPlot, Trfff, title='DownTrend Highligter', color=shortFillColor, transp=90)

//////////////////////



renk1 = input(true, "Mum Renk Ayarları?")
mumrenk = input(true,title="Trend Bazlı Mum Rengi Değişimi?")
htaColor = renk1 ? (al ? color.rgb(224, 230, 57) : #E56337) : #c92626
barcolor(color = mumrenk ? (renk1 ? htaColor : na) : na)
if (al) and window()
    strategy.entry("Al", strategy.long)
if (sat) and window()
    strategy.entry("Sat", strategy.short)


per1(pcnt) =>
    strategy.position_size != 0 ? math.round(pcnt / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)
zarkesmgb = input.float(title='Zarar Kes Yüzdesi', defval=100, minval=0.01)
zarkeslos = per1(zarkesmgb)
q1 = input.int(title='Satış Lot Sayısı 1.Kısım %', defval=5, minval=1)
q2 = input.int(title='Satış Lot Sayısı 2.Kısım %', defval=8, minval=1)
q3 = input.int(title='Satış Lot Sayısı 3.Kısım %', defval=13, minval=1)
q4 = input.int(title='Satış Lot Sayısı 4.Kısım %', defval=21, minval=1)
tp1 = input.float(title='Kar Yüzdesi 1.Kısım', defval=13, minval=0.01)
tp2 = input.float(title='Kar Yüzdesi 2.Kısım', defval=21, minval=0.01)
tp3 = input.float(title='Kar Yüzdesi 3.Kısım', defval=29, minval=0.01)
tp4 = input.float(title='Kar Yüzdesi 4.Kısım', defval=34, minval=0.01)
strategy.exit('✨KS1', qty_percent=q1, profit=per1(tp1), loss=zarkeslos)
strategy.exit('✨KS2', qty_percent=q2, profit=per1(tp2), loss=zarkeslos)
strategy.exit('✨KS3', qty_percent=q3, profit=per1(tp3), loss=zarkeslos)
strategy.exit('✨KS4', qty_percent=q4, profit=per1(tp4), loss=zarkeslos)



Thêm nữa