Chiến lược giao dịch thuật toán theo dõi đường kép


Ngày tạo: 2023-10-30 15:27:34 sửa đổi lần cuối: 2023-10-30 15:27:34
sao chép: 1 Số nhấp chuột: 718
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch thuật toán theo dõi đường kép

Tổng quan

Chiến lược này chủ yếu sử dụng nguyên tắc chéo ngang, kết hợp với tín hiệu đảo ngược của chỉ số RSI, và thuật toán theo dõi hai đường theo dõi tùy chỉnh để thực hiện giao dịch chéo ngang. Chiến lược theo dõi chéo ngang của hai chu kỳ khác nhau, một đường trung bình nhanh theo dõi xu hướng ngắn hạn, và một đường trung bình chậm theo dõi xu hướng dài hạn. Khi đường trung bình nhanh đi qua đường trung bình chậm, cho thấy xu hướng ngắn hạn đi lên, có thể mua; khi đường trung bình nhanh đi qua đường trung bình chậm, cho thấy xu hướng ngắn hạn kết thúc, nên đóng cửa.

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

  1. Tính trung bình VWAP của hai nhóm tham số khác nhau, đại diện cho xu hướng dài hạn và ngắn hạn

    • Xu hướng dài hạn của tính toán đường chân trời chậm và đường chuẩn
    • Xu hướng ngắn hạn trong tính toán đường chân trời nhanh và đường chuẩn
  2. Lấy trung bình của hai nhóm đường canh và đường chuẩn như đường trung bình chậm và đường trung bình nhanh

  3. Tính toán các chỉ số Brin để đánh giá sự cân bằng và phá vỡ

    • Đường trung là trung bình của đường trung bình nhanh và đường trung bình chậm
    • Brin đeo lên và xuống đường ray để đánh giá đột phá
  4. Tính năng TSV để xác định khối lượng giao dịch

    • TSV lớn hơn 0 cho thấy tăng mạnh hơn giảm mạnh
    • TSV lớn hơn EMA
  5. Tính toán chỉ số RSI để đánh giá quá mua quá bán

    • RSI thấp hơn 30 là bán tháo và mua được.
    • RSI cao hơn 70 là khoảng mua quá mức, nên bán
  6. Điều kiện tham gia:

    • Đi qua đường trung bình tốc độ chậm
    • Giá đóng cửa trên đường ray băng Brin
    • TSV lớn hơn 0 và lớn hơn EMA
    • RSI dưới 30
  7. Điều kiện:

    • Dưới đường trung bình nhanh xuyên qua đường trung bình chậm
    • RSI cao hơn 70

Phân tích lợi thế

  1. Sử dụng hệ thống song song, có thể chụp cùng một xu hướng ngắn hạn và dài hạn

  2. Chỉ số RSI tránh mua vào vùng quá mua, bán ra vùng quá bán

  3. Chỉ số TSV đảm bảo có đủ khối lượng giao dịch để hỗ trợ xu hướng

  4. Những bước đột phá quan trọng trong việc sử dụng dải Brin

  5. Một loạt các chỉ số có thể lọc các đột phá giả

Phân tích rủi ro

  1. Hệ thống đồng tuyến dễ tạo ra tín hiệu sai, cần lọc chỉ số phụ

  2. Các tham số của chỉ số RSI cần được tối ưu hóa, nếu không có thể bỏ lỡ điểm mua và bán

  3. Chỉ số TSV cũng nhạy cảm với các tham số, cần được kiểm tra cẩn thận

  4. Bắt được đường ray của Brin có thể là một vụ đột phá giả và cần được xác minh

  5. Gói đa chỉ số, khó tối ưu hóa tham số, dễ tối ưu hóa quá mức

  6. Dữ liệu huấn luyện và thử nghiệm không đầy đủ có thể dẫn đến sự phù hợp của đường cong

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

  1. Kiểm tra nhiều tham số chu kỳ hơn để tìm ra sự kết hợp tham số tốt nhất

  2. Thử các chỉ số khác như MACD, KD thay thế hoặc kết hợp RSI

  3. Tối ưu hóa tham số để tận dụng tối đa phân tích tiến bộ

  4. Tăng chiến lược dừng lỗ để kiểm soát tổn thất đơn lẻ

  5. Cân nhắc tham gia vào mô hình học máy hỗ trợ nhận định tín hiệu

  6. Điều chỉnh tham số cho các thị trường khác nhau, không quá phụ thuộc vào một tập hợp tham số duy nhất

