
Chiến lược này dựa trên chỉ số tương đối mạnh (RSI) để xác định các tín hiệu mua và bán bằng cách đánh giá xem giá trị của chỉ số RSI có vượt quá mức giảm hoặc giảm dự kiến hay không. Đồng thời, chiến lược này cũng đặt giới hạn thời gian dừng lỗ và giữ vị trí để kiểm soát rủi ro.
Chiến lược này sử dụng các chỉ số RSI để nắm bắt các tín hiệu quá mua và quá bán của thị trường, đồng thời giới thiệu các giới hạn thời gian dừng lỗ và giữ vị trí để kiểm soát rủi ro. Logic của chiến lược đơn giản, dễ thực hiện và tối ưu hóa. Tuy nhiên, hiệu suất của chiến lược có thể bị ảnh hưởng bởi biến động thị trường và cài đặt tham số, do đó cần kết hợp với các phương pháp phân tích khác và các phương tiện quản lý rủi ro để tăng cường sự ổn định và lợi nhuận của chiến lược.
/*backtest
start: 2024-05-01 00:00:00
end: 2024-05-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Simple RSI Strategy", overlay=true, initial_capital=20, commission_value=0.1, commission_type=strategy.commission.percent)
// Define the hardcoded date (Year, Month, Day, Hour, Minute)
var hardcodedYear = 2024
var hardcodedMonth = 6
var hardcodedDay = 10
// Convert the hardcoded date to a timestamp
var start_date = timestamp(hardcodedYear, hardcodedMonth, hardcodedDay)
// settings
order_size_usdt = input.float(20, title="Order Size (USDT)")
rsiLength = input.int(9, title="RSI Length")
rsiBuyThreshold = input.int(30, title="RSI Buy Threshold")
rsiSellThreshold = input.int(70, title="RSI Sell Threshold")
rsibuystrat = input.int(1, title="buy strat 1=achieved,2=recross")
rsisellstrat = input.int(1, title="sell strat 1=achieved,2=recross")
stoploss = input.int(1, title="Stop loss percent")
max_duration = input(24, title="Max Position Duration (hours)")*60
// emaPeriod = input.int(50, title="EMA Period")
// smaPeriod = input.int(200, title="SMA Period")
rsi = ta.rsi(close, rsiLength)
// ma_rsi = ta.sma(rsi, rsiLength)
// ema = ta.ema(close,emaPeriod)
// sma = ta.sma(close,smaPeriod)
// plot(sma, color=color.red, title="exp Moving Average")
// plot(smal, color=color.blue, title="Simple Moving Average")
longCondition = ((ta.crossunder(rsi, rsiBuyThreshold) and rsibuystrat==1) or (ta.crossover(rsi, rsiBuyThreshold) and rsibuystrat==2) ) and strategy.position_size == 0
shortCondition = ( (ta.crossover(rsi, rsiSellThreshold) and rsisellstrat==1) or (ta.crossunder(rsi, rsiSellThreshold) and rsisellstrat==2) ) and strategy.position_size > 0
// Execute Buy and Sell orders
if (longCondition)
positionSize = order_size_usdt / close
strategy.entry("Long", strategy.long,qty=positionSize)
if (stoploss>0)
stopLossPrice = close * (1 - stoploss/100 )
strategy.exit("Stop Loss", from_entry="Long", stop=stopLossPrice)
if (shortCondition )//or stopCondition)
strategy.close("Long")
//add condition open time
if (strategy.position_size > 0 and max_duration >0)
var float entry_time = na
if (strategy.opentrades > 0)
entry_time := nz(strategy.opentrades.entry_time(0), na)
else
entry_time := na
current_time = time
var float duration_minutes = -1
if (not na(entry_time))
duration_minutes := (current_time - entry_time) / 60000
// Close positions after a certain duration (e.g., 60 minutes)
// if ( duration_minutes > max_duration and close>=strategy.opentrades.entry_price(0))
if ( duration_minutes > max_duration )
label.new(bar_index, high, text="Duration: " + str.tostring(duration_minutes/60) + " hrs", color=color.blue, textcolor=color.white, style=label.style_label_down, size=size.small)
strategy.close("Long")
// Plot Buy and Sell signals
plotshape(series=longCondition, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="BUY")
plotshape(series=shortCondition, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="SELL")
//plotshape(series=stopCondition, title="stop Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="SELL")
// Plot RSI
// hline(rsiBuyThreshold, "RSI Buy Threshold", color=color.green)
// hline(rsiSellThreshold, "RSI Sell Threshold", color=color.red)