Chiến lược ép xung động lượng dựa trên dải Bollinger và kênh Kalkin


Ngày tạo: 2024-01-30 17:33:49 sửa đổi lần cuối: 2024-01-30 17:33:49
sao chép: 0 Số nhấp chuột: 869
1
tập trung vào
1617
Người theo dõi

Chiến lược ép xung động lượng dựa trên dải Bollinger và kênh Kalkin

Tổng quan

Đây là một chiến lược giao dịch định lượng được phát triển dựa trên các chỉ số đè bẹp động lực của LazyBear. Chiến lược này tích hợp các chỉ số đè bẹp động lực, kênh Kalkin và chỉ số động lực để tạo ra các giao dịch đè bẹp động lực có tỷ lệ thắng cao thông qua sự kết hợp của nhiều chỉ số kỹ thuật.

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

Các chỉ số trung tâm của chiến lược này là chỉ số đè nén động lực của LazyBear. Chỉ số này đánh giá xem các băng Bowring có bị đè nén bởi các đường Kalkin hay không, và khi đè nén xảy ra, nó đại diện cho thị trường đi vào một điểm nổ tiềm năng.

Cụ thể, chiến lược này tính toán ban đầu các băng tần Brin 21 chu kỳ, với băng tần là chênh lệch tiêu chuẩn giá gấp 2 lần. Đồng thời tính toán các kênh Calcin 20 chu kỳ, với băng tần là sự gia tăng giá gấp 1,5 lần.

Trên sân chơi, xu hướng có thể đảo ngược khi màu chỉ số động lượng chuyển sang màu xám, làm bằng vị trí, đại diện cho kết thúc tình trạng ép.

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

  1. Kết hợp nhiều chỉ số kỹ thuật để tăng độ chính xác trong quyết định giao dịch

Chiến lược này tích hợp các chỉ số như băng tần Brin, kênh Kalkin và động lực, và bằng cách đánh giá mối quan hệ tổng hợp của các chỉ số này, có thể cải thiện độ chính xác của quyết định giao dịch và giảm khả năng giao dịch sai.

  1. Động lực ép điểm chính xác, tiềm năng lợi nhuận lớn

Chiến lược đè nén động lực có thể nắm bắt các điểm mấu chốt của sự bùng nổ thị trường, các điểm này thường là các điểm quan trọng mà thị trường đưa ra quyết định về hướng đi, và nếu được đánh giá đúng, thì sau đó hoạt động theo xu hướng sẽ tương đối dài, do đó chiến lược có tiềm năng lợi nhuận rất lớn.

  1. Các giao dịch đột phá có tỷ lệ thành công cao

So với các giao dịch đột phá ngẫu nhiên, các điểm vào được lựa chọn trong chiến lược này nằm ở các điểm chèn của Burin Belt và Kalkin Channel, được đánh giá là có tỷ lệ giao dịch thành công cao hơn bằng cách tích hợp các chỉ số.

Rủi ro chiến lược

  1. Cài đặt rủi ro cho các tham số của Brin Belt và Kalkin Channel

Các tham số thời gian và các tham số băng thông của các kênh Brink và Kalkin có ảnh hưởng lớn đến kết quả giao dịch chiến lược. Nếu tham số được thiết lập không đúng cách, sẽ dẫn đến sai lầm. Điều này đòi hỏi phải tìm ra tham số tốt nhất thông qua nhiều lần lặp lại.

  1. Rủi ro thất bại

Bất kỳ giao dịch phá vỡ nào cũng có nguy cơ thất bại, và khi giá vượt qua điểm chọn của chiến lược, có thể sẽ quay trở lại và gây thiệt hại. Điều này cần phải kiểm soát chặt chẽ.

  1. Rủi ro đảo ngược xu hướng

Khi kết thúc trạng thái ép, chiến lược này sẽ xóa tất cả các vị trí. Tuy nhiên, đôi khi xu hướng giá có thể vẫn tiếp tục, điều này có thể gây ra nguy cơ chiến lược ra đi sớm. Điều này đòi hỏi phải tối ưu hóa logic phán đoán ra đi.

Hướng tối ưu hóa chiến lược

  1. Cài đặt tham số tối ưu hóa

