
Chiến lược này được lợi nhuận bằng cách xác định các cổ phiếu tăng nhanh và đặt nhiều hơn khi phá vỡ mức cao mới, bằng cách sử dụng một phần trăm dừng cố định. Chiến lược này thuộc chiến lược theo dõi xu hướng.
Chiến lược này dựa trên hai chỉ số:
RSI nhanh: Xác định động lực giá bằng cách tính toán sự thay đổi giảm sút của 3 đường K gần đây nhất. Khi RSI nhanh thấp hơn 10, cổ phiếu được coi là đang ở trạng thái vượt mức giảm.
Bộ lọc chủ thể: tính trung bình kích thước của thực thể trong 20 đường K gần nhất, được coi là đột phá hiệu quả khi thực thể giá lớn hơn 2,5 lần so với thực thể trung bình.
Khi RSI nhanh thấp hơn 10 và bộ lọc thực tế có hiệu lực, hãy mở thêm vị trí. Sau đó thiết lập điểm dừng cố định 20% khi giá vượt quá giá mở vị trí*(1 + tỷ lệ dừng) thì dừng.
Điểm mạnh của chiến lược này là có thể nắm bắt cơ hội phá vỡ giai đoạn bắt đầu của xu hướng, thông qua RSI nhanh để xác định khu vực đáy, lọc thực tế để tránh phá vỡ giả.
Chiến lược này có những ưu điểm sau:
Sử dụng RSI nhanh để xác định vùng vượt ngưỡng dưới, bạn có thể cải thiện độ chính xác khi vào.
Cơ chế lọc chủ thể có thể ngăn chặn đột phá giả do chấn động.
Các nhà đầu tư có thể sử dụng phương pháp này để tạo ra lợi nhuận và nắm bắt được xu hướng.
Lập luận của chiến lược đơn giản, rõ ràng và dễ hiểu.
Cấu trúc mã của nó rất thanh lịch, có thể mở rộng và dễ dàng để tối ưu hóa chiến lược.
Chiến lược này có lợi nhuận tích cực ổn định và tỷ lệ chiến thắng cao trong giai đoạn đánh giá.
Chiến lược này cũng có một số rủi ro cần lưu ý:
Chiến lược này không có cơ chế dừng lỗ, có nguy cơ gia tăng tổn thất đơn lẻ.
Cài đặt điểm dừng cố định không đúng có thể dẫn đến dừng quá sớm hoặc dừng quá sâu.
Trong một tình huống bất ổn, một khoản lỗ nhỏ liên tục có thể xảy ra.
Không tính chi phí tài chính tài chính, thu nhập trong thời gian thực sẽ giảm.
Các tham số chiến lược không được tối ưu hóa, các giống khác nhau cần điều chỉnh tham số.
Chiến lược này có thể được tối ưu hóa bằng cách:
Thêm hệ thống ngăn chặn thiệt hại để kiểm soát tổn thất đơn lẻ
Tối ưu hóa điểm dừng để có thể theo dõi xu hướng động.
Tối ưu hóa các chỉ số đánh giá đột phá, tăng độ chính xác của nhập học.
Thêm mô-đun quản lý vị trí, tối ưu hóa vị trí.
Thêm mô-đun tối ưu hóa tham số giống, tự động tối ưu hóa tham số của các giống khác nhau.
Tăng các điều kiện lọc để tránh thua lỗ khi thị trường quá chấn động.
Xem xét thêm mô-đun quản lý chi phí trung bình cho vị trí.
Chiến lược này nói chung là một chiến lược theo dõi xu hướng rất đơn giản và thanh lịch. Nó sử dụng RSI nhanh để đánh giá quá giảm, lọc thực thể để xác định đột phá hiệu quả và lấy điểm dừng cố định để thu được lợi nhuận ổn định. Mặc dù có một số không gian có thể tối ưu hóa, chiến lược này đáp ứng nhanh chóng, phù hợp để nắm bắt các tình huống thay đổi nhanh chóng, là một chiến lược giao dịch rất thực tế.
/*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")