Đánh dấu chiến lược

Tác giả:ChaoZhang, Ngày: 2023-11-02 14:39:22
Tags:

img

Tổng quan

Chiến lược này xác định các cổ phiếu tăng nhanh và có vị trí dài khi giá phá vỡ mức cao mới. Nó sử dụng tỷ lệ lợi nhuận cố định để khóa lợi nhuận. Chiến lược thuộc về các chiến lược theo xu hướng.

Nguyên tắc

Chiến lược này chủ yếu dựa trên hai chỉ số:

  1. Chỉ số RSI nhanh: Nó tính toán sự tăng và giảm của 3 thanh gần đây để đánh giá đà tăng giá. Khi chỉ số RSI nhanh dưới 10, nó được coi là tình trạng bán quá mức.

  2. Bộ lọc cơ thể: Nó tính toán kích thước cơ thể trung bình của 20 thanh gần đây. Khi kích thước cơ thể lớn hơn 2,5 lần so với kích thước cơ thể trung bình, nó được coi là một sự đột phá hợp lệ.

Khi chỉ số RSI nhanh dưới 10 và bộ lọc cơ thể là hợp lệ, một vị trí dài sẽ được mở. Sau đó, một lợi nhuận cố định là 20% được thiết lập. Khi giá vượt quá giá mở * (1 + tỷ lệ lợi nhuận), vị trí sẽ được đóng.

Lợi thế của chiến lược này là nó có thể nắm bắt các cơ hội đột phá vào đầu xu hướng. RSI nhanh đánh giá mức bán quá mức và bộ lọc cơ thể tránh đột phá sai. Tỷ lệ phần trăm cố định lấy lợi nhuận khóa trong lợi nhuận của mỗi giao dịch và tiếp tục bắt xu hướng.

Phân tích lợi thế

Những lợi thế của chiến lược này:

  1. Chỉ số RSI nhanh xác định mức bán quá mức và tăng độ chính xác nhập cảnh.

  2. Bộ lọc cơ thể tránh các sự đột quỵ giả do biến động.

  3. Tỷ lệ lợi nhuận cố định đạt được lợi nhuận ổn định và bắt được xu hướng.

  4. Lý thuyết đơn giản và rõ ràng, dễ hiểu và thực hiện.

  5. Cấu trúc mã thanh lịch với khả năng mở rộng tuyệt vời, dễ tối ưu hóa.

  6. Lợi nhuận tích cực ổn định và tỷ lệ thắng cao trong backtest.

Phân tích rủi ro

Một số rủi ro cần lưu ý:

  1. Không có cơ chế dừng lỗ, rủi ro mở rộng lỗ.

  2. Mức lợi nhuận không phù hợp có thể dẫn đến thoát sớm hoặc quá sâu.

  3. Các khoản lỗ nhỏ liên tiếp có thể xảy ra trong các thị trường bất ổn.

  4. Chi phí tài chính không được xem xét, lợi nhuận thực tế có thể thấp hơn.

  5. Tối ưu hóa tham số không đủ trên các sản phẩm khác nhau.

Hướng dẫn tối ưu hóa

Một số khía cạnh có thể được tối ưu hóa:

  1. Thêm stop loss để kiểm soát lỗ giao dịch duy nhất.

  2. Tối ưu hóa động lợi nhuận để theo xu hướng.

  3. Cải thiện logic thoát để cải thiện độ chính xác nhập.

  4. Thêm mô-đun kích thước vị trí để tối ưu hóa việc sử dụng vốn.

  5. Thêm module tối ưu hóa tham số cho các sản phẩm khác nhau.

  6. Thêm bộ lọc để tránh mất mát trong thị trường hỗn loạn.

  7. Xem xét thêm quản lý chi phí trung bình.

Kết luận

