Chiến lược giao dịch quyết định chỉ báo động lượng


Ngày tạo: 2023-12-15 15:31:52 sửa đổi lần cuối: 2023-12-15 15:31:52
sao chép: 0 Số nhấp chuột: 594
1
tập trung vào
1621
Người theo dõi

Chiến lược giao dịch quyết định chỉ báo động lượng

Tổng quan

Chiến lược giao dịch động lượng là một chiến lược theo dõi xu hướng. Nó sử dụng các chỉ số chuyển động của hai chỉ số để xây dựng một chỉ số động lượng, sau đó kết hợp với chỉ số thay đổi tỷ lệ giá để tạo ra tín hiệu giao dịch.

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

Chiến lược này sử dụng Decision Point oscillator để đo đạc động lượng. Đầu tiên, tính toán tỷ lệ biến đổi hàng ngày của giá, sau đó sử dụng các đường trung bình di chuyển hai chiều dài 31 ngày và 20 ngày để làm mỏng tỷ lệ biến đổi giá, và cuối cùng sử dụng đường trung bình di chuyển mịn 9 ngày để phát tín hiệu giao dịch.

Chiến lược này cũng giới thiệu một chỉ số tỷ lệ biến đổi giá để tránh tín hiệu sai trong thị trường. Cụ thể, tính toán tỷ lệ biến đổi phần trăm của giá gần 30 ngày, để đánh giá xem thị trường có đang hoạt động hay không thông qua đường trung bình di chuyển của nó. Chỉ khi thị trường hoạt động, tín hiệu giao dịch sẽ được phát đi.

Phân tích lợi thế

Chiến lược này kết hợp với chỉ số động lượng và chỉ số tỷ lệ biến đổi giá, có thể xác định hiệu quả xu hướng trung hạn và tránh giao dịch thường xuyên trong tình huống biến động. Nó có thể làm giảm đáng kể khả năng giao dịch sai so với các chiến lược xu hướng đơn giản như theo dõi moving average. Ngoài ra, kiểm soát rủi ro đặt điểm dừng lỗ, có thể dừng lỗ kịp thời và kiểm soát hiệu quả tổn thất đơn lẻ.

Phân tích rủi ro

Chiến lược này chủ yếu BASE giao dịch trong xu hướng đường dài và trung bình, không thể nắm bắt biến động giá trong ngắn hạn. Khi có tình huống khắc nghiệt, điểm dừng có thể bị phá vỡ, dẫn đến tổn thất lớn. Ngoài ra, thiết lập tham số không đúng cũng có thể ảnh hưởng đến chiến lược. Ví dụ, tham số đường trung bình di chuyển của chỉ số đôi được thiết lập quá ngắn sẽ làm tăng khả năng giao dịch sai.

Để phòng ngừa rủi ro, bạn có thể điều chỉnh điểm dừng lỗ một cách thích hợp, mở rộng phạm vi dừng lỗ. Bạn cũng có thể tạm thời tắt chiến lược để tránh khả năng phá vỡ dừng lỗ khi tình hình thị trường trở nên khắc nghiệt.

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

Chiến lược này có thể được tối ưu hóa theo các hướng sau:

  1. Thêm các chỉ số lọc khác, chẳng hạn như chỉ số biến động, có thể tránh giao dịch trong thời gian biến động mạnh.

  2. Thêm mô hình học máy, hỗ trợ đánh giá hướng và cường độ của xu hướng, có thể cải thiện độ chính xác của tín hiệu.

  3. Thử các chỉ số động lực khác nhau, chẳng hạn như chỉ số tương đối mạnh, Stochastic oscillator, để tối ưu hóa thời gian mua và bán.

  4. Trong quá trình hoạt động của ổ cứng, kết hợp các đặc điểm của thời gian gần đây, điều chỉnh các tham số động, theo đuổi các cặp tham số tối ưu.

Tóm tắt

Động lượng chỉ số quyết định chiến lược giao dịch nói chung là một chiến lược theo dõi xu hướng trung bình và dài hạn. Nó kết hợp với chỉ số chuyển động trung bình và chỉ số tỷ lệ biến đổi giá, có thể xác định xu hướng hiệu quả, tránh giao dịch sai. Đồng thời, thiết lập điểm dừng để kiểm soát rủi ro.

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

//@version=4
strategy("Decision BF", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "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)

testPeriod() => true

/////////////// Decision ///////////////
src = input(ohlc4, title="Source")
length1 = input(31, title="First Smoothing")
length2 = input(20, title="Second Smoothing")
siglength = input(9, title="Signal Smoothing")
fr = input(true, title="Fill Region")

calc_csf(src, length) => 
	sm = 2.0 / length
	csf = 0.0
	csf := (src - nz(csf[1])) * sm + nz(csf[1])
	csf
i = (src / nz(src[1], src)) * 100
pmol2 = calc_csf(i - 100, length1)
pmol = calc_csf(10 * pmol2, length2)
pmols = ema(pmol, siglength)
d = pmol - pmols
duml = plot(fr ? (d > 0 ? pmol : pmols) : na, style=plot.style_circles, color=color.yellow, linewidth=0, title="DummyL")

hc = d > 0 ? d > d[1] ? color.lime : color.green : d < d[1] ? color.red : color.orange

///////////// Rate Of Change ///////////// 
source = close
roclength = input(30, minval=1)
pcntChange = input(7, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Strategy ///////////////
long = d > 0 and isMoving() 
short = d < 0 and isMoving() 

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(5000.0, title='Take Profit %') / 100
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1])

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("Long",  strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("L Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("S Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)

/////////////// Plotting ///////////////
sigl = plot(false ? na : pmols, title="PMO Signal", color=color.gray, linewidth=2, title="Signal")
mdl = plot(false ? na : pmol, title="PMO", color=color.black, linewidth=2, title="PMO")
fill(duml, sigl, color.green, transp=20, title="PosFill")
fill(duml, mdl, color.red, transp=20, title="NegFill")
bgcolor(isMoving() ? long ? color.lime : short ? color.red : na : color.white, transp=70)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=50)