Chiến lược giao dịch đường xu hướng độ dốc động

Tác giả:ChaoZhang, Ngày: 2024-02-06 11:51:14
Tags:

img

Tổng quan

Ý tưởng cốt lõi của chiến lược này là sử dụng độ dốc động để xác định hướng xu hướng giá và tạo ra các tín hiệu giao dịch kết hợp với phán đoán đột phá. Cụ thể, nó theo dõi mức giá cao nhất và thấp nhất trong thời gian thực dựa trên sự thay đổi giá trong các khoảng thời gian khác nhau để tính toán độ dốc động, và sau đó xác định các tín hiệu dài và ngắn theo sự đột phá của giá so với các đường xu hướng.

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

Các bước chính của chiến lược này là:

  1. Đánh giá giá cao nhất và thấp nhất: Theo dõi giá cao nhất và thấp nhất trong một chu kỳ nhất định (ví dụ: 20 thanh) để xác định xem có đạt được mức cao hay thấp mới hay không.

  2. Tính toán độ dốc động: ghi lại số thanh khi đạt đến mức cao hoặc thấp mới và tính toán độ dốc động từ điểm cao / thấp mới đến điểm cao / thấp sau một chu kỳ nhất định (ví dụ: 9 thanh).

  3. Biểu đồ đường xu hướng: Biểu đồ đường xu hướng tăng và giảm dựa trên độ dốc năng động.

  4. Mở rộng và cập nhật đường xu hướng: Khi giá vượt qua đường xu hướng, mở rộng và cập nhật đường xu hướng.

  5. Các tín hiệu giao dịch: Xác định các tín hiệu dài và ngắn dựa trên sự phá vỡ giá so với các đường xu hướng.

Ưu điểm của Chiến lược

Những lợi thế của chiến lược này bao gồm:

  1. Định hướng xu hướng cho sự linh hoạt để đáp ứng với những thay đổi trên thị trường.

  2. Kiểm soát hợp lý các điểm dừng và giảm thiểu việc rút.

  3. Các tín hiệu giao dịch đột phá rõ ràng dễ thực hiện.

  4. Các tham số có thể tùy chỉnh để thích nghi mạnh mẽ.

  5. Cấu trúc mã sạch mà dễ hiểu và phát triển hơn nữa.

Rủi ro và giải pháp

Ngoài ra còn có một số rủi ro với chiến lược này:

  1. Thường xuyên dài và ngắn khi xu hướng là phạm vi giới hạn. Thêm điều kiện lọc.

  2. Có nhiều tín hiệu sai hơn về sự đột phá, điều chỉnh các thông số hoặc thêm bộ lọc.

  3. Giảm rủi ro khi thị trường chuyển động mạnh.

  4. Không gian tối ưu hóa hạn chế và tiềm năng lợi nhuận, phù hợp với giao dịch ngắn hạn.

Hướng dẫn tối ưu hóa

Các lĩnh vực tối ưu hóa chiến lược bao gồm:

  1. Thêm thêm các chỉ số kỹ thuật như tín hiệu lọc.

  2. Tối ưu hóa các kết hợp tham số cho các tham số tốt nhất.

  3. Cố gắng cải thiện các chiến lược dừng lỗ để giảm rủi ro.

  4. Thêm chức năng để tự động điều chỉnh phạm vi giá nhập cảnh.

  5. Hãy thử kết hợp với các chiến lược khác để khám phá thêm cơ hội.

Tóm lại

Nói chung, đây là một chiến lược ngắn hạn hiệu quả dựa trên việc sử dụng độ dốc động để xác định xu hướng và đột phá giao dịch. Nó có phán đoán chính xác, rủi ro có thể kiểm soát được và phù hợp để nắm bắt các cơ hội ngắn hạn trên thị trường.