Tóm tắt

Chiến lược này sử dụng hệ thống hai đường bằng nhau để nắm bắt xu hướng ngắn hạn dài, đồng thời sử dụng nhiều chỉ số lọc tín hiệu như RSI, TSV, và Brin. Lợi thế của chiến lược là có thể theo chiều ngang, để nắm bắt làn sóng tăng dài.

Mã nguồn chiến lược
/*backtest
start: 2022-10-23 00:00:00
end: 2023-10-29 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=4

// Credits

// "Vwap with period" code which used in this strategy to calculate the leadLine was written by "neolao" active on https://tr.tradingview.com/u/neolao/
// "TSV" code which used in this strategy was written by "liw0" active on https://www.tradingview.com/u/liw0. The code is corrected by "vitelot" December 2018.
// "Vidya" code which used in this strategy was written by "everget" active on https://tr.tradingview.com/u/everget/

strategy("HYE Combo Market [Strategy] (Vwap Mean Reversion + Trend Hunter)", overlay = true, initial_capital = 1000, default_qty_value = 100, default_qty_type = strategy.percent_of_equity, commission_value = 0.025)
  
//Strategy inputs

source = input(title = "Source", defval = close, group = "Mean Reversion Strategy Inputs")
smallcumulativePeriod = input(title = "Small VWAP", defval = 8, group = "Mean Reversion Strategy Inputs")
bigcumulativePeriod = input(title = "Big VWAP", defval = 10, group = "Mean Reversion Strategy Inputs")
meancumulativePeriod = input(title = "Mean VWAP", defval = 50, group = "Mean Reversion Strategy Inputs")
percentBelowToBuy = input(title = "Percent below to buy %", defval = 2, group = "Mean Reversion Strategy Inputs")
rsiPeriod = input(title = "Rsi Period", defval = 2, group = "Mean Reversion Strategy Inputs")
rsiEmaPeriod = input(title = "Rsi Ema Period", defval = 5, group = "Mean Reversion Strategy Inputs") 
rsiLevelforBuy = input(title = "Maximum Rsi Level for Buy", defval = 30, group = "Mean Reversion Strategy Inputs")
slowtenkansenPeriod = input(9, minval=1, title="Slow Tenkan Sen VWAP Line Length", group = "Trend Hunter Strategy Inputs")
slowkijunsenPeriod = input(13, minval=1, title="Slow Kijun Sen VWAP Line Length", group = "Trend Hunter Strategy Inputs")
fasttenkansenPeriod = input(3, minval=1, title="Fast Tenkan Sen VWAP Line Length", group = "Trend Hunter Strategy Inputs")
fastkijunsenPeriod = input(7, minval=1, title="Fast Kijun Sen VWAP Line Length", group = "Trend Hunter Strategy Inputs")
BBlength = input(20, minval=1, title= "Bollinger Band Length", group = "Trend Hunter Strategy Inputs")
BBmult = input(2.0, minval=0.001, maxval=50, title="Bollinger Band StdDev", group = "Trend Hunter Strategy Inputs")
tsvlength  = input(20, minval=1, title="TSV Length", group = "Trend Hunter Strategy Inputs")
tsvemaperiod = input(7, minval=1, title="TSV Ema Length", group = "Trend Hunter Strategy Inputs")
length = input(title="Vidya Length", type=input.integer, defval=20, group = "Trend Hunter Strategy Inputs") 
src = input(title="Vidya Source", type=input.source, defval= hl2 , group = "Trend Hunter Strategy Inputs")

// Vidya Calculation 

getCMO(src, length) =>
    mom = change(src)
    upSum = sum(max(mom, 0), length)
    downSum = sum(-min(mom, 0), length)
    out = (upSum - downSum) / (upSum + downSum)
    out

cmo = abs(getCMO(src, length))

alpha = 2 / (length + 1)

vidya = 0.0
vidya := src * alpha * cmo + nz(vidya[1]) * (1 - alpha * cmo)

// Make input options that configure backtest date range 

startDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31, group = "Strategy Date Range")
startMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12, group = "Strategy Date Range")
startYear = input(title="Start Year", type=input.integer,
     defval=2000, minval=1800, maxval=2100, group = "Strategy Date Range")

endDate = input(title="End Date", type=input.integer, 
     defval=31, minval=1, maxval=31, group = "Strategy Date Range")
endMonth = input(title="End Month", type=input.integer,
     defval=12, minval=1, maxval=12, group = "Strategy Date Range") 
endYear = input(title="End Year", type=input.integer,
     defval=2021, minval=1800, maxval=2100, group = "Strategy Date Range")
     
inDateRange = true
// Mean Reversion Strategy Calculation 

typicalPriceS = (high + low + close) / 3
typicalPriceVolumeS = typicalPriceS * volume
cumulativeTypicalPriceVolumeS = sum(typicalPriceVolumeS, smallcumulativePeriod)
cumulativeVolumeS = sum(volume, smallcumulativePeriod)
smallvwapValue = cumulativeTypicalPriceVolumeS / cumulativeVolumeS

typicalPriceB = (high + low + close) / 3
typicalPriceVolumeB = typicalPriceB * volume
cumulativeTypicalPriceVolumeB = sum(typicalPriceVolumeB, bigcumulativePeriod)
cumulativeVolumeB = sum(volume, bigcumulativePeriod)
bigvwapValue = cumulativeTypicalPriceVolumeB / cumulativeVolumeB 

typicalPriceM = (high + low + close) / 3
typicalPriceVolumeM = typicalPriceM * volume
cumulativeTypicalPriceVolumeM = sum(typicalPriceVolumeM, meancumulativePeriod)
cumulativeVolumeM = sum(volume, meancumulativePeriod)
meanvwapValue = cumulativeTypicalPriceVolumeM / cumulativeVolumeM

rsiValue = rsi(source, rsiPeriod)
rsiEMA   = ema(rsiValue, rsiEmaPeriod)
buyMA = ((100 - percentBelowToBuy) / 100) * bigvwapValue[0]

inTrade = strategy.position_size > 0
notInTrade = strategy.position_size <= 0

if(crossunder(smallvwapValue, buyMA) and rsiEMA < rsiLevelforBuy and close < meanvwapValue and inDateRange and notInTrade)
    strategy.entry("BUY-M", strategy.long)

if(close > meanvwapValue or not inDateRange)
    strategy.close("BUY-M")
    
// Trend Hunter Strategy Calculation

// Slow Tenkan Sen Calculation

typicalPriceTS = (high + low + close) / 3
typicalPriceVolumeTS = typicalPriceTS * volume
cumulativeTypicalPriceVolumeTS = sum(typicalPriceVolumeTS, slowtenkansenPeriod)
cumulativeVolumeTS = sum(volume, slowtenkansenPeriod)
slowtenkansenvwapValue = cumulativeTypicalPriceVolumeTS / cumulativeVolumeTS

// Slow Kijun Sen Calculation

typicalPriceKS = (high + low + close) / 3
typicalPriceVolumeKS = typicalPriceKS * volume
cumulativeTypicalPriceVolumeKS = sum(typicalPriceVolumeKS, slowkijunsenPeriod)
cumulativeVolumeKS = sum(volume, slowkijunsenPeriod)
slowkijunsenvwapValue = cumulativeTypicalPriceVolumeKS / cumulativeVolumeKS

// Fast Tenkan Sen Calculation

typicalPriceTF = (high + low + close) / 3
typicalPriceVolumeTF = typicalPriceTF * volume
cumulativeTypicalPriceVolumeTF = sum(typicalPriceVolumeTF, fasttenkansenPeriod)
cumulativeVolumeTF = sum(volume, fasttenkansenPeriod)
fasttenkansenvwapValue = cumulativeTypicalPriceVolumeTF / cumulativeVolumeTF

// Fast Kijun Sen Calculation

typicalPriceKF = (high + low + close) / 3
typicalPriceVolumeKF = typicalPriceKS * volume
cumulativeTypicalPriceVolumeKF = sum(typicalPriceVolumeKF, fastkijunsenPeriod)
cumulativeVolumeKF = sum(volume, fastkijunsenPeriod)
fastkijunsenvwapValue = cumulativeTypicalPriceVolumeKF / cumulativeVolumeKF

// Slow LeadLine Calculation
 
lowesttenkansen_s = lowest(slowtenkansenvwapValue, slowtenkansenPeriod)
highesttenkansen_s = highest(slowtenkansenvwapValue, slowtenkansenPeriod)

lowestkijunsen_s = lowest(slowkijunsenvwapValue, slowkijunsenPeriod)
highestkijunsen_s = highest(slowkijunsenvwapValue, slowkijunsenPeriod)

slowtenkansen = avg(lowesttenkansen_s, highesttenkansen_s)
slowkijunsen = avg(lowestkijunsen_s, highestkijunsen_s)
slowleadLine = avg(slowtenkansen, slowkijunsen)

// Fast LeadLine Calculation 
 
lowesttenkansen_f = lowest(fasttenkansenvwapValue, fasttenkansenPeriod)
highesttenkansen_f = highest(fasttenkansenvwapValue, fasttenkansenPeriod)

lowestkijunsen_f = lowest(fastkijunsenvwapValue, fastkijunsenPeriod)
highestkijunsen_f = highest(fastkijunsenvwapValue, fastkijunsenPeriod) 

fasttenkansen = avg(lowesttenkansen_f, highesttenkansen_f)
fastkijunsen = avg(lowestkijunsen_f, highestkijunsen_f)
fastleadLine = avg(fasttenkansen, fastkijunsen)

// BBleadLine Calculation
 
BBleadLine = avg(fastleadLine, slowleadLine)

// Bollinger Band Calculation
 
basis = sma(BBleadLine, BBlength)
dev = BBmult * stdev(BBleadLine, BBlength)
upper = basis + dev  
lower = basis - dev 

// TSV Calculation

tsv = sum(close>close[1]?volume*(close-close[1]):close<close[1]?volume*(close-close[1]):0,tsvlength)
tsvema = ema(tsv, tsvemaperiod)

// Rules for Entry & Exit  

if(fastleadLine > fastleadLine[1] and slowleadLine > slowleadLine[1] and tsv > 0 and tsv > tsvema and close > upper and close > vidya and inDateRange and notInTrade)
    strategy.entry("BUY-T", strategy.long)
 
if((fastleadLine < fastleadLine[1] and slowleadLine < slowleadLine[1]) or not inDateRange)
    strategy.close("BUY-T")

// Plots 

plot(meanvwapValue, title="MEAN VWAP", linewidth=2, color=color.yellow)

//plot(vidya, title="VIDYA", linewidth=2, color=color.green)

//colorsettingS = input(title="Solid Color Slow Leadline", defval=false, type=input.bool)
//plot(slowleadLine, title = "Slow LeadLine", color = colorsettingS ? color.aqua : slowleadLine > slowleadLine[1] ? color.green : color.red, linewidth=3)

//colorsettingF = input(title="Solid Color Fast Leadline", defval=false, type=input.bool)
//plot(fastleadLine, title = "Fast LeadLine", color = colorsettingF ? color.orange : fastleadLine > fastleadLine[1] ? color.green : color.red, linewidth=3)

//p1 = plot(upper, "Upper BB", color=#2962FF)
//p2 = plot(lower, "Lower BB", color=#2962FF)
//fill(p1, p2, title = "Background", color=color.blue)

//plot(smallvwapValue, color=#13C425, linewidth=2)
//plot(bigvwapValue, color=#CA1435, linewidth=2)