Chiến lược xu hướng siêu Ichimoku


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

Chiến lược xu hướng siêu Ichimoku

Tổng quan

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ẽ.

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

Chiến lược này dựa trên các yếu tố sau:

  1. 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

  2. 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.

  3. 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:

  • Đường chuyển đổi cao hơn đường chuẩn
  • Giá cao hơn đường chuyển đổi và đường chuẩn
  • Đường chuyển đổi và đường chuẩn cao hơn dải mây
  • Giá thu hồi dưới đường chuyển đổi và đường chuẩn

Đánh dấu không khí:

  • Đường chuyển đổi thấp hơn đường chuẩn
  • Giá thấp hơn đường chuyển đổi và đường chuẩn
  • Đường chuyển đổi và đường chuẩn dưới vùng mây
  • Giá thu hồi trên đường chuyển đổi và đường chuẩn

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í.

Phân tích lợi thế

Chiến lược siêu một có những lợi thế sau:

  1. 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

  2. Đườ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

  3. Đ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ả

  4. 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ẻ

  5. Lợi nhuận ổn định hơn thua lỗ hợp lý

  6. 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

  7. 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ố

  8. Có thể hoạt động tốt trong nhiều môi trường thị trường

Phân tích rủi ro

Chiến lược vượt qua 1 cũng có những rủi ro sau:

  1. 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

  2. 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

  3. 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

  4. 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

  5. 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:

  1. 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

  2. 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

  3. Động thái điều chỉnh vị trí dừng để giảm khả năng dừng bị kích hoạt

  4. Kiểm tra các thiết lập tỷ lệ lợi nhuận khác nhau

  5. 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

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

Chiến lược vượt qua một có thể được tối ưu hóa từ:

  1. 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

  2. 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

  3. 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

  4. 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

  5. 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ỳ

  6. 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

  7. 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

  8. 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

Tóm tắt

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ỳ.

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