Chiến lược lưỡng cực lợi nhuận hàng tháng


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

Chiến lược lưỡng cực lợi nhuận hàng tháng

Tổng quan

Chiến lược này sử dụng các điểm trung tâm của đường K để đánh giá xu hướng đảo ngược và sử dụng nó để báo hiệu giao dịch nhiều đầu không. Khi có lợi nhuận, chiến lược sẽ khóa các khoản thu được trong tháng đó để ngăn chặn tổn thất lớn trong giai đoạn rút lui.

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

  • Sử dụngpivothigh()pivotlow()Hàm tính điểm trung tâm của đường K. Các điểm trung tâm có thể xác định xu hướng đảo ngược.
  • Khi giá vượt quá điểm trung tâm trên, thực hiện vị trí đầu nhiều. Khi giá giảm xuống điểm trung tâm dưới, thực hiện vị trí đầu ngắn.
  • Vào đầu tháng, tính lợi nhuận của tháng trước và lưu vào mảng.
  • Đầu năm, tính lãi suất của năm trước và lưu vào mảng.
  • Tạo biểu đồ lợi nhuận để bạn có thể trực quan thấy lợi nhuận hàng tháng và hàng năm.

Phân tích ưu thế

  • Sử dụng các điểm trung tâm để đánh giá xu hướng đảo ngược, bạn có thể lọc một số tín hiệu giao dịch ồn.
  • Khóa lợi nhuận hàng tháng có thể làm giảm tác động của tháng thua lỗ, lợi nhuận hai cực.
  • Bảng lợi nhuận hiển thị trực quan lợi nhuận hàng tháng, cho phép bạn nhìn thấy rõ ràng thời gian chiến lược tốt hay xấu.

Phân tích rủi ro

  • Khi điểm trung tâm thay đổi, có thể gây ra lỗi mở cửa ngược. Các tham số có thể được tối ưu hóa thích hợp hoặc tăng điều kiện lọc.
  • Việc bắt buộc đóng cửa vào đầu tháng sẽ làm mất cơ hội kiếm tiền trong tháng còn lại. Bạn có thể cân nhắc việc khóa chỉ một số vị trí.
  • Bảng không thể hiển thị các chỉ số rủi ro như rút tối đa. Bạn có thể xem xét thêm các chỉ số khác để đo lường rủi ro chiến lược.

Định hướng tối ưu hóa

  • Các điều kiện lọc có thể được thêm vào gần các điểm trung tâm để tránh các giao dịch đảo ngược không hiệu lực thường xuyên.
  • Bạn có thể khóa một số vị thế, chứ không phải tất cả các vị thế bằng phẳng, giảm khả năng bị mất.
  • Các chỉ số rủi ro định lượng như Tỷ lệ Sharpe và Tỷ lệ rút tối đa có thể được hiển thị trong bảng.

Kết luận

Chiến lược này sử dụng các điểm trung tâm để đánh giá xu hướng đảo ngược để giao dịch và khóa lợi nhuận vào cuối tháng để kiểm soát rủi ro rút lui một cách hiệu quả. Tuy nhiên, một số tham số và logic chiến lược vẫn có thể được tối ưu hóa hơn nữa để làm cho tín hiệu giao dịch chính xác hơn, kiểm soát rủi ro ổn định hơn.

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

//@version=4
strategy("Monthly Returns in PineScript Strategies", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 25, calc_on_every_tick = true, commission_type = strategy.commission.percent, commission_value = 0.1)

// Inputs 
leftBars  = input(2)
rightBars = input(1)
prec      = input(2, title = "Return Precision")

// Pivot Points 
swh = pivothigh(leftBars, rightBars)
swl = pivotlow(leftBars, rightBars)

hprice = 0.0
hprice := not na(swh) ? swh : hprice[1]

lprice = 0.0
lprice := not na(swl) ? swl : lprice[1]

