Chiến lược giao dịch dao động động động lực động

Tác giả:ChaoZhang, Ngày: 2023-12-15 11:00:25
Tags:

img

Tổng quan

Chiến lược giao dịch Dynamic Momentum Oscillator (DMO) là một chiến lược giao dịch ngắn hạn 15 phút dựa trên các chỉ số dao động động. Chiến lược này kết hợp nhiều chỉ số kỹ thuật để tạo ra các tín hiệu giao dịch rất chính xác, có thể giúp các nhà giao dịch mới bắt đầu đưa ra quyết định mua và bán trong một khoảng thời gian ngắn, kiểm soát rủi ro và tăng lợi nhuận.

Chiến lược logic

Chiến lược này đầu tiên sử dụng kênh Doinchian để xác định hướng xu hướng chính của thị trường. Một sự đột phá trên dải trên của kênh là một tín hiệu tăng, trong khi một sự đột phá dưới dải dưới là một tín hiệu giảm. Thứ hai, chiến lược này áp dụng một trong ba biến thể Hull Moving Average kết hợp với một kênh ATR thích nghi để đánh giá xu hướng chính xác hơn. Khi đường nhanh vượt qua trên đường giữa, đó là một tín hiệu mua, và khi nó vượt qua dưới, đó là một tín hiệu bán. Cuối cùng, với sự trợ giúp của chỉ số Halftrend để lọc thêm các tín hiệu sai, độ tin cậy của các tín hiệu giao dịch có thể được cải thiện hơn nữa. Sau khi nhận được các tín hiệu giao dịch tương đối đáng tin cậy, chiến lược sau đó sẽ nhập vào các vị trí dài hoặc ngắn tương ứng.

Phân tích lợi thế

Lợi thế lớn nhất của chiến lược DMO nằm trong sự kết hợp hữu cơ của nhiều chỉ số. Các chỉ số khác nhau có thể xác minh lẫn nhau để lọc ra các tín hiệu sai, làm cho mỗi tín hiệu giao dịch chính xác và đáng tin cậy hơn. Ngoài ra, cách Doinchian kênh đánh giá xu hướng chính là đơn giản và thẳng thắn, và các phương tiện lọc tín hiệu với đường Halftrend cũng tương đối thông thường. Nhìn chung nó dễ hiểu với đường cong học tập thấp cho người mới bắt đầu. So với chỉ số duy nhất, DMO có thể đạt được tỷ lệ thắng cao hơn và lợi nhuận với cùng số lượng giao dịch.

Phân tích rủi ro

Mặc dù chiến lược DMO tương đối ổn định và đáng tin cậy, nhưng bất kỳ chiến lược giao dịch định lượng nào cũng có những rủi ro nhất định. Cụ thể, khi đường nhanh vượt dưới đường trung bình, nó vẫn có thể là một tín hiệu sai mà không cần xác minh từ các chỉ số khác. Ngoài ra, giống như tất cả các chiến lược ngắn hạn, DMO cũng phải đối mặt với rủi ro liên quan đến quá mức giao dịch. Nếu các sự kiện thị trường đột ngột xảy ra khiến các chỉ số không hiệu quả, việc thiết lập stop loss không đúng cũng có thể dẫn đến tổn thất lớn hơn. Để giảm thiểu rủi ro, nên điều chỉnh các tham số của các chỉ số trung và dài hạn, kết hợp chúng với các chỉ số khung thời gian cao hơn để xác minh và tăng khoảng cách stop loss để kiểm soát chặt chẽ các lỗ giao dịch duy nhất.

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

Chiến lược DMO có thể được tối ưu hóa theo các khía cạnh sau: đầu tiên, điều chỉnh các tham số của Hull MA để cân bằng hiệu ứng làm mịn và độ nhạy của các đường trung bình động; thứ hai, cải thiện logic kênh Doinchian, chẳng hạn như điều chỉnh các tham số kênh hoặc thêm các hạn chế bổ sung; thứ ba, thử các chỉ số khác để thay thế Halftrend để lọc tốt hơn, chẳng hạn như Bollinger Bands, KDJ, vv; thứ tư, chỉ định khoảng thời gian giao dịch phù hợp dựa trên các đặc điểm của các công cụ giao dịch khác nhau, ví dụ như thay đổi nó thành một chiến lược 5 phút hoặc 30 phút. Các biện pháp tối ưu hóa này có thể giúp tùy chỉnh chiến lược DMO theo điều kiện thị trường và đặc điểm của công cụ để tăng sự ổn định.

Kết luận

DMO là một chiến lược ngắn hạn tối ưu hóa sự kết hợp của nhiều chỉ số. Nó tích hợp Doinchian Channel, Hull MA và Halftrend để xác định hiệu quả xu hướng thị trường và tạo ra các tín hiệu giao dịch chính xác. Với các kỹ thuật tương đối đơn giản và trực quan và hoạt động dễ dàng, nó có thể phục vụ như một chiến lược giới thiệu cho người mới bắt đầu. So với chỉ số duy nhất, DMO có thể đạt được tỷ lệ thắng cao hơn và lợi nhuận. Thông qua các biện pháp như điều chỉnh tham số, cải thiện sự kết hợp và đặc tả khoảng thời gian, chiến lược DMO có tiềm năng đạt được hiệu suất vượt trội lâu dài với sự ổn định tăng cường.


/*backtest
start: 2022-12-08 00:00:00
end: 2023-12-14 00:00:00
period: 1d
basePeriod: 1h
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 [BTC|M15]",overlay = true, pyramiding = 1,initial_capital = 10000, default_qty_type = strategy.cash,default_qty_value = 10000)

//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)




Thêm nữa