
Chiến lược này chủ yếu kết hợp các chỉ số cao thấp, chỉ số đường trung bình và chỉ số siêu xu hướng để xác định xu hướng thị trường.
Thông qua chỉ số cao thấp, đánh giá liệu giá đã tạo ra mức cao mới hay thấp mới trong một chu kỳ nhất định gần đây và tích lũy điểm. Khi điểm tăng lên, đại diện cho tăng cường lực lượng đa đầu; khi điểm giảm, đại diện cho tăng cường lực lượng trống.
Sử dụng chỉ số đường trung bình để xác định liệu giá có đang trong xu hướng tăng từ thang xuống, hoặc xu hướng giảm từ thang lên xuống. Khi đường trung bình tăng lên, nó đại diện cho tăng cường lực lượng đa đầu; Khi đường trung bình giảm xuống, nó đại diện cho tăng cường lực lượng không đầu.
Kết hợp kết quả của chỉ số cao thấp và chỉ số đường trung bình, xác định xu hướng thị trường; kết hợp với hướng của chỉ số xu hướng siêu, tìm kiếm cơ hội xây dựng vị trí. Cụ thể, khi chỉ số cao thấp và chỉ số đường trung bình cho thấy sức mạnh đa đầu tăng lên, và chỉ số xu hướng siêu hướng xuống, lập vị trí dài; khi chỉ số cao thấp và chỉ số đường trung bình cho thấy sức mạnh không đầu tăng lên, và chỉ số xu hướng siêu hướng hướng lên, lập vị trí trống.
Chỉ số cao thấp có thể xác định hiệu quả về xu hướng giá và sự thay đổi sức mạnh, chỉ số đường bằng có thể xác định hiệu quả về xu hướng giá, cả hai kết hợp có thể xác định chính xác hơn về xu hướng thị trường.
Kết hợp với chỉ số siêu xu hướng để tạo kho, có thể tránh đặt hàng quá sớm hoặc quá muộn. Chỉ số siêu xu hướng có thể xác định hiệu quả điểm đảo ngược giá.
Nhiều chỉ số được xác thực với nhau, giảm tín hiệu giả.
Nếu chỉ số cao thấp và chỉ số đường trung bình phát ra tín hiệu sai, có thể gây ra tổn thất trong việc xây dựng vị trí.
Nếu sự tham gia không cao, các tham số chỉ số siêu xu hướng được thiết lập không đúng, có thể phát ra tín hiệu sai.
Nếu xu hướng đảo ngược quá nhanh, thiết lập dừng lỗ không đúng cách có thể gây ra tổn thất lớn.
Có thể giảm rủi ro bằng cách tối ưu hóa các tham số chỉ số, điều chỉnh điểm dừng lỗ và các cách khác.
Có thể thử nghiệm các loại chỉ số đường trung bình khác nhau để tìm kiếm sự kết hợp tham số tốt nhất.
Các tham số của chỉ số cao thấp và chỉ số đường trung bình có thể được tối ưu hóa để làm cho tín hiệu ổn định và đáng tin cậy hơn.
Có thể kết hợp với các chỉ số khác để xác minh, chẳng hạn như MACD, KD, v.v., để giảm tín hiệu sai.
Có thể kết hợp các thuật toán học máy để tự động tối ưu hóa tham số và trọng lượng tín hiệu.
Có thể kết hợp với phân tích cảm xúc để đánh giá nhiệt độ thị trường, tránh giao dịch các loại nhiệt độ thấp.
Chiến lược này được sử dụng để đánh giá xu hướng và sức mạnh của thị trường thông qua các chỉ số cao thấp và chỉ số đường trung bình, sau đó kết hợp với tín hiệu lọc chỉ số siêu xu hướng, tạo vị trí khi đối đầu với lực lượng đa không và chỉ số siêu xu hướng đảo ngược, để thực hiện giao dịch có rủi ro thấp. Ưu điểm của chiến lược là xác minh nhiều chỉ số và lập vị trí kịp thời, có thể kiểm soát rủi ro một cách hiệu quả.
/*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)