
Đây là một chiến lược giao dịch trong ngày dựa trên nhiều chỉ số kỹ thuật, chủ yếu sử dụng các tín hiệu đa dạng như kênh EMA, RSI overbought and oversold, xác nhận xu hướng MACD để giao dịch. Chiến lược này hoạt động trên chu kỳ 3 phút, nắm bắt xu hướng thị trường thông qua đường quỹ đạo EMA cao và thấp kết hợp xác nhận chéo của RSI và MACD, và thiết lập một lệnh dừng lỗ động dựa trên ATR, và thời gian đóng cửa cố định.
Chiến lược sử dụng 20 chu kỳ EMA để tính toán giá cao nhất và giá thấp nhất để tạo ra một kênh, khi giá vượt qua kênh và đáp ứng các điều kiện sau:
Chiến lược này xây dựng một hệ thống giao dịch tương đối hoàn chỉnh bằng cách sử dụng kết hợp nhiều chỉ số kỹ thuật. Ưu điểm của chiến lược là kiểm soát rủi ro khá hoàn hảo, bao gồm các cơ chế như dừng động, rủi ro cố định và thanh toán. Mặc dù có một số rủi ro chậm trễ, nhưng có thể nâng cao hơn nữa hiệu suất của chiến lược bằng cách tối ưu hóa tham số và tăng các chỉ số phụ trợ.
/*backtest
start: 2024-02-21 00:00:00
end: 2024-09-09 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy("Intraday 3min EMA HL Strategy v6",
overlay=true,
margin_long=100,
margin_short=100,
initial_capital=100000,
default_qty_type=strategy.percent_of_equity,
default_qty_value=100,
commission_type=strategy.commission.percent,
commission_value=0.05,
calc_on_every_tick=false,
process_orders_on_close=true,
pyramiding=0)
// Input Parameters
i_emaLength = input.int(20, "EMA Length", minval=5, group="Strategy Parameters")
i_rsiLength = input.int(14, "RSI Length", minval=5, group="Strategy Parameters")
i_atrLength = input.int(14, "ATR Length", minval=5, group="Risk Management")
i_rrRatio = input.float(2.5, "Risk:Reward Ratio", minval=1, maxval=10, step=0.5, group="Risk Management")
i_riskPercent = input.float(1, "Risk % per Trade", minval=0.1, maxval=5, step=0.1, group="Risk Management")
// Time Exit Parameters (IST)
i_exitHour = input.int(15, "Exit Hour (IST)", minval=0, maxval=23, group="Session Rules")
i_exitMinute = input.int(0, "Exit Minute (IST)", minval=0, maxval=59, group="Session Rules")
// Indicator Calculations
emaHigh = ta.ema(high, i_emaLength)
emaLow = ta.ema(low, i_emaLength)
rsi = ta.rsi(close, i_rsiLength)
atr = ta.atr(i_atrLength)
fastMA = ta.ema(close, 12)
slowMA = ta.ema(close, 26)
macdLine = fastMA - slowMA
signalLine = ta.ema(macdLine, 9)
// Time Calculations (UTC to IST Conversion)
istHour = (hour(time) + 5) % 24 // UTC+5
istMinute = minute(time) + 30 // 30 minute offset
istHour += istMinute >= 60 ? 1 : 0
istMinute := istMinute % 60
// Exit Condition
timeExit = istHour > i_exitHour or (istHour == i_exitHour and istMinute >= i_exitMinute)
// Entry Conditions (Multi-line formatting fix)
longCondition = close > emaHigh and
rsi > 50 and
rsi < 70 and
ta.crossover(macdLine, signalLine)
shortCondition = close < emaLow and
rsi < 50 and
rsi > 30 and
ta.crossunder(macdLine, signalLine)
// Risk Calculations
var float entryPrice = na
var float stopLoss = na
var float takeProfit = na
var float posSize = na
// Strategy Logic
if longCondition and not timeExit and strategy.position_size == 0
entryPrice := close
stopLoss := math.min(low, entryPrice - atr)
takeProfit := entryPrice + (entryPrice - stopLoss) * i_rrRatio
posSize := strategy.equity * i_riskPercent / 100 / (entryPrice - stopLoss)
strategy.entry("Long", strategy.long, qty=posSize)
strategy.exit("Long Exit", "Long", stop=stopLoss, limit=takeProfit)
if shortCondition and not timeExit and strategy.position_size == 0
entryPrice := close
stopLoss := math.max(high, entryPrice + atr)
takeProfit := entryPrice - (stopLoss - entryPrice) * i_rrRatio
posSize := strategy.equity * i_riskPercent / 100 / (stopLoss - entryPrice)
strategy.entry("Short", strategy.short, qty=posSize)
strategy.exit("Short Exit", "Short", stop=stopLoss, limit=takeProfit)
// Force Close at Session End
if timeExit
strategy.close_all()
// Visual Components
plot(emaHigh, "EMA High", color=color.rgb(0, 128, 0), linewidth=2)
plot(emaLow, "EMA Low", color=color.rgb(255, 0, 0), linewidth=2)
plotshape(longCondition, "Long Signal", shape.triangleup,
location.belowbar, color=color.green, size=size.small)
plotshape(shortCondition, "Short Signal", shape.triangledown,
location.abovebar, color=color.red, size=size.small)
// Debugging Table
var table infoTable = table.new(position.top_right, 3, 3)
if barstate.islast
table.cell(infoTable, 0, 0, "EMA High: " + str.tostring(emaHigh, "#.00"))
table.cell(infoTable, 0, 1, "EMA Low: " + str.tostring(emaLow, "#.00"))
table.cell(infoTable, 0, 2, "Current RSI: " + str.tostring(rsi, "#.00"))