Chiến lược kết hợp chỉ số trung bình động và chỉ số thấp cao tích lũy

Tác giả:ChaoZhang, Ngày: 2023-11-21 15:19:35
Tags:

img

Tổng quan

Chiến lược này chủ yếu kết hợp chỉ số thấp cao, chỉ số trung bình động và chỉ số siêu xu hướng để xác định xu hướng thị trường và các vị trí mở.

Chiến lược logic

  1. Chỉ số thấp cao đánh giá giá liệu giá gần đây nhất trong một khoảng thời gian nhất định đã tạo ra mức cao mới hay mức thấp mới, và tích lũy điểm số. Khi điểm số tăng, nó đại diện cho sự tăng cường của các lực lượng tăng. Khi điểm số giảm, nó đại diện cho sự tăng cường của các lực lượng giảm.

  2. Chỉ số Moving Average đánh giá giá liệu giá có đang trong xu hướng tăng theo hình cầu thang lên hay xu hướng giảm theo hình cầu thang xuống. Khi trung bình động cho thấy xu hướng tăng theo hình cầu thang, nó đại diện cho sự tăng cường của các lực lượng tăng. Khi nó cho thấy sự suy giảm theo hình cầu thang, nó đại diện cho sự tăng cường của các lực lượng giảm.

  3. Kết hợp các phán quyết của Chỉ số thấp cao và Chỉ số trung bình động để xác định xu hướng thị trường, và sau đó tìm cơ hội giao dịch kết hợp với hướng của Chỉ số siêu xu hướng. Cụ thể, khi cả Chỉ số thấp cao và Chỉ số trung bình động đều cho thấy sức mạnh tăng và hướng của Chỉ số siêu xu hướng là giảm, mở các vị trí dài. Khi cả hai chỉ số cho thấy sức mạnh giảm và hướng của Chỉ số siêu xu hướng là tăng, mở các vị trí ngắn.

Ưu điểm

  1. Chỉ số thấp cao có thể đánh giá hiệu quả chuyển động giá và thay đổi động lực. Chỉ số trung bình động có thể xác định hiệu quả xu hướng giá. Sự kết hợp của cả hai có thể xác định chính xác hơn hướng thị trường.

  2. Khởi mở các vị trí kết hợp với Chỉ số siêu xu hướng có thể tránh mở sớm hoặc muộn các vị trí.

  3. Nhiều chỉ số xác minh lẫn nhau và giảm tín hiệu sai.

Rủi ro

  1. Các tín hiệu không chính xác từ Chỉ số thấp cao và Chỉ số trung bình động có thể dẫn đến các vị trí gây lỗ.

  2. Sự tham gia không đủ và cài đặt tham số không đúng của Chỉ số siêu xu hướng có thể tạo ra các tín hiệu không chính xác.

  3. Sự đảo ngược xu hướng nhanh chóng và cài đặt dừng lỗ không đúng có thể dẫn đến tổn thất lớn.

  4. Rủi ro có thể được giảm bằng cách tối ưu hóa các tham số chỉ số, điều chỉnh mức giá dừng lỗ, v.v.

Tối ưu hóa

  1. Kiểm tra các loại chỉ số trung bình động khác nhau để tìm ra sự kết hợp tối ưu của các tham số.

  2. Tối ưu hóa các thông số của Chỉ số thấp cao và Chỉ số trung bình động để làm cho các tín hiệu ổn định và đáng tin cậy hơn.

  3. Bao gồm các chỉ số khác để xác minh, chẳng hạn như MACD, KD, vv, để giảm tín hiệu sai.

  4. Kết hợp các thuật toán học máy để tự động tối ưu hóa các tham số và trọng lượng tín hiệu.

  5. Bao gồm phân tích tình cảm để tránh giao dịch các sản phẩm ít phổ biến hơn.

Kết luận

Chiến lược này xác định xu hướng và động lực thị trường thông qua chỉ số thấp cao và chỉ số trung bình động, và sau đó lọc các tín hiệu bằng chỉ số siêu xu hướng, mở các vị trí khi các lực tăng và giảm đối mặt với nhau và chỉ số siêu xu hướng đảo ngược. Ưu điểm của nó nằm trong việc xác minh nhiều tín hiệu và mở đúng thời điểm các vị trí, có thể kiểm soát rủi ro hiệu quả. Các vấn đề hiện có bao gồm tín hiệu sai và đánh giá sai xu hướng. Có thể thực hiện nhiều cải tiến thông qua tối ưu hóa tham số, cài đặt dừng lỗ, lọc tín hiệu, vv để làm cho chiến lược mạnh mẽ và đáng tin cậy hơn.