/*backtest
start: 2024-01-06 00:00:00
end: 2024-01-19 00:00:00
period: 2h
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/
// © pune3tghai

//Originally posted by matsu_bitmex

//tried adding alerts on plots and cleared the chart for a cleaner view.
//Publishing the script in hope of getting it improved by someone else.

//Added strategy code for easier calculations

//Needs work on TP and SL part.

//P.S - THE ORIGINAL CODE IS MUCH BETTER BUT I have tried to be more usable and understandable.

//@version=4
strategy("TrendLines with Alerts", overlay=true)     //study("TrendLines with Alerts", overlay=true)
//update

length1 = input(20)
check = input(9)
//length2 = input(200)


u=0.0
u := u[1]

l=0.0
l := l[1]

y=0.0
y := y[1]

yl=0.0
yl := yl[1]

angle = 0.0
angle := angle[1]

anglel = 0.0
anglel := anglel[1]

if (highest(length1) == high[check] and highest(length1) == highest(length1)[check] and barssince(barstate.isfirst) > check)
    u := high[check]

    
if (lowest(length1) == low[check] and lowest(length1) == lowest(length1)[check] and barssince(barstate.isfirst) > check)
    l := low[check]
    

    
p = round(barssince(u == high[check]))

pl = round(barssince(l == low[check]))

if p == 0 and barssince(barstate.isfirst) > check
    y := high[abs(p[1]+1+check)]
    
if pl == 0 and barssince(barstate.isfirst) > check
    yl := low[abs(pl[1]+1+check)]    
    

if p == 0
    angle := (u-y)/p[1]

if pl == 0
    anglel := (l-yl)/pl[1]

uppertrend = u+ (p * angle)

lowertrend = l+ (pl * anglel)

extendup = if barssince(barstate.isfirst) > check
    uppertrend[check] + angle[check] * check*2

extenddown = if barssince(barstate.isfirst) > check
    lowertrend[check] + anglel[check] * check*2




//plot(l[offset]-u,color=red)
//plot(u[offset]-l,color = green )
plot(lowertrend, color = color.green, transp=30,offset = -check)
plot(extenddown, color = color.green, transp=100)
plot(uppertrend, color = color.red, transp=30, offset = -check)
plot(extendup, color = color.red, transp=100)
//plot(l[offset], color = red)

l1 = lowertrend
l2 = extenddown
u1 = uppertrend
u2 = extendup



l2sell = crossunder(high, l2)
u2buy = crossover(low, u2)
buy1 = (low<=lowertrend) and open>lowertrend and high>lowertrend and close>lowertrend
buy2 = (low<=extenddown) and open>extenddown and high>extenddown and close>extenddown
buy = buy1 or buy2 or u2buy
plotshape(series=buy, title="Buy", style=shape.triangleup, size=size.tiny, color=color.lime, location=location.belowbar)
sell1 = (high>=uppertrend) and open<uppertrend and low<uppertrend and close<uppertrend
sell2 = (high>=extendup) and open<extendup and low<extendup and close<extendup
sell = sell1 or sell2 or l2sell
plotshape(series=sell, title="Sell", style=shape.triangledown, size=size.tiny, color=color.red, location=location.abovebar)

longCond = buy
shortCond = sell

tp = input(0.2, title="Take Profit")

tpbuyval = valuewhen(buy, close, 1) + (tp/100)*(valuewhen(buy, close, 1))
tpsellval = valuewhen(sell, close, 1) - (tp/100)*(valuewhen(sell, close, 1))


sl = input(0.2, title="Stop Loss")
slbuyval = valuewhen(buy, close, 0) - (sl/100)*(valuewhen(buy, close, 0))
slsellval = valuewhen(sell, close, 0) + (sl/100)*(valuewhen(sell, close, 0))
// === STRATEGY ===
tradeType = input("BOTH", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH", "NONE"])

// stop loss
slPoints = input(defval=0, title="Initial Stop Loss Points (zero to disable)", minval=0)
tpPoints = input(defval=0, title="Initial Target Profit Points (zero for disable)", minval=0)

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//

testStartYear = input(2019, "Backtest Start Year", minval=1980)
testStartMonth = input(1, "Backtest Start Month", minval=1, maxval=12)
testStartDay = input(1, "Backtest Start Day", minval=1, maxval=31)
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(9999, "Backtest Stop Year", minval=1980)
testStopMonth = input(12, "Backtest Stop Month", minval=1, maxval=12)
testStopDay = input(31, "Backtest Stop Day", minval=1, maxval=31)
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<//

//
//set up exit parameters
TP = tpPoints > 0 ? tpPoints : na
SL = slPoints > 0 ? slPoints : na

// Make sure we are within the bar range, Set up entries and exit conditions
if testPeriod() and tradeType != "NONE"
    strategy.entry("long", strategy.long, when=longCond == true and tradeType != "SHORT")
    strategy.entry("short", strategy.short, when=shortCond == true and tradeType != "LONG")
    strategy.close("long", when=shortCond == true and tradeType == "LONG")
    strategy.close("short", when=longCond == true and tradeType == "SHORT")
    strategy.exit("XL", from_entry="long", profit=tpbuyval, loss=slbuyval)
    strategy.exit("XS", from_entry="short", profit=tpsellval, loss=slsellval)

// === /STRATEGY ===
//EOF


////ALERT SYNTEX
//alertcondition(longCond, title="Long", message="Killer Market")
//alertcondition(shortCond, title="Short", message="Poopy Market")

Thêm nữa