Chiến lược giao dịch theo đà


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

Chiến lược giao dịch theo đà

Tổng quan

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

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

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. Khi giá vượt qua kênh, nó là tín hiệu bullish, và nếu nó vượt qua, nó là tín hiệu bearish. Tiếp theo, chiến lược sử dụng một trong ba biến thể trung bình di chuyển của Hull, kết hợp với khả năng tự điều chỉnh kênh ATR để có được sự phán đoán xu hướng chính xác hơn.

Phân tích lợi thế

Lợi thế lớn nhất của chiến lược DMO là 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, do đó lọc các tín hiệu giả, 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, phương pháp lọc các tín hiệu đường trung bình nửa hoàn chỉnh của kênh Doinchian để đánh giá xu hướng chính là đơn giản và trực tiếp, cũng là phương tiện thông thường hơn, nói chung dễ hiểu và không khó khăn cho người mới bắt đầu. So với chỉ số đơn lẻ, DMO có thể có tỷ lệ thắng và lợi nhuận cao hơn với số lần giao dịch tương đương.

Phân tích rủi ro

Mặc dù chiến lược DMO là ổ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ó một số rủi ro. Cụ thể, khi đường nhanh và đường trung tạo ra ngã ba, nếu không có xác minh các chỉ số khác, nó vẫn có thể là tín hiệu giả. Ngoài ra, giống như tất cả các chiến lược đường ngắn, DMO cũng phải đối mặt với một số rủi ro giao dịch quá mức. Nếu gặp sự cố bất ngờ của thị trường dẫn đến thất bại của chỉ số, thiết lập mức dừng lỗ không đúng cách cũng sẽ gây ra tổn thất lớn. Để giảm rủi ro, khuyến nghị điều chỉnh các tham số chỉ số trung bình và dài hạn một cách thích hợp và kiểm tra kết hợp với các chỉ số có chu kỳ thời gian cao hơn, đồng thời tăng khoảng cách mất mát lớn, kiểm soát chặt chẽ lỗ hổng đơn lẻ.

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

Chiến lược DMO có thể được tối ưu hóa từ một số chiều sau: thứ nhất, điều chỉnh các tham số của Hull MA, tối ưu hóa chiều dài của đường trung bình di chuyển, cân bằng giữa hiệu quả mượt và độ nhạy; thứ hai, cải thiện logic phán đoán kênh Doinchian, chẳng hạn như điều chỉnh tham số kênh hoặc tăng thêm các điều kiện giới hạn nhập cảnh; thứ ba, thử các chỉ số khác thay vì trung bình bán nguyên, chẳng hạn như Brinband, KDJ, để tăng hiệu quả lọc hỗ trợ; thứ tư, chỉ định khoảng thời gian giao dịch phù hợp theo các đặc điểm của các loại khác nhau, chẳng hạn như thay đổi thành chiến lược 5 phút hoặc 30 phút.

Tóm tắt

DMO là một chiến lược ngắn gọn cho việc tối ưu hóa danh mục nhiều chỉ số. Nó kết hợp các kênh Doinchian, Hull MA và trung bình nửa chừng, đánh giá hiệu quả xu hướng thị trường và tạo ra tín hiệu giao dịch chính xác.

Mã nguồn chiến lược
/*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)