Có thể tìm kiếm các tham số tốt hơn cho chu kỳ và thiết lập băng thông của các kênh Brin và Kalkin, bằng cách kiểm tra dữ liệu và lỗi phản hồi nhiều hơn, để cải thiện hiệu quả của chiến lược.

  1. Tăng chiến lược dừng lỗ

Có thể thiết lập dừng di chuyển hoặc dừng dao động, dừng nhanh khi giá đảo ngược để kiểm soát sự rút lui tối đa của chiến lược.

  1. Thêm điều kiện tái nhập học

Khi chiến lược thoát khỏi vị trí, bạn có thể đặt một số điều kiện nhập lại và có thể vào lại nếu xu hướng tiếp tục.

  1. Kết hợp nhiều chỉ số hơn

Có thể thử kết hợp nhiều loại chỉ số khác nhau, chẳng hạn như các chỉ số biến động khác, chỉ số giao dịch, v.v., để tạo ra một chiến lược tổng hợp tích hợp các chỉ số để cải thiện độ chính xác của quyết định.

Tóm tắt

Chiến lược này tích hợp các chỉ số về băng tần Brin, kênh Calc and động lực, và bằng cách đánh giá các mối quan hệ của các chỉ số này, chọn điểm đột phá có tỷ lệ thành công cao. Có nhiều khía cạnh tối ưu hóa trong các tham số tối ưu hóa, chiến lược dừng lỗ, điều kiện tái nhập cảnh và tích hợp các chỉ số phức tạp, có thể nâng cao hiệu quả của chiến lược hơn nữa.

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

//@version=4
//All credits to LazyBear. All I did was turn it into a strategy!

strategy(title = "SQZMOM STRAT", overlay=false)

// --- GENERAL INPUTS ---
FromMonth = input(defval = 4, title = "From Month", minval = 1, maxval = 12)
FromYear  = input(defval = 2020, title = "From Year", minval = 2012)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)
FromDay   = 1
ToDay     = 1
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true

get_round(value, precision) => round(value * (pow(10, precision))) / pow(10, precision)
trade_leverage = input(1, title = "Trade - Leverage", step = 0.25)
trade_risk     = input(100, title = "Trade - Risk Percent", type = input.float, step = 0.1, minval = 0.1, maxval = 100)
tradeType   = input("LONG", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH"])

// --- SQZMOM CODE

length = input(21, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(20, title="KC Length")
multKC = input(1.5, title="KC MultFactor")

useTrueRange = input(true, title="Use TrueRange (KC)", type=input.bool)

// Calculate BB
source = close
basis = sma(source, length)
dev = multKC * stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev

// Calculate KC
ma = sma(source, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC

sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)

val = linreg(source  -  avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)

bcolor = color.gray
if (val > 0 and val > nz(val[1]))
    bcolor := color.green
if (val < 0 and val < nz(val[1]))
    bcolor := color.red

scolor = noSqz ? color.blue : sqzOn ? color.black : color.gray 
plot(val, color=bcolor, style=plot.style_histogram, linewidth=4)
plot(0, color=scolor, style=plot.style_cross, linewidth=2)

// --- VWMA CODE ---
useVWMA        = input(false, title = "Use VWMA to selectively long/short?", type = input.bool)
lengthVWMA=input(42, title = "VWMA Length", step = 1, minval = 1)
useCV=input(false, type=input.bool, title="Use Cumulative Volume for VWMA?")
nbfs = useCV ? cum(volume) : sum(volume, lengthVWMA)
medianSrc=close

calc_evwma(price, lengthVWMA, nb_floating_shares) => data = (nz(close[1]) * (nb_floating_shares - volume)/nb_floating_shares) + (volume*price/nb_floating_shares)

m=calc_evwma(medianSrc, lengthVWMA, nbfs)


// ---STRATEGY---
if ((tradeType == "LONG" or tradeType == "BOTH") and (m>0 or useVWMA == false))
    longCondition = (val > 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1)
    if (longCondition)
        contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4)
        strategy.entry("LONG", strategy.long, qty = contracts, when = window())
        
if((tradeType == "SHORT" or tradeType == "BOTH") and (m<0 or useVWMA == false))
    shortCondition = (val < 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1)
    if (shortCondition)
        contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4)
        strategy.entry("SHORT", strategy.short, qty = contracts, when = window())

if (bcolor == color.gray)
    strategy.close("LONG")
    strategy.close("SHORT")