Tóm lại, đây là một chiến lược theo xu hướng thanh lịch và đơn giản. Nó sử dụng chỉ số RSI nhanh để xác định mức bán quá mức, bộ lọc cơ thể để xác nhận sự phá vỡ hợp lệ và tỷ lệ lợi nhuận cố định để tạo ra lợi nhuận ổn định. Mặc dù có không gian tối ưu hóa, chiến lược đáp ứng và phù hợp với thị trường thay đổi nhanh chóng, làm cho nó trở thành một chiến lược giao dịch rất thực tế. Với việc tối ưu hóa liên tục, nó có thể trở thành một chiến lược lâu dài mạnh mẽ.


/*backtest
start: 2022-10-26 00:00:00
end: 2023-11-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// this is based on https://www.tradingview.com/v/PbQW4mRn/
strategy(title = "ONLY LONG V4 v1", overlay = true, initial_capital = 1000, pyramiding = 1000,
   calc_on_order_fills = false, calc_on_every_tick = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 50, commission_value = 0.075)

//study(title = "ONLY LONG V4 v1", overlay = true)

//Fast RSI
src = close
fastup = rma(max(change(src), 0), 3)
fastdown = rma(-min(change(src), 0), 3)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Body Filter
body = abs(close - open)
abody = sma(body, 20)

mac = sma(close, 20)
len = abs(close - mac)
sma = sma(len, 100)
max = max(open, close)
min = min(open, close)
up = close < open and len > sma * 2 and min < min[1] and fastrsi < 10 and body > abody * 2.5

// Strategy
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

var bool longCondition = na

longCondition := up == 1 ? 1 : na

// Get the price of the last opened long

var float last_open_longCondition = na

last_open_longCondition := longCondition ? close : nz(last_open_longCondition[1])

// Get the bar time of the last opened long

var int last_longCondition = 0

last_longCondition := longCondition ? time : nz(last_longCondition[1])

// Take profit
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

tp = input(20, "TAKE PROFIT %", type = input.float, minval = 0, step = 0.5)

long_tp = crossover(high, (1+(tp/100))*last_open_longCondition) and not longCondition

// Get the time of the last tp close

var int last_long_tp = na

last_long_tp := long_tp ? time : nz(last_long_tp[1])

Final_Long_tp = long_tp and last_longCondition > nz(last_long_tp[1])

// Count your long conditions

var int sectionLongs = 0

sectionLongs := nz(sectionLongs[1])

var int sectionTPs = 0

sectionTPs := nz(sectionTPs[1])

// Longs Counter

if longCondition
    sectionLongs := sectionLongs + 1
    sectionTPs := 0

if Final_Long_tp
    sectionLongs := 0
    sectionTPs := sectionTPs + 1
    
// Signals
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

// Long

// label.new(
//    x = longCondition[1] ? time : na, 
//    y = na, 
//    text = 'LONG'+tostring(sectionLongs), 
//    color=color.lime, 
//    textcolor=color.black,  
//    style = label.style_labelup, 
//    xloc = xloc.bar_time, 
//    yloc = yloc.belowbar,
//    size = size.tiny)
   
// Tp

// label.new(
//    x = Final_Long_tp ? time : na, 
//    y = na, 
//    text = 'PROFIT '+tostring(tp)+'%', 
//    color=color.orange, 
//    textcolor=color.black,  
//    style = label.style_labeldown, 
//    xloc = xloc.bar_time, 
//    yloc = yloc.abovebar,
//    size = size.tiny) 

ltp = iff(Final_Long_tp, (last_open_longCondition*(1+(tp/100))), na), plot(ltp, style=plot.style_cross, linewidth=3, color = color.white, editable = false)

// Backtesting
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

testStartYear = input(2019, "BACKTEST START YEAR", minval = 1, maxval = 2222) 
testStartMonth = input(01, "BACKTEST START MONTH", minval = 1, maxval = 12)
testStartDay = input(01, "BACKTEST START DAY", minval = 1, maxval = 31)
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

strategy.entry("long", strategy.long, when = longCondition and (time >= testPeriodStart))
strategy.exit("TP", "long", limit = (last_open_longCondition*(1+(tp/100))))

// Alerts
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

alertcondition(longCondition[1], title="Long Alert", message = "LONG")
alertcondition(Final_Long_tp, title="Long TP Alert", message = "LONG TP")


Thêm nữa