le = false
le := not na(swh) ? true : (le[1] and high > hprice ? false : le[1])

se = false
se := not na(swl) ? true : (se[1] and low < lprice ? false : se[1])

if (le)
	strategy.entry("PivRevLE", strategy.long, comment="PivRevLE", stop=hprice + syminfo.mintick)

if (se)
	strategy.entry("PivRevSE", strategy.short, comment="PivRevSE", stop=lprice - syminfo.mintick)

plot(hprice, color = color.green, linewidth = 2)
plot(lprice, color = color.red,   linewidth = 2)

///////////////////
// MONTHLY TABLE //

new_month = month(time) != month(time[1])
new_year  = year(time)  != year(time[1])

eq = strategy.equity

bar_pnl = eq / eq[1] - 1

cur_month_pnl = 0.0
cur_year_pnl  = 0.0

// Current Monthly P&L
cur_month_pnl := new_month ? 0.0 : 
                 (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1 

// Current Yearly P&L
cur_year_pnl := new_year ? 0.0 : 
                 (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1  

// Arrays to store Yearly and Monthly P&Ls
var month_pnl  = array.new_float(0)
var month_time = array.new_int(0)

var year_pnl  = array.new_float(0)
var year_time = array.new_int(0)

if (not na(cur_month_pnl[1]) and (new_month or barstate.islast))
    array.push(month_pnl , cur_month_pnl[1])
    array.push(month_time, time[1])

if (not na(cur_year_pnl[1]) and (new_year or barstate.islast))
    array.push(year_pnl , cur_year_pnl[1])
    array.push(year_time, time[1])

// Monthly P&L Table    
var monthly_table = table(na)

if (barstate.islast)
    monthly_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)

    table.cell(monthly_table, 0,  0, "",     bgcolor = #cccccc)
    table.cell(monthly_table, 1,  0, "Jan",  bgcolor = #cccccc)
    table.cell(monthly_table, 2,  0, "Feb",  bgcolor = #cccccc)
    table.cell(monthly_table, 3,  0, "Mar",  bgcolor = #cccccc)
    table.cell(monthly_table, 4,  0, "Apr",  bgcolor = #cccccc)
    table.cell(monthly_table, 5,  0, "May",  bgcolor = #cccccc)
    table.cell(monthly_table, 6,  0, "Jun",  bgcolor = #cccccc)
    table.cell(monthly_table, 7,  0, "Jul",  bgcolor = #cccccc)
    table.cell(monthly_table, 8,  0, "Aug",  bgcolor = #cccccc)
    table.cell(monthly_table, 9,  0, "Sep",  bgcolor = #cccccc)
    table.cell(monthly_table, 10, 0, "Oct",  bgcolor = #cccccc)
    table.cell(monthly_table, 11, 0, "Nov",  bgcolor = #cccccc)
    table.cell(monthly_table, 12, 0, "Dec",  bgcolor = #cccccc)
    table.cell(monthly_table, 13, 0, "Year", bgcolor = #999999)


    for yi = 0 to array.size(year_pnl) - 1
        table.cell(monthly_table, 0,  yi + 1, tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
        
        y_color = array.get(year_pnl, yi) > 0 ? color.new(color.green, transp = 50) : color.new(color.red, transp = 50)
        table.cell(monthly_table, 13, yi + 1, tostring(round(array.get(year_pnl, yi) * 100, prec)), bgcolor = y_color)
        
    for mi = 0 to array.size(month_time) - 1
        m_row   = year(array.get(month_time, mi))  - year(array.get(year_time, 0)) + 1
        m_col   = month(array.get(month_time, mi)) 
        m_color = array.get(month_pnl, mi) > 0 ? color.new(color.green, transp = 70) : color.new(color.red, transp = 70)
        
        table.cell(monthly_table, m_col, m_row, tostring(round(array.get(month_pnl, mi) * 100, prec)), bgcolor = m_color)