Chiến lược này xác định hướng xu hướng hiện tại bằng cách tính toán trung bình động của các giai đoạn khác nhau và tạo ra các tín hiệu giao dịch kết hợp với chỉ số RSI. Khi trung bình động thời gian ngắn vượt qua mức trung bình động thời gian dài, xu hướng được xem xét và tạo ra tín hiệu mua. Khi trung bình động thời gian ngắn vượt qua mức trung bình động thời gian dài, xu hướng được coi là đảo ngược và một tín hiệu bán được tạo ra. Chỉ số RSI được sử dụng để tránh các tín hiệu sai do biến động giá nhỏ.
Tính toán trung bình di chuyển đơn giản 10, 20, 50, 100 và 200 ngày.
Tính toán giá trị RSI 14 ngày.
Khi SMA 10 ngày vượt trên SMA 50 ngày, và RSI lớn hơn 30, và SMA 20 ngày lớn hơn hoặc bằng SMA 100 ngày hoặc SMA 50 ngày lớn hơn hoặc bằng SMA 100 ngày, mua.
Thiết lập giá dừng lỗ với giá đầu vào nhân với (1 - tỷ lệ phần trăm dừng lỗ).
Bán khi:
Chiến lược này đánh giá xu hướng thị trường bằng cách sử dụng đường trung bình động và thiết lập stop loss để kiểm soát rủi ro. RSI lọc ra các đột phá sai. Nó mua khi SMA ngắn hạn vượt qua SMA dài hạn, cho thấy xu hướng tăng, và thiết lập một đường stop loss để kiểm soát rủi ro trong thời gian nắm giữ. Nó bán khi có tín hiệu đảo ngược xu hướng hoặc giá stop loss được kích hoạt.
Tối ưu hóa có thể được thực hiện bằng cách điều chỉnh thời gian trung bình động, mức dừng lỗ vv. Cũng xem xét kết hợp với các chỉ số khác để tăng độ chính xác.
Chiến lược có logic rõ ràng nói chung, sử dụng đường trung bình động để xác định xu hướng và thiết lập stop loss để kiểm soát rủi ro. Đây là một chiến lược theo dõi xu hướng điển hình. Những cải tiến hơn nữa có thể đạt được thông qua điều chỉnh tham số và thêm các chỉ số khác.
/*backtest start: 2022-09-30 00:00:00 end: 2023-10-06 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("MA_Script", overlay=true) // STEP 1: // Configure trail stop level with input options (optional) longTrailPerc=input(title="Trail Long Loss (%)", type=input.float, minval=0.0, step=0.05, defval=0.1) // Configure backtest start date with inputs startDate=input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31) startMonth=input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12) startYear=input(title="Start Year", type=input.integer, defval=2020, minval=1800, maxval=2100) // See if this bar's time happened on/after start date afterStartDate=(time >=timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) // Calculate Relative Strength Index rsiValue=rsi(close, 14) // Calculate moving averages MA10_Val =sma(close, 10) //plot(MA10_Val, color=color.yellow, linewidth=1) MA20_Val =sma(close, 20) plot(MA20_Val, color=color.green, linewidth=1) MA50_Val =sma(close, 50) plot(MA50_Val, color=color.red, linewidth=1) MA100_Val =sma(close, 100) plot(MA100_Val, color=color.blue, linewidth=1) MA200_Val =sma(close, 200) plot(MA200_Val, color=color.purple, linewidth=1) // Calculate candlestick C_BodyHi = max(close, open) C_BodyLo = min(close, open) C_Body = C_BodyHi - C_BodyLo C_UpShadow = high - C_BodyHi C_DnShadow = C_BodyLo - low // STEP 2: // Calculate entry trading conditions buyCondition_1=crossover(MA10_Val, MA50_Val) and (rsiValue > 30) and ((MA20_Val >= MA100_Val) or (MA50_Val >= MA100_Val)) avg_price = (close + open)/2 // First Entry if (afterStartDate) strategy.entry(id="Entry_Trade_1", long=true, limit=avg_price, when=buyCondition_1) plotchar(afterStartDate and crossover(MA10_Val, MA50_Val), textcolor = color.blue, text = 'MA\n') // Determine trail stop loss prices longStopPrice=0.0 longStopPrice :=if (strategy.position_size > 0) stopValue=C_BodyHi * (1 - longTrailPerc) max(stopValue, longStopPrice[1]) else 0 plot(longStopPrice, color=color.orange, linewidth=1) bought_1=strategy.position_size[0] > strategy.position_size[1] entry_Point_1=valuewhen(bought_1, avg_price, 0) // STEP 3: // Calculate exit trading conditions sellCondition_2=crossunder(MA10_Val, MA50_Val) and (close < MA20_Val) sellCondition_3_temp=valuewhen((C_BodyHi >= entry_Point_1*1.2), 1, 0) sellCondition_1=(entry_Point_1*0.95 > close) and (sellCondition_3_temp != 1) sellCondition_3=(sellCondition_3_temp == 1) and (strategy.position_size > 0) and close <= longStopPrice plotchar((sellCondition_3 == 1) and (strategy.position_size > 0) and close <= longStopPrice, textcolor = color.red, text = 'TS\n', show_last = 11) plotchar(crossunder(MA10_Val, MA50_Val), textcolor = color.red, text = 'MA\n') id_val = "" stop_val = close condition = false if sellCondition_1 id_val := "Exit By Stop Loss At 7%" stop_val := entry_Point_1*0.93 condition := true else if sellCondition_2 id_val := "Exit By Take Profit based on MA" stop_val := close condition := true else if sellCondition_3 id_val := "Exit By Trailing Stop" stop_val := longStopPrice condition := true // Submit exit orders for trail stop loss price if (strategy.position_size > 0) //strategy.exit(id="Exit By Stop Loss At 7%", from_entry="Entry_Trade_1", stop=entry_Point_1*0.93, when=sellCondition_1) //strategy.exit(id="Exit By Take Profit based on MA", from_entry="Entry_Trade_1", stop=close, when=sellCondition_2) strategy.exit(id=id_val, from_entry="Entry_Trade_1", stop=stop_val, when=condition)