/*backtest
start: 2023-10-21 00:00:00
end: 2023-11-20 00:00:00
period: 1h
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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("AlignedMA and Cumulative HighLow Strategy", overlay=true, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

MAType = input(title="Moving Average Type", defval="sma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
includePartiallyAligned = input(true)
HighLowPeriod = input(50, minval=1,step=1)
LookbackPeriod = input(10, minval=1,step=1)

supertrendMult = input(2, minval=1, maxval=10, step=0.5)
supertrendLength = input(10, minval=1)

tradeDirection = input(title="Trade Direction", defval=strategy.direction.long, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])
backtestYears = input(10, minval=1, step=1)

f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma
    
f_getMaAlignment(MAType, includePartiallyAligned)=>
    ma5 = f_getMovingAverage(close,MAType,5)
    ma10 = f_getMovingAverage(close,MAType,10)
    ma20 = f_getMovingAverage(close,MAType,20)
    ma30 = f_getMovingAverage(close,MAType,30)
    ma50 = f_getMovingAverage(close,MAType,50)
    ma100 = f_getMovingAverage(close,MAType,100)
    ma200 = f_getMovingAverage(close,MAType,200)

    upwardScore = 0
    upwardScore := close > ma5? upwardScore+1:upwardScore
    upwardScore := ma5 > ma10? upwardScore+1:upwardScore
    upwardScore := ma10 > ma20? upwardScore+1:upwardScore
    upwardScore := ma20 > ma30? upwardScore+1:upwardScore
    upwardScore := ma30 > ma50? upwardScore+1:upwardScore
    upwardScore := ma50 > ma100? upwardScore+1:upwardScore
    upwardScore := ma100 > ma200? upwardScore+1:upwardScore
    
    upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200
    downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200
    upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 5? 0.5: upwardScore < 2?-0.5:upwardScore>3?0.25:-0.25) : 0

f_getHighLowValue(HighLowPeriod)=>
    currentHigh = highest(high,HighLowPeriod) == high
    currentLow = lowest(low,HighLowPeriod) == low
    currentHigh?1:currentLow?-1:0

inDateRange = time >= timestamp(syminfo.timezone, year(timenow) - backtestYears, 01, 01, 0, 0)

maAlignment = f_getMaAlignment(MAType,includePartiallyAligned)
alignedMaIndex = sum(maAlignment,LookbackPeriod)

maAlignmentDirection = alignedMaIndex > alignedMaIndex[1] ? 1 : alignedMaIndex < alignedMaIndex[1] ? -1 : 0
maAlignmentDirection := maAlignmentDirection == 0? nz(maAlignmentDirection[1],0):maAlignmentDirection

highLowIndex = f_getHighLowValue(HighLowPeriod)
cumulativeHighLowIndex = sum(highLowIndex,LookbackPeriod)

hlDirection = cumulativeHighLowIndex > cumulativeHighLowIndex[1] ? 1 : cumulativeHighLowIndex < cumulativeHighLowIndex[1] ? -1 : 0
hlDirection := hlDirection == 0? nz(hlDirection[1],0):hlDirection

[superTrend, dir] = supertrend(supertrendMult, supertrendLength)

buyEntry = (dir == -1 and maAlignmentDirection == 1 and hlDirection == 1)
sellEntry = (dir == 1 and maAlignmentDirection == -1 and hlDirection == -1)

barColor = buyEntry?color.lime:sellEntry?color.orange:color.gray
barcolor(barColor)

// strategy.risk.allow_entry_in(tradeDirection)
strategy.entry("Buy", strategy.long, when=barColor == color.lime and inDateRange, oca_name="oca_buy")
strategy.close("Buy", when=dir == 1)

strategy.entry("Sell", strategy.short, when=barColor == color.orange and inDateRange, oca_name="oca_sell")
strategy.close("Sell", when=dir == -1)


Thêm nữa