
Chiến lược này sử dụng hệ thống đường trung bình để đánh giá hướng xu hướng hiện tại, theo hướng xu hướng làm nhiều thấu trừ. Khi đường trung bình tăng lên, đánh giá là niềm tin giảm giá cao, làm nhiều; khi đường trung bình giảm xuống, đánh giá là niềm tin giảm giá cao, thấu trừ. Chiến lược này chủ yếu thông qua hệ thống đường trung bình để đánh giá hướng đi của thị trường, thuộc loại chiến lược theo xu hướng.
Tính trung bình chuyển động có trọng lượng của một chu kỳ nhất định (chỉ mặc định là 400 chu kỳ) vwma như chỉ số đường trung bình.
Xác định xem đường trung bình vwma có tăng hay không, nếu tăng, hãy thiết lập xem nhiều tín hiệu uptrend; nếu giảm, hãy thiết lập xem tín hiệu downtrend.
Khi uptrend là thực, làm nhiều hơn; khi downtrend là thực, làm trống vị trí bằng phẳng.
Tính lãi suất chiến lược cho mỗi dòng K là bar_pnl và lãi suất mua giữ là bar_bh.
Tính theo các điểm cắt hàng quý và hàng năm, tính lợi nhuận chiến lược hàng quý và hàng năm là quarter_pnl và year_pnl và tương ứng với lợi nhuận mua giữ hàng quý và hàng năm.
Bảng này hiển thị lợi nhuận chiến lược và lợi nhuận mua giữ cho mỗi quý trong năm.
Chiến lược này chủ yếu dựa vào sự cân bằng để xác định xu hướng của thị trường và có những ưu điểm sau:
Điều hành đơn giản, thông qua chỉ số đường trung bình để đánh giá xu hướng thị trường, dễ hiểu và nắm bắt.
Khả năng kiểm soát rút lui mạnh mẽ, hoạt động theo xu hướng, có thể kiểm soát hiệu quả tổn thất của thị trường không theo xu hướng.
Các tham số có thể cấu hình ít hơn, chủ yếu điều chỉnh chu kỳ trung bình, dễ kiểm tra và tối ưu hóa.
Các nhà nghiên cứu cho rằng việc sử dụng biểu mẫu để hiển thị thu nhập là một cách dễ dàng.
Thêm thu nhập mua và giữ vào bảng thu nhập để so sánh, có thể xác định thu nhập gia tăng chiến lược.
Có thể thiết lập vị trí bảng một cách linh hoạt để kết hợp với các chính sách khác.
Chiến lược này cũng có một số rủi ro:
Rủi ro thị trường số lượng lớn, trong thị trường bò kéo dài, lợi nhuận có thể thấp hơn so với chiến lược mua giữ. Bạn có thể điều chỉnh chu kỳ đường trung bình để tối ưu hóa.
Rủi ro của whipsaw là cao hơn trong tình huống biến động. Bạn có thể xem xét thêm các điều kiện lọc, chẳng hạn như điểm cao trước khi phá vỡ, để giảm các giao dịch lặp lại.
Hệ thống đường trung bình không phù hợp với đường cong và có thể bỏ lỡ điểm chuyển hướng. Bạn có thể thử nghiệm các loại chỉ số đường trung bình khác nhau.
Không tính đến cơ chế dừng lỗ, có nguy cơ rút lui lớn. Bạn có thể thiết lập dừng lỗ động hoặc xem xét giảm vị trí.
Đối với việc tối ưu hóa bảng, bạn có thể xem xét thêm các chỉ số rủi ro như tỷ lệ sắc nét, rút tối đa.
Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:
Tối ưu hóa tham số đường trung bình, điều chỉnh chu kỳ đường trung bình để phù hợp với môi trường thị trường khác nhau.
Thêm các điều kiện lọc, chẳng hạn như điểm cao trước khi phá vỡ, để giảm whipsaw.
Thử các loại đường trung bình khác nhau, như đường trung bình chuyển động trọng số, đường trung bình chuyển động hai chỉ số, v.v.
Tham gia cơ chế dừng lỗ, có thể thiết lập dừng động hoặc xem xét giảm vị trí.
Nâng cao nội dung bảng, thêm chỉ số sharpe ratio, rút tối đa và các chỉ số khác.
Kết hợp với các chỉ số khác như MACD, Bollinger Bands và các chỉ số khác để đánh giá xu hướng.
Tối ưu hóa quản lý vị trí, điều chỉnh vị trí theo tình hình thị trường.
Kiểm tra hiệu quả hoạt động của các tiêu chuẩn khác nhau để tìm kiếm phạm vi ứng dụng tốt nhất.
Chiến lược giao dịch theo đường thẳng này nói chung là đơn giản, trực tiếp, hoạt động theo xu hướng bằng cách đánh giá xu hướng bằng đường thẳng, có khả năng kiểm soát lùi mạnh mẽ, phù hợp với các nhà giao dịch theo xu hướng. Có rất nhiều không gian để tối ưu hóa, có thể tối ưu hóa từ hệ thống đường thẳng, cơ chế dừng lỗ, quản lý vị trí, để chiến lược phù hợp hơn với môi trường thị trường phức tạp. Thiết kế bảng hiển thị chiến lược so sánh với thu nhập mua bán, hiển thị trực quan giá trị gia tăng 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"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Dannnnnnny
//@version=4
strategy(title="Quarterly Returns in Strategies vs Buy & Hold", initial_capital= 1000, overlay=true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.1)
maLength= input(400)
wma= vwma(hl2,maLength)
uptrend= rising(wma, 5)
downtrend= falling(wma,5)
plot(wma)
if uptrend
strategy.entry("Buy", strategy.long)
else
strategy.close("Buy")//
///////////////////
// QUARTERLY TABLE //
enableQuarterlyTable = input(title="Enable Quarterly Return table", type=input.bool, defval=false)
enableCompareWithMarket = input(title="Compare with Market Benchmark", type=input.bool, defval=false)
table_position = input(title="Table Position", type=input.string, defval='bottom_right', options=['bottom_right','bottom_left','top_right', 'top_left'])
precision = 2
new_quarter = ceil(month(time)/3) != ceil(month(time[1])/3)
new_year = year(time) != year(time[1])
eq = strategy.equity
bar_pnl = eq / eq[1] - 1
bar_bh = (close-close[1])/close[1]
cur_quarter_pnl = 0.0
cur_year_pnl = 0.0
cur_quarter_bh = 0.0
cur_year_bh = 0.0
// Current Quarterly P&L
cur_quarter_pnl := new_quarter ? 0.0 :
(1 + cur_quarter_pnl[1]) * (1 + bar_pnl) - 1
cur_quarter_bh := new_quarter ? 0.0 :
(1 + cur_quarter_bh[1]) * (1 + bar_bh) - 1
// Current Yearly P&L
cur_year_pnl := new_year ? 0.0 :
(1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1
cur_year_bh := new_year ? 0.0 :
(1 + cur_year_bh[1]) * (1 + bar_bh) - 1
// Arrays to store Yearly and Quarterly P&Ls
var quarter_pnl = array.new_float(0)
var quarter_time = array.new_int(0)
var quarter_bh = array.new_float(0)
var year_pnl = array.new_float(0)
var year_time = array.new_int(0)
var year_bh = array.new_float(0)
end_time = false
end_time:= time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory
if (not na(cur_quarter_pnl[1]) and (new_quarter or end_time))
if (end_time[1])
array.pop(quarter_pnl)
array.pop(quarter_time)
array.push(quarter_pnl , cur_quarter_pnl[1])
array.push(quarter_time, time[1])
array.push(quarter_bh , cur_quarter_bh[1])
if (not na(cur_year_pnl[1]) and (new_year or end_time))
if (end_time[1])
array.pop(year_pnl)
array.pop(year_time)
array.push(year_pnl , cur_year_pnl[1])
array.push(year_time, time[1])
array.push(year_bh , cur_year_bh[1])
// Quarterly P&L Table
var quarterly_table = table(na)
getCellColor(pnl, bh) =>
if pnl > 0
if bh < 0 or pnl > 2 * bh
color.new(color.green, transp = 20)
else if pnl > bh
color.new(color.green, transp = 50)
else
color.new(color.green, transp = 80)
else
if bh > 0 or pnl < 2 * bh
color.new(color.red, transp = 20)
else if pnl < bh
color.new(color.red, transp = 50)
else
color.new(color.red, transp = 80)
if (end_time and enableQuarterlyTable)
quarterly_table := table.new(table_position, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)
table.cell(quarterly_table, 0, 0, "", bgcolor = #cccccc)
table.cell(quarterly_table, 1, 0, "Q1", bgcolor = #cccccc)
table.cell(quarterly_table, 2, 0, "Q2", bgcolor = #cccccc)
table.cell(quarterly_table, 3, 0, "Q3", bgcolor = #cccccc)
table.cell(quarterly_table, 4, 0, "Q4", bgcolor = #cccccc)
table.cell(quarterly_table, 5, 0, "Year", bgcolor = #999999)
for yi = 0 to array.size(year_pnl) - 1
table.cell(quarterly_table, 0, yi + 1, tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
y_color = getCellColor(array.get(year_pnl, yi), array.get(year_bh, yi))
table.cell(quarterly_table, 5, yi + 1, enableCompareWithMarket ? tostring(round(array.get(year_pnl, yi) * 100, precision)) + " (" + tostring(round(array.get(year_bh, yi) * 100, precision)) + ")" : tostring(round(array.get(year_pnl, yi) * 100, precision)), bgcolor = y_color, text_color=#bfbfbf)
for mi = 0 to array.size(quarter_time) - 1
m_row = year(array.get(quarter_time, mi)) - year(array.get(year_time, 0)) + 1
m_col = ceil(month(array.get(quarter_time, mi)) / 3)
m_color = getCellColor(array.get(quarter_pnl, mi), array.get(quarter_bh, mi))
table.cell(quarterly_table, m_col, m_row, enableCompareWithMarket ? tostring(round(array.get(quarter_pnl, mi) * 100, precision)) + " (" + tostring(round(array.get(quarter_bh, mi) * 100,precision)) +")" : tostring(round(array.get(quarter_pnl, mi) * 100, precision)), bgcolor = m_color, text_color=#bfbfbf)