Chiến lược đột phá giá kênh thích ứng trung bình


Ngày tạo: 2023-11-02 15:05:56 sửa đổi lần cuối: 2023-11-02 15:05:56
sao chép: 0 Số nhấp chuột: 657
1
tập trung vào
1617
Người theo dõi

Chiến lược đột phá giá kênh thích ứng trung bình

Tổng quan[Overview]

Chiến lược phá vỡ giá theo đường tự điều chỉnh là chiến lược phá vỡ đường dài dựa trên các tín hiệu mua và bán dựa trên đường trung bình di chuyển tự điều chỉnh ((AMA) và phạm vi kênh tự điều chỉnh. Chiến lược này sử dụng AMA để tính toán xu hướng của giá hiện tại và kết hợp với phạm vi kênh điều chỉnh động để phát hiện tín hiệu phá vỡ giá để mua và bán đúng thời điểm.

Nguyên tắc chiến lược[Strategy Principle]

Chỉ số cốt lõi của chiến lược này là đường trung bình chuyển động thích ứng ((AMA), và công thức tính toán của AMA để nắm bắt xu hướng giá là:

AMA(t) = α(t-1) * P(t) + [1 - α(t-1)] * AMA(t-1)

Trong đó, P (t) là giá hiện tại, α (t) là hằng số trơn, có giá trị từ 0 đến 1. α (t) được điều chỉnh động theo một số quy tắc để kiểm soát độ nhạy cảm của AMA đối với sự thay đổi giá. Cụ thể, giá trị của α (t) tương ứng với AMA và tỷ lệ lệ lệ nhầm của giá SNRT, công thức SNRT được tính như sau:

SNRT = (P(t) - AMA(t-1)) / AMA(t-1)

Do đó, khi biến động giá tăng, α ((t) sẽ tăng, làm cho AMA theo dõi giá một cách nhạy cảm hơn; khi biến động giá giảm, α ((t) sẽ giảm, làm cho AMA có tính mềm mại cao hơn.

Dựa trên AMA, chiến lược xây dựng phạm vi kênh tự điều chỉnh để phát hiện các tín hiệu phá vỡ giá. Các đường dẫn trên và dưới của phạm vi kênh là:

Trên đường ray: H ((t) = (1 + β)*H(t-1)) * AMA(t)

Hạ đường ray: L (t) = (1 - β)*L(t-1)) * AMA(t)

Trong đó β là tham số có thể điều chỉnh, điều khiển chiều rộng của kênh. Cuối cùng, chiến lược tạo ra tín hiệu giao dịch bằng cách xem liệu giá có phá vỡ đường đua lên xuống hay không:

  • Khi giá tăng lên, hãy làm nhiều hơn.

  • Khi giá giảm xuống đường, bạn có thể bỏ tiền ra ngoài.

  • Nếu không thì không có gì cả.

Phân tích lợi thế[Advantage Analysis]

Chiến lược này có những ưu điểm sau:

  1. Sử dụng AMA thay vì trung bình di chuyển thông thường, bạn có thể nắm bắt xu hướng giá linh hoạt hơn, đặc biệt là đối với thị trường có nhiều biến động.

  2. Phạm vi kênh thích ứng có thể được điều chỉnh động, mở rộng chiều rộng kênh khi không chắc chắn, thu hẹp kênh theo dõi giá khi có xu hướng rõ ràng.

  3. Sử dụng tín hiệu giao dịch phá vỡ giá, có thể bắt kịp thời trong giai đoạn bắt đầu của xu hướng, có tỷ lệ thắng cao.

  4. Chiến lược logic đơn giản, rõ ràng, dễ hiểu và thực hiện, phù hợp với giao dịch định lượng.

Phân tích rủi ro[Risk Analysis]

Chiến lược này cũng có những rủi ro sau:

  1. Thiết lập tham số AMA không đúng có thể dẫn đến xu hướng giá bị sai hoặc tạo ra tín hiệu sai.

  2. Các tham số kênh tự điều chỉnh như β cần được thiết lập cẩn thận, nếu không sẽ có quá nhiều giao dịch thường xuyên hoặc xu hướng bỏ lỡ.

  3. Các tín hiệu phá vỡ giá dễ bị lừa dối bởi các dấu hiệu phá vỡ giả, nên được lọc với nhiều chỉ số hơn.

  4. Chiến lược này không tính đến các cơ chế quản lý tài chính và ngăn chặn thiệt hại, do đó có một số rủi ro mất mát.

Hướng tối ưu hóa[Optimization Directions]

Chiến lược này có thể được tối ưu hóa bằng cách:

  1. Tối ưu hóa cách tính toán giá trị α của AMA, làm cho nó nhạy cảm hơn với sự thay đổi giá.

  2. Thêm xác nhận tiếp theo sau khi phá vỡ kênh, tránh phá vỡ giả tạo ra tín hiệu sai.

  3. Bộ lọc kết hợp với khối lượng giao dịch hoặc chỉ số biến động để đảm bảo tính hiệu quả của đột phá.

  4. Thêm hệ thống tracking stop loss để khóa lợi nhuận và kiểm soát rủi ro.

  5. Tối ưu hóa quản lý vốn, xác định quản lý vị trí hợp lý cho các tài sản khác nhau.

Tóm tắt[Conclusion]

Chiến lược phá vỡ giá theo kênh tự điều chỉnh là một chiến lược phá vỡ theo dõi xu hướng đơn giản và thực tế. Nó theo dõi xu hướng giá bằng cách sử dụng trung bình di chuyển tự điều chỉnh thông qua các ứng dụng linh hoạt và hỗ trợ các tín hiệu phá vỡ theo kênh tự điều chỉnh. Chiến lược này có một số lợi thế, nhưng cũng có thể có rủi ro.

Mã nguồn chiến lược
/*backtest
start: 2022-10-26 00:00:00
end: 2023-11-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// CryptoStatistical - 2019
// AMA Strategy Channel Breakout Strategy from E. Durenard - Professional Automated Trading 
// https://www.amazon.com/Professional-Automated-Trading-Theory-Practice/dp/1118129857

strategy(title="[CS] AMA Strategy - Channel Break Out", shorttitle="AMA_ChannelBreakout_Strategy", initial_capital = 1000, overlay=true, pyramiding = 0, calc_on_every_tick=false, calc_on_order_fills=false, commission_type= strategy.commission.percent, commission_value = 0.08, currency=currency.USD)
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(6, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=95)

testPeriod() =>  true

price = input(title='Price Source:', type=input.source, defval=close)

ama = price
hb = price
lb = price

// Static model parameters
minfactor = 0.
maxfactor = 1.
deviation_max = 1.
deviation_min = 1.
beta_hb = 1.
beta_lb = 1.
snr = 1.

normalized_atan= 0.
alpha = 0.5
// Suggested snr-factor from .5 upto 3.1 by .3 to find best parameter
snrfactor = input(title='SNR Factor:', type=input.float, minval=0.6, maxval=3.3, step=0.3, defval=2.1)

// Sensitivity Lookback search for the best perdiod from 5 to 20
lookback = input(title='Sensitivity Lookback:', type=input.integer, defval=5)

// Suggested Beta from .5 below 4.5 by .3, usually in the range 1.2, 1.5
beta = input(title='Beta:', type=input.float, minval=0.6, maxval=4.5, step=0.3, defval=2.1)

offsetlabel = input(title='Offset Label:', type=input.float, minval=0.001, maxval=0.03, step=0.001, defval=0.001)

// pi/2
pi2 = 1.5707963267948966

// Zero-lag resampled moving average (Durschner nwma)
f_nwma(_src, _period) =>
    fast = _period/2
    lambda = _period/fast
    alpha = lambda * (_period - 1)/(_period - lambda)
    average1 = wma(_src,_period)
    average2 = wma(average1,fast)
    nwma = (1+alpha)*average1 - alpha*average2

ama := alpha[1]*price + (1-alpha[1])*nz(ama[1])

deviation_max := alpha[1]*max((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_max[1])
deviation_min := -alpha[1]*min((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_min[1])

beta_hb := beta*deviation_max
beta_lb := beta*deviation_min
hb := (1 + beta_hb[1])*ama
lb := (1 - beta_lb[1])*ama

snr := if price > hb
    ((price - ama[1])/ama[1])/beta_lb
else
    if price < lb
        -((price - ama[1])/ama[1])/beta_hb
    else
        0

normalized_atan := (atan(snrfactor*snr) + pi2)/(2*pi2)
alpha := f_nwma(minfactor + (maxfactor - minfactor)*normalized_atan, lookback)

plot(ama, color=color.black)
plot(hb, color=color.green)
plot(lb, color=color.red)

// Buy Condition Var
bc = false
// Sell Condition Var
sc = false
d = color.black

// Buy Condition
if(price > hb)
    bc := true
    d := color.green

// Sell Condition
if(price < lb)
    sc := true
    d := color.red

if(testPeriod())
    strategy.entry("Long", strategy.long, when = bc)
    strategy.entry("Short", strategy.short, when = sc)

alertcondition(bc, title='BuyCondition', message='Buy')
alertcondition(sc, title='SellCondition', message='Sell')

plotshape(title='Buy', series=bc ? price * (1 - offsetlabel) : na, text='A1B', style=shape.labelup, location=location.absolute, color=d, textcolor=color.white, offset=0)
plotshape(title='Sell', series=sc ? price  * (1 + offsetlabel) : na, text='A1S', style=shape.labeldown, location=location.absolute, color=d, textcolor=color.white, offset=0)