Chiến lược theo xu hướng đột phá động lượng


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

Chiến lược theo xu hướng đột phá động lượng

Tổng quan

Chiến lược này kết hợp nhiều chỉ số kỹ thuật để xác định xu hướng, theo dõi khi xu hướng có động lực phá vỡ, và tìm kiếm lợi nhuận vượt trội.

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

  1. Sử dụng kênh Donchian để xác định hướng của xu hướng tổng thể. Khi giá vượt qua kênh này, xác nhận xu hướng chuyển hướng.

  2. Hull Moving Average hỗ trợ định hướng xu hướng. Chỉ số này nhạy cảm với thay đổi giá và có thể phát hiện ra xu hướng biến đổi trước.

  3. Hệ thống bán quỹ đạo phát ra tín hiệu mua và bán. Hệ thống này dựa trên kênh giá và phạm vi biến động thực tế trung bình, có thể tránh phá vỡ giả.

  4. Khi đường Donchian, chỉ số Hull và hệ thống bán quỹ đạo phát tín hiệu đồng thời, xác định xu hướng xảy ra đột phá động lực mạnh, tại thời điểm này vào sân.

  5. Điều kiện đồng vị: Khi các chỉ số trên phát ra tín hiệu đảo ngược, xác định xu hướng đảo ngược và ngay lập tức dừng lỗ.

Phân tích lợi thế

  • Kết hợp nhiều chỉ số, có khả năng phán đoán tốt hơn. Đường Donchian xác định cơ bản, chỉ số Hull và bán quỹ đạo xác định chi tiết, nắm bắt xu hướng chính xác điểm biến đổi.

  • Động lực phá vỡ tham gia, theo đuổi lợi nhuận vượt trội. Chỉ tham gia khi xu hướng có một sự phá vỡ mạnh mẽ, tránh bị mắc kẹt trong cơn sốc.

  • Hạn chế nghiêm ngặt, đảm bảo an toàn tài chính. Một khi chỉ số phát ra tín hiệu ngược, hãy dừng lỗ ngay lập tức, tránh tổn thất mở rộng.

  • Điều chỉnh tham số linh hoạt, thích ứng với nhiều loại thị trường. Các tham số như chiều dài kênh, khoảng dao động có thể được điều chỉnh để tối ưu hóa cho các chu kỳ khác nhau.

  • Dễ hiểu và thực hiện, người mới bắt đầu cũng có thể nắm bắt được. Các chỉ số và điều kiện kết hợp đơn giản, rõ ràng và dễ lập trình.

Phân tích rủi ro

  • Lỡ cơ hội đầu tiên của xu hướng.

  • Thâm nhập thất bại, khôi phục thiệt hại. Thâm nhập sau khi có thể xảy ra thất bại và đảo ngược, gây thiệt hại.

  • Chỉ số phát ra tín hiệu sai. Do các tham số được đặt không đúng, chỉ số có thể bị đánh giá sai.

  • Số lượng giao dịch giới hạn. Chỉ tham gia khi có một xu hướng rõ ràng, số lượng giao dịch hàng năm giới hạn.

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

  • Tối ưu hóa sự kết hợp của các tham số. Kiểm tra các tham số khác nhau để tìm ra sự kết hợp tốt nhất.

  • Thêm điều kiện rút lui theo đường thẳng. Tránh dừng lỗ quá sớm và bỏ lỡ cơ hội xu hướng.

  • Thêm các bộ lọc cho các chỉ số khác như MACD, KDJ và các phán đoán hỗ trợ để giảm tín hiệu sai.

  • Tối ưu hóa thời gian giao dịch. Các tham số khác nhau có thể được tối ưu hóa.

  • Tăng cường hiệu quả sử dụng vốn. Tăng cường hiệu quả sử dụng vốn bằng cách sử dụng đòn bẩy, đầu tư cố định.

Tóm tắt

Chiến lược này kết hợp nhiều chỉ số để đánh giá thời điểm có xu hướng có động lực phá vỡ, bằng cách theo dõi xu hướng đã hình thành để đạt được lợi nhuận vượt quá. Cơ chế kiểm soát rủi ro ngăn chặn nghiêm ngặt, điều chỉnh tham số linh hoạt để thích ứng với môi trường thị trường khác nhau. Mặc dù tần suất giao dịch thấp, nhưng mỗi giao dịch tìm kiếm lợi nhuận cao.

Mã nguồn chiến lược
/*backtest
start: 2023-10-29 00:00:00
end: 2023-11-05 00:00:00
period: 1m
basePeriod: 1m
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/
// © kgynofomo

// @version=5
strategy(title="[Salavi] | Andy Super Pro Strategy",overlay = true)

//Doinchian Trend Ribbon
dlen = input.int(defval=30, minval=10)

dchannel(len) =>
    float hh = ta.highest(len)
    float ll = ta.lowest(len)

    int trend = 0
    trend := close > hh[1] ? 1 : close < ll[1] ? -1 : nz(trend[1])
    trend

dchannelalt(len, maintrend) =>
    float hh = ta.highest(len)
    float ll = ta.lowest(len)

    int trend = 0
    trend := close > hh[1] ? 1 : close < ll[1] ? -1 : nz(trend[1])
    maintrend == 1 ? trend == 1 ? #00FF00ff : #00FF009f : maintrend == -1 ? trend == -1 ? #FF0000ff : #FF00009f : na

maintrend = dchannel(dlen)
donchian_bull = maintrend==1
donchian_bear = maintrend==-1


//Hulls
src = input(hlc3, title='Source')
modeSwitch = input.string('Hma', title='Hull Variation', options=['Hma', 'Thma', 'Ehma'])
length = input(55, title='Length')
lengthMult = input(1.0, title='Length multiplier ')

useHtf = false
htf = '240'

switchColor = true
candleCol = false
visualSwitch = true
thicknesSwitch = 1
transpSwitch = 40

//FUNCTIONS
//HMA
HMA(_src, _length) =>
    ta.wma(2 * ta.wma(_src, _length / 2) - ta.wma(_src, _length), math.round(math.sqrt(_length)))
//EHMA    
EHMA(_src, _length) =>
    ta.ema(2 * ta.ema(_src, _length / 2) - ta.ema(_src, _length), math.round(math.sqrt(_length)))
//THMA    
THMA(_src, _length) =>
    ta.wma(ta.wma(_src, _length / 3) * 3 - ta.wma(_src, _length / 2) - ta.wma(_src, _length), _length)

//SWITCH
Mode(modeSwitch, src, len) =>
    modeSwitch == 'Hma' ? HMA(src, len) : modeSwitch == 'Ehma' ? EHMA(src, len) : modeSwitch == 'Thma' ? THMA(src, len / 2) : na

//OUT
_hull = Mode(modeSwitch, src, int(length * lengthMult))
HULL = useHtf ? request.security(syminfo.ticker, htf, _hull) : _hull
MHULL = HULL[0]
SHULL = HULL[2]

//COLOR
hullColor = switchColor ? HULL > HULL[2] ? #00ff00 : #ff0000 : #ff9800
hull_bull = HULL > HULL[2]
bull_start = hull_bull and hull_bull[1]==false
hull_bear = HULL < HULL[2]
bear_start = hull_bear and hull_bear[1]==false

barcolor(color=candleCol ? switchColor ? hullColor : na : na)

//halftrend
amplitude = input(title='Amplitude', defval=2)
channelDeviation = input(title='Channel Deviation', defval=2)
// showArrows = input(title='Show Arrows', defval=true)
// showChannels = input(title='Show Channels', defval=true)

var int trend = 0
var int nextTrend = 0
var float maxLowPrice = nz(low[1], low)
var float minHighPrice = nz(high[1], high)

var float up = 0.0
var float down = 0.0
float atrHigh = 0.0
float atrLow = 0.0
float arrowUp = na
float arrowDown = na

atr2 = ta.atr(100) / 2
dev = channelDeviation * atr2

highPrice = high[math.abs(ta.highestbars(amplitude))]
lowPrice = low[math.abs(ta.lowestbars(amplitude))]
highma = ta.sma(high, amplitude)
lowma = ta.sma(low, amplitude)

if nextTrend == 1
    maxLowPrice := math.max(lowPrice, maxLowPrice)

    if highma < maxLowPrice and close < nz(low[1], low)
        trend := 1
        nextTrend := 0
        minHighPrice := highPrice
        minHighPrice
else
    minHighPrice := math.min(highPrice, minHighPrice)

    if lowma > minHighPrice and close > nz(high[1], high)
        trend := 0
        nextTrend := 1
        maxLowPrice := lowPrice
        maxLowPrice

if trend == 0
    if not na(trend[1]) and trend[1] != 0
        up := na(down[1]) ? down : down[1]
        arrowUp := up - atr2
        arrowUp
    else
        up := na(up[1]) ? maxLowPrice : math.max(maxLowPrice, up[1])
        up
    atrHigh := up + dev
    atrLow := up - dev
    atrLow
else
    if not na(trend[1]) and trend[1] != 1
        down := na(up[1]) ? up : up[1]
        arrowDown := down + atr2
        arrowDown
    else
        down := na(down[1]) ? minHighPrice : math.min(minHighPrice, down[1])
        down
    atrHigh := down + dev
    atrLow := down - dev
    atrLow

ht = trend == 0 ? up : down

var color buyColor = color.blue
var color sellColor = color.red

htColor = trend == 0 ? buyColor : sellColor
// htPlot = plot(ht, title='HalfTrend', linewidth=2, color=htColor)

// atrHighPlot = plot(showChannels ? atrHigh : na, title='ATR High', style=plot.style_circles, color=color.new(sellColor, 0))
// atrLowPlot = plot(showChannels ? atrLow : na, title='ATR Low', style=plot.style_circles, color=color.new(buyColor, 0))

// fill(htPlot, atrHighPlot, title='ATR High Ribbon', color=color.new(sellColor, 90))
// fill(htPlot, atrLowPlot, title='ATR Low Ribbon', color=color.new(buyColor, 90))

HalfTrend_buySignal = not na(arrowUp) and trend == 0 and trend[1] == 1
HalfTrend_sellSignal = not na(arrowDown) and trend == 1 and trend[1] == 0

// plotshape(showArrows and buySignal ? atrLow : na, title='Arrow Up', style=shape.triangleup, location=location.absolute, size=size.tiny, color=color.new(buyColor, 0))
// plotshape(showArrows and sellSignal ? atrHigh : na, title='Arrow Down', style=shape.triangledown, location=location.absolute, size=size.tiny, color=color.new(sellColor, 0))




//ema
filter_ema = ta.ema(close,200)
ema_bull = close>filter_ema
ema_bear = close<filter_ema

atr_length = input.int(7)
atr = ta.atr(atr_length)
atr_rsi_length = input.int(50)
atr_rsi = ta.rsi(atr,atr_rsi_length)
atr_valid = atr_rsi>50

longCondition = bull_start and atr_valid
shortCondition = bear_start and atr_valid

Exit_long_condition = shortCondition
Exit_short_condition = longCondition

if longCondition
    strategy.entry("Andy Buy",strategy.long, limit=close,comment="Andy Buy Here")

if Exit_long_condition
    strategy.close("Andy Buy",comment="Andy Buy Out")
    // strategy.entry("Andy fandan Short",strategy.short, limit=close,comment="Andy 翻單 short Here")
    // strategy.close("Andy fandan Buy",comment="Andy short Out")


if shortCondition
    strategy.entry("Andy Short",strategy.short, limit=close,comment="Andy short Here")


// strategy.exit("STR","Long",stop=longstoploss)
if Exit_short_condition
    strategy.close("Andy Short",comment="Andy short Out")
    // strategy.entry("Andy fandan Buy",strategy.long, limit=close,comment="Andy 翻單 Buy Here")
    // strategy.close("Andy fandan Short",comment="Andy Buy Out")




inLongTrade = strategy.position_size > 0
inLongTradecolor = #58D68D
notInTrade = strategy.position_size == 0
inShortTrade = strategy.position_size < 0

// bgcolor(color = inLongTrade?color.rgb(76, 175, 79, 70):inShortTrade?color.rgb(255, 82, 82, 70):na)
plotshape(close!=0,location = location.bottom,color = inLongTrade?color.green:inShortTrade?color.red:na)


plotshape(longCondition, title='Buy', text='Andy Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(shortCondition, title='Sell', text='Andy Sell', style=shape.labeldown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)

Fi1 = plot(MHULL, title='MHULL', color=hullColor, linewidth=thicknesSwitch, transp=50)
Fi2 = plot(SHULL, title='SHULL', color=hullColor, linewidth=thicknesSwitch, transp=50)

fill(Fi1, Fi2, title='Band Filler', color=hullColor, transp=transpSwitch)