Chiến lược giao dịch động lượng lọc khoảng thời gian kép


Ngày tạo: 2024-04-01 10:54:47 sửa đổi lần cuối: 2024-04-01 10:54:47
sao chép: 3 Số nhấp chuột: 590
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch động lượng lọc khoảng thời gian kép

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 nhị phân kép. Chiến lược này có một bộ lọc nhị phân tổng hợp, được sử dụng để xác định xu hướng của giá hiện tại bằng cách tính toán các khoảng trơn trong hai chu kỳ nhanh và chậm.

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

  1. Tính khoảng trơn giữa hai chu kỳ nhanh và chậm. Khoảng nhanh sử dụng chu kỳ ngắn hơn và nhân nhỏ hơn, khoảng chậm sử dụng chu kỳ dài hơn và nhân lớn hơn.
  2. Sử dụng trung bình của dải tốc độ nhanh và chậm làm bộ lọc dải tổng hợp ((TRF) }}.
  3. Tính toán mối quan hệ giữa giá hiện tại và giá trước đó, để xác định xu hướng tăng ((upward) và xu hướng giảm ((downward)
  4. Tính toán động lực trên đường ray (FUB) và dưới đường ray (FLB), để tham khảo xu hướng.
  5. Theo quan hệ giữa giá đóng cửa và TRF, tạo ra tín hiệu mua và bán.
  6. Cài đặt bốn điểm dừng và một điểm dừng để tương ứng với tỷ lệ vị trí khác nhau và tỷ lệ lợi nhuận / lỗ.

Phân tích lợi thế

  1. Bộ lọc hai vùng kết hợp hai chu kỳ nhanh và chậm, có thể thích ứng với nhịp độ thị trường khác nhau để nắm bắt nhiều cơ hội giao dịch hơn.
  2. Thiết kế lên xuống của đường ray giúp theo xu hướng hiện tại và giảm tín hiệu sai.
  3. Bốn thiết lập ngăn chặn độ dốc cho phép bạn có được lợi nhuận nhiều hơn khi xu hướng tiếp tục, đồng thời cũng có thể khóa một phần lợi nhuận khi xu hướng đảo ngược.
  4. Cài đặt dừng lỗ giúp kiểm soát tổn thất 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. Chiến lược này có thể tạo ra nhiều tín hiệu giả khi thị trường bị xáo trộn hoặc khu vực, dẫn đến giao dịch thường xuyên và mất phí xử lý.
  2. Thiết lập ngăn chặn độ dốc có thể dẫn đến một phần lợi nhuận bị khóa trước và không thể tận hưởng đầy đủ lợi ích của xu hướng.
  3. Thiết lập chống hư hỏng có thể không hoàn toàn tránh được thiệt hại cực đoan từ sự kiện Black Swan.

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

  1. Có thể xem xét việc giới thiệu nhiều chỉ số kỹ thuật hoặc chỉ số cảm xúc thị trường như một điều kiện hỗ trợ để đánh giá xu hướng, giảm tín hiệu sai lệch.
  2. Đối với các thiết lập dừng và dừng lỗ, có thể được điều chỉnh động theo các môi trường thị trường khác nhau và các loại giao dịch, nâng cao khả năng thích ứng của chiến lược.
  3. Trên cơ sở đo đạc, có thể tối ưu hóa thêm các thiết lập tham số, chẳng hạn như chọn chu kỳ giữa tốc độ nhanh và chậm, thiết lập tỷ lệ phần trăm dừng và dừng, để cải thiện sự ổn định và lợi nhuận của chiến lược.

Tóm tắt

Chiến lược giao dịch số lượng dao động của hai chu kỳ xây dựng bộ lọc tổng hợp bằng cách làm mịn hai chu kỳ nhanh và chậm, đồng thời kết hợp động lực lên và xuống đường, phán đoán về chuyển động giá, tạo ra tín hiệu mua và bán. Chiến lược cũng đặt bốn điểm dừng độ dốc và một điểm dừng để 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 tình huống xu hướng, nhưng có thể tạo ra nhiều tín hiệu giả hơn trong thị trường biến động.

Mã nguồn 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)