
Chiến lược này sử dụng hệ thống hai đường trung bình để tìm kiếm cơ hội đột phá tiềm năng trong một cổ phiếu hoặc tiền kỹ thuật số cụ thể. Nguyên tắc cơ bản của nó là mua cổ phiếu hoặc tiền kỹ thuật số khi đường trung bình ngắn hạn phục hồi dưới đường trung bình dài hạn.
Chiến lược này sử dụng trung bình di chuyển đơn giản ((SMA) của hai chu kỳ khác nhau làm tín hiệu giao dịch. Chu kỳ SMA đầu tiên dài hơn, đại diện cho hướng xu hướng tổng thể. Chu kỳ SMA thứ hai ngắn hơn, được sử dụng để bắt biến động giá trong thời gian ngắn.
Khi SMA ngắn từ phía dưới đeo SMA dài, đại diện cho giá trong xu hướng tăng tổng thể, do đó chiến lược mở vị trí nhiều đầu. Khi giá giảm lại kiểm tra SMA dài, báo hiệu kết thúc pullback ngắn hạn, khi chiến lược sẽ xem xét dừng lỗ hoặc lợi nhuận đóng cửa vị trí.
Ngoài ra, chiến lược cũng đặt ra các điều kiện bán quá và mua quá để tránh giao dịch trong các trường hợp cực đoan. Chỉ khi đáp ứng điều kiện cân bằng chéo và định giá hợp lý đồng thời, bạn sẽ mở vị trí.
Chiến lược này có thể được tối ưu hóa hơn nữa:
Chiến lược này tích hợp các lợi thế của theo dõi xu hướng và điều chỉnh giao dịch, sử dụng hệ thống hai đường thẳng để đánh giá sự xuất hiện của cơ hội. Đồng thời, xây dựng một số điều kiện mua quá mức, bán quá mức, tránh mở vị trí không cần thiết. Đây là một chiến lược giao dịch định lượng rất thực tế, đáng để nghiên cứu và tối ưu hóa sâu hơn.
/*backtest
start: 2023-02-20 00:00:00
end: 2024-02-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// @version=5
strategy("Profitable Pullback Trading Strategy", overlay=true,initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// Inputs
ma_length1 = input.int(280,'MA length 1', step = 10,group = 'Moving Avg. Parameters', inline = 'MA')
ma_length2 = input.int(13,'MA length 2', step = 1,group = 'Moving Avg. Parameters', inline = 'MA')
sl = input.float(title="Stop Loss (%)", defval=0.07, step=0.1, group="Moving Avg. Parameters")
too_deep = input.float(title="Too Deep (%)", defval=0.27, step=0.01, group="Too Deep and Thin conditions", inline = 'Too')
too_thin = input.float(title="Too Thin (%)", defval=0.03, step=0.01, group="Too Deep and Thin conditions", inline = 'Too')
// Calculations
ma1 = ta.sma(close,ma_length1)
ma2 = ta.sma(close,ma_length2)
too_deep2 = (ma2/ma1-1) < too_deep
too_thin2 = (ma2/ma1-1) > too_thin
// Entry and close condtions
var float buy_price = 0
buy_condition = (close > ma1) and (close < ma2) and strategy.position_size == 0 and too_deep2 and too_thin2
close_condition1 = (close > ma2) and strategy.position_size > 0 and (close < low[1])
stop_distance = strategy.position_size > 0 ? ((buy_price - close) / close) : na
close_condition2 = strategy.position_size > 0 and stop_distance > sl
stop_price = strategy.position_size > 0 ? buy_price - (buy_price * sl) : na
// Entry and close orders
if buy_condition
strategy.entry('Long',strategy.long)
if buy_condition[1]
buy_price := open
if close_condition1 or close_condition2
strategy.close('Long',comment="Exit" + (close_condition2 ? "SL=true" : ""))
buy_price := na
plot(ma1,color = color.blue)
plot(ma2,color = color.orange)