
Chiến lược vượt trội là chiến lược giao dịch xu hướng dựa trên các chỉ số vượt trội để đưa ra quyết định giao dịch. Chiến lược này sử dụng đường chuyển đổi, đường chuẩn và mối quan hệ giữa các chỉ số vượt trội để xác định hướng xu hướng hiện tại và kết hợp với sự hồi phục của giá để tham gia.
Chiến lược siêu một được sử dụng chủ yếu cho các giao dịch xu hướng trên đường dài trung bình, có thể kiếm lợi nhuận trong xu hướng lớn hơn. Chiến lược này cũng có khả năng nhận biết xu hướng mạnh mẽ.
Chiến lược này dựa trên các yếu tố sau:
Mối quan hệ giữa đường chuyển đổi và đường chuẩn:Đường chuyển đổi sẽ tăng khi lên, giảm khi xuống
Màu sắc của những dải mây:Khi đám mây màu xanh lá cây, bạn sẽ thấy con chim ưng, khi màu đỏ, bạn sẽ thấy con chim ưng.
Giá đã được điều chỉnh lại:Các nhà đầu tư khác cũng có thể tham gia, nhưng họ chỉ có thể tham gia khi giá cả nằm ngoài đường chuyển đổi và đường chuẩn.
Cụ thể, các tín hiệu giao dịch của chiến lược là:
Gửi thêm tín hiệu:
Đánh dấu không khí:
Khi đồng thời đáp ứng tín hiệu làm nhiều / trống, hãy thực hiện hoạt động mở vị trí theo tình trạng vị trí.
Chiến lược siêu một có những lợi thế sau:
Sử dụng một bộ chỉ số siêu một để xác định hướng xu hướng, độ chính xác cao hơn
Đường chuyển đổi và đường chuẩn có thể xác định rõ xu hướng ngắn hạn, và dải mây có thể xác định xu hướng dài hạn
Điều kiện yêu cầu giá quay trở lại đường xoay, tránh thiệt hại do phá vỡ giả
Kiểm soát rủi ro sử dụng giá dừng tối đa trong thời gian gần đây để kiểm soát hiệu quả tổn thất đơn lẻ
Lợi nhuận ổn định hơn thua lỗ hợp lý
Có thể áp dụng trong các chu kỳ khác nhau, phù hợp với giao dịch xu hướng đường dài
Kế hoạch chiến lược rõ ràng, dễ hiểu, có nhiều khả năng tối ưu hóa tham số
Có thể hoạt động tốt trong nhiều môi trường thị trường
Chiến lược vượt qua 1 cũng có những rủi ro sau:
Trong một thị trường chấn động, stop loss có thể được kích hoạt thường xuyên, ảnh hưởng đến hiệu quả lợi nhuận
Khi xu hướng thay đổi nhanh chóng, không thể đảo ngược vị trí kịp thời có thể dẫn đến tổn thất
Tỷ lệ lợi nhuận và lỗ hổng được thiết lập không phù hợp với tất cả các giống và cần điều chỉnh các tham số cho các tiêu chuẩn khác nhau
Có thể có lợi nhuận hạn chế khi có ít không gian để di chuyển sau khi vượt qua vùng mây
Các tham số chỉ số cần được kiểm tra và tối ưu hóa nhiều lần, không phù hợp với các giống có tham số được điều chỉnh thường xuyên
Bạn có thể làm giảm nguy cơ bằng cách:
Tối ưu hóa các tham số để phù hợp hơn với các đặc điểm khác nhau về chu kỳ và giống
Kết hợp các chỉ số khác để lọc tín hiệu nhập cảnh, tránh phá vỡ giả trong thị trường chấn động
Động thái điều chỉnh vị trí dừng để giảm khả năng dừng bị kích hoạt
Kiểm tra các thiết lập tỷ lệ lợi nhuận khác nhau
Sử dụng các phương pháp như hình dạng biểu đồ để xác định tín hiệu xu hướng mạnh hoặc yếu
Chiến lược vượt qua một có thể được tối ưu hóa từ:
Tối ưu hóa các tham số đường chuyển đổi và đường chuẩn để phù hợp hơn với đặc điểm của các loại được giao dịch
Tối ưu hóa các tham số của dải mây để dải mây có thể đánh giá chính xác hơn về xu hướng dài hạn
Tối ưu hóa thuật toán dừng lỗ, chẳng hạn như thiết lập dừng lỗ theo ATR hoặc dừng động
Bộ lọc tín hiệu kết hợp với các chỉ số khác, cấu hình nhiều điều kiện lọc hơn, giảm khả năng nhập sai
Tối ưu hóa các thiết lập so sánh lợi nhuận và thua lỗ, thích ứng với các chiến lược trên các giống khác nhau và các đặc điểm về chu kỳ
Sử dụng phương pháp Martingale để quản lý vị thế, thích ứng với tần số biến động khác nhau của thị trường
Sử dụng phương pháp học máy để tối ưu hóa các tham số để đạt được sự ổn định cao hơn
Thiết lập các khoảng thời gian giao dịch khác nhau, điều chỉnh cho các đặc điểm giao dịch trong và giữa các phiên giao dịch
Chiến lược vượt trội là một chiến lược rất phù hợp cho giao dịch xu hướng đường dài và trung bình. Nó có lợi thế rõ ràng trong việc sử dụng chỉ số vượt trội để xác định hướng xu hướng, đồng thời kết hợp với việc điều chỉnh giá để vào thị trường có thể ngăn chặn một cách hiệu quả. Bằng cách thiết lập tham số tối ưu hóa, chiến lược có thể đạt được lợi nhuận ổn định trên nhiều giống và nhiều chu kỳ.
/*backtest
start: 2022-11-05 00:00:00
end: 2023-11-05 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// Strategy based on the the SuperIchi indicator.
//
// Strategy was designed for the purpose of back testing.
// See strategy documentation for info on trade entry logic.
//
// Credits:
// - SuperIchi [LUX]: LuxAlgo (https://www.tradingview.com/script/vDGd9X9y-SuperIchi-LUX/)
//@version=5
strategy("SuperIchi Strategy", overlay=true, initial_capital=1000, currency=currency.NONE, max_labels_count=500, default_qty_type=strategy.cash, commission_type=strategy.commission.percent, commission_value=0.01)
// =============================================================================
// STRATEGY INPUT SETTINGS
// =============================================================================
// ---------------
// Risk Management
// ---------------
swingLength = input.int(15, "Swing High/Low Lookback Length", group='Strategy: Risk Management', tooltip='Stop Loss is calculated by the swing high or low over the previous X candles')
accountRiskPercent = input.float(2, "Account percent loss per trade", step=0.1, group='Strategy: Risk Management', tooltip='Each trade will risk X% of the account balance')
profitFactor = input.float(2, "Profit Factor (R:R Ratio)", step = 0.1, group='Strategy: Risk Management')
useAtrOverride = input.bool(true, "Use Swing High/Low ATR Override", group='Strategy: Risk Management', tooltip='In some cases price may not have a large enough (if any) swing withing previous X candles. Turn this on to use an ATR value when swing high/low is lower than the given ATR value')
atrMultiplier = input.int(1, "Swing High/Low ATR Override Multiplier", group='Strategy: Risk Management')
atrLength = input.int(14, "Swing High/Low ATR Override Length", group='Strategy: Risk Management')
// -----------------
// Strategy Settings
// -----------------
pullbackLength = input.int(5, "Pullback Lookback Length", group='Strategy: Settings', tooltip='Number of candles to consider for a pullback into the moving averages (prerequisite for trade entry)')
// ----------
// Date Range
// ----------
start_year = input.int(title='Start Date', defval=2022, minval=2010, maxval=3000, group='Strategy: Date Range', inline='1')
start_month = input.int(title='', defval=1, group='Strategy: Date Range', inline='1', options = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
start_date = input.int(title='', defval=1, group='Strategy: Date Range', inline='1', options = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31])
end_year = input.int(title='End Date', defval=2023, minval=1800, maxval=3000, group='Strategy: Date Range', inline='2')
end_month = input.int(title='', defval=1, group='Strategy: Date Range', inline='2', options = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
end_date = input.int(title='', defval=1, group='Strategy: Date Range', inline='2', options = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31])
in_date_range = time >= timestamp(syminfo.timezone, start_year, start_month, start_date, 0, 0) and time < timestamp(syminfo.timezone, end_year, end_month, end_date, 0, 0)
// =============================================================================
// INDICATORS
// =============================================================================
// ---------------
// SuperIchi [LUX]
// ---------------
tenkan_len = input(9,'Tenkan ',inline='SuperIchi', group='Indicator: SuperIchi Settings')
tenkan_mult = input(2.,'',inline='SuperIchi', group='Indicator: SuperIchi Settings')
kijun_len = input(26,'Kijun ',inline='SuperIchi', group='Indicator: SuperIchi Settings')
kijun_mult = input(4.,'',inline='SuperIchi', group='Indicator: SuperIchi Settings')
spanB_len = input(52,'Senkou Span B ',inline='SuperIchi', group='Indicator: SuperIchi Settings')
spanB_mult = input(6.,'',inline='SuperIchi', group='Indicator: SuperIchi Settings')
offset = input(26,'Displacement', inline='SuperIchi', group='Indicator: SuperIchi Settings')
//------------------------------------------------------------------------------
avg(src,length,mult)=>
atr = ta.atr(length)*mult
up = hl2 + atr
dn = hl2 - atr
upper = 0.,lower = 0.
upper := src[1] < upper[1] ? math.min(up,upper[1]) : up
lower := src[1] > lower[1] ? math.max(dn,lower[1]) : dn
os = 0,max = 0.,min = 0.
os := src > upper ? 1 : src < lower ? 0 : os[1]
spt = os == 1 ? lower : upper
max := ta.cross(src,spt) ? math.max(src,max[1]) : os == 1 ? math.max(src,max[1]) : spt
min := ta.cross(src,spt) ? math.min(src,min[1]) : os == 0 ? math.min(src,min[1]) : spt
math.avg(max,min)
//------------------------------------------------------------------------------
tenkan = avg(close,tenkan_len,tenkan_mult)
kijun = avg(close,kijun_len,kijun_mult)
senkouA = math.avg(kijun,tenkan)
senkouB = avg(close,spanB_len,spanB_mult)
//------------------------------------------------------------------------------
tenkan_css = #2157f3 //blue
kijun_css = #ff5d00 //red
cloud_a = color.new(color.teal,80)
cloud_b = color.new(color.red,80)
chikou_css = #7b1fa2
plot(tenkan,'Tenkan-Sen',tenkan_css)
plot(kijun,'Kijun-Sen',kijun_css)
plot(ta.crossover(tenkan,kijun) ? kijun : na,'Crossover',#2157f3,3,plot.style_circles)
plot(ta.crossunder(tenkan,kijun) ? kijun : na,'Crossunder',#ff5d00,3,plot.style_circles)
A = plot(senkouA,'Senkou Span A',na,offset=offset-1)
B = plot(senkouB,'Senkou Span B',na,offset=offset-1)
fill(A,B,senkouA > senkouB ? cloud_a : cloud_b)
plot(close,'Chikou',chikou_css,offset=-offset+1,display=display.none)
// =============================================================================
// STRATEGY LOGIC
// =============================================================================
plotchar(kijun, "kijun", "", location = location.top)
plotchar(senkouA[offset-1], "senkouA", "", location = location.top)
plotchar(tenkan > kijun, "line above", "", location = location.top)
plotchar(close > tenkan, "price above", "", location = location.top)
plotchar(kijun > senkouA[offset-1], "above cloud", "", location = location.top)
// blue line above red line + price above both lines + both lines above cloud
longSen = tenkan > kijun and close > tenkan and kijun > senkouA[offset-1]
// red line below blue line + price below both lines + both lines below cloud
shortSen = tenkan < kijun and close < tenkan and kijun < senkouA[offset-1]
plotchar(longSen, "longSen", "", location = location.top)
plotchar(shortSen, "shortSen", "", location = location.top)
// Cloud is green
longSenkou = senkouA[offset-1] > senkouB[offset-1]
// Cloud is red
shortSenkou = senkouA[offset-1] < senkouB[offset-1]
// price must have pulled back below sen lines before entry
barsSinceLongPullback = ta.barssince(close < kijun and close < tenkan)
longPullback = barsSinceLongPullback <= pullbackLength
// price must have pulled back above sen lines before entry
barsSinceShortPullback = ta.barssince(close > kijun and close > tenkan)
shortPullback = barsSinceShortPullback <= pullbackLength
// plotchar(lowestClose, "lowestClose", "", location = location.top)
// plotchar(highestClose, "highestClose", "", location = location.top)
inLong = strategy.position_size > 0
inShort = strategy.position_size < 0
longCondition = longSen and longSenkou and longPullback and in_date_range
shortCondition = shortSen and shortSenkou and shortPullback and in_date_range
swingLow = ta.lowest(source=low, length=swingLength)
swingHigh = ta.highest(source=high, length=swingLength)
atr = useAtrOverride ? ta.atr(atrLength) * atrMultiplier : 0
longSl = math.min(close - atr, swingLow)
shortSl = math.max(close + atr, swingHigh)
longStopPercent = math.abs((1 - (longSl / close)) * 100)
shortStopPercent = math.abs((1 - (shortSl / close)) * 100)
longTpPercent = longStopPercent * profitFactor
shortTpPercent = shortStopPercent * profitFactor
longTp = close + (close * (longTpPercent / 100))
shortTp = close - (close * (shortTpPercent / 100))
// Position sizing (default risk 2% per trade)
riskAmt = strategy.equity * accountRiskPercent / 100
longQty = math.abs(riskAmt / longStopPercent * 100) / close
shortQty = math.abs(riskAmt / shortStopPercent * 100) / close
if (longCondition and not inLong)
strategy.entry("Long", strategy.long, qty=longQty)
strategy.exit("Long SL/TP", from_entry="Long", stop=longSl, limit=longTp, alert_message='Long SL Hit')
buyLabel = label.new(x=bar_index, y=high[1], color=color.green, style=label.style_label_up)
label.set_y(id=buyLabel, y=low)
label.set_tooltip(id=buyLabel, tooltip="Risk Amt: " + str.tostring(riskAmt) + "\nQty: " + str.tostring(longQty) + "\nSwing low: " + str.tostring(swingLow) + "\nStop Percent: " + str.tostring(longStopPercent) + "\nTP Percent: " + str.tostring(longTpPercent))
if (shortCondition and not inShort)
strategy.entry("Short", strategy.short, qty=shortQty)
strategy.exit("Short SL/TP", from_entry="Short", stop=shortSl, limit=shortTp, alert_message='Short SL Hit')
sellLabel = label.new(x=bar_index, y=high[1], color=color.red, style=label.style_label_up)
label.set_y(id=sellLabel, y=low)
label.set_tooltip(id=sellLabel, tooltip="Risk Amt: " + str.tostring(riskAmt) + "\nQty: " + str.tostring(shortQty) + "\nSwing high: " + str.tostring(swingHigh) + "\nStop Percent: " + str.tostring(shortStopPercent) + "\nTP Percent: " + str.tostring(shortTpPercent))