Chiến lược này là một hệ thống giao dịch toàn diện kết hợp nhiều chỉ số kỹ thuật với ICT (Kinh niệm giao dịch tổ chức). Nó tích hợp các chỉ số phân tích kỹ thuật truyền thống (RSI, Stochastic, MACD, EMA) với các khái niệm giao dịch ICT hiện đại (Khổng giá trị hợp lý, Phá vỡ cấu trúc, Phân tích thiên vị khung thời gian cao hơn) trên các khung thời gian khác nhau, thực hiện kiểm soát chính xác thị trường thông qua việc lọc phiên giao dịch nghiêm ngặt.
Chiến lược hoạt động dựa trên năm thành phần cốt lõi hoạt động phối hợp:
Chiến lược xây dựng một hệ thống giao dịch toàn diện bằng cách tích hợp phân tích kỹ thuật truyền thống với các khái niệm CNTT hiện đại. Sức mạnh của nó nằm trong xác nhận tín hiệu đa chiều và kiểm soát rủi ro nghiêm ngặt, trong khi phải đối mặt với những thách thức trong tối ưu hóa tham số và khả năng thích nghi thị trường. Thông qua tối ưu hóa và cải tiến liên tục, chiến lược cho thấy hứa hẹn trong việc duy trì hiệu suất ổn định trong các môi trường thị trường khác nhau.
/*backtest start: 2024-01-06 00:00:00 end: 2025-01-04 08:00:00 period: 2d basePeriod: 2d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // ----------------------------------------------------- // Multi-Signal Conservative Strategy (Pine Script v5) // + More ICT Concepts (HTF Bias, FVG, Killzone, BOS) // ----------------------------------------------------- // // Combines: // - RSI, Stochastic, MACD, 200 EMA (lower TF) // - Higher Timeframe (HTF) bias check via 200 EMA // - Kill Zone time filter // - Fair Value Gap (FVG) detection (simplified 3-candle approach) // - Break of Structure (BOS) using pivot highs/lows // - Only trade markers on chart (no extra indicator plots). // // Use on lower timeframes: 1m to 15m // Always backtest thoroughly and manage risk properly. // // ----------------------------------------------------- //@version=5 strategy(title="Multi-Signal + ICT Concepts (HTF/FVG/Killzone/BOS)", shorttitle="ICTStrategyExample",overlay=true, pyramiding=0, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100) // ----------------------------------------------------- // User Inputs // ----------------------------------------------------- /////////////// Lower TF Inputs /////////////// emaLength = input.int(200, "LTF EMA Length", group="Lower TF") rsiLength = input.int(14, "RSI Length", group="Lower TF") rsiUpper = input.int(60, "RSI Overbought Thresh", group="Lower TF", minval=50, maxval=80) rsiLower = input.int(40, "RSI Oversold Thresh", group="Lower TF", minval=20, maxval=50) stochLengthK = input.int(14, "Stoch K Length", group="Lower TF") stochLengthD = input.int(3, "Stoch D Smoothing", group="Lower TF") stochSmooth = input.int(3, "Stoch Smoothing", group="Lower TF") macdFast = input.int(12, "MACD Fast Length", group="Lower TF") macdSlow = input.int(26, "MACD Slow Length", group="Lower TF") macdSignal = input.int(9, "MACD Signal Length", group="Lower TF") /////////////// ICT Concepts Inputs /////////////// htfTimeframe = input.timeframe("60", "HTF for Bias (e.g. 60, 240)", group="ICT Concepts") htfEmaLen = input.int(200, "HTF EMA Length", group="ICT Concepts") sessionInput = input("0700-1000:1234567", "Kill Zone Window", group="ICT Concepts") fvgLookbackBars = input.int(2, "FVG Lookback Bars (3-candle check)", group="ICT Concepts", minval=1, maxval=10) /////////////// Risk Management /////////////// stopLossPerc = input.float(0.5, "Stop-Loss %", step=0.1, group="Risk") takeProfitPerc = input.float(1.0, "Take-Profit %", step=0.1, group="Risk") // ----------------------------------------------------- // 1) Higher Timeframe Bias // ----------------------------------------------------- // // We'll request the HTF close, then compute the HTF EMA on that data // to decide if it's bullish or bearish overall. htfClose = request.security(syminfo.tickerid, htfTimeframe, close) htfEma = request.security(syminfo.tickerid, htfTimeframe, ta.ema(close, htfEmaLen)) isBullHTF = htfClose > htfEma isBearHTF = htfClose < htfEma // ----------------------------------------------------- // 2) Kill Zone / Session Filter // ----------------------------------------------------- // // We'll only consider trades if the current bar is within // the user-defined session time (e.g., 07:00 to 10:00 local or exchange time). isInKillZone = time(timeframe.period, sessionInput) != 0 // ----------------------------------------------------- // 3) Fair Value Gap (FVG) Detection (Simplified) // // For a "Bullish FVG" among bars [2], [1], [0]: // high[2] < low[0] => there's a gap that bar [1] didn't fill // For a "Bearish FVG": // low[2] > high[0] => there's a gap that bar [1] didn't fill // // Real ICT usage might check partial fill, candle bodies vs wicks, etc. // This is just a minimal example for demonstration. fvgBarsAgo = fvgLookbackBars // default = 2 bullFVG = high[fvgBarsAgo] < low // e.g. high[2] < low[0] bearFVG = low[fvgBarsAgo] > high // e.g. low[2] > high[0] // ----------------------------------------------------- // 4) Break of Structure (BOS) // ----------------------------------------------------- // Using pivot detection from previous example: swingLen = 2 // pivot detection length (bars on each side) // Identify a pivot high at bar [1] swingHigh = high[1] > high[2] and high[1] > high[0] // Identify a pivot low at bar [1] swingLow = low[1] < low[2] and low[1] < low[0] // Track the most recent pivot high & low var float lastPivotHigh = na var float lastPivotLow = na if swingHigh lastPivotHigh := high[1] if swingLow lastPivotLow := low[1] bosUp = not na(lastPivotHigh) and (close > lastPivotHigh) bosDown = not na(lastPivotLow) and (close < lastPivotLow) // ----------------------------------------------------- // 5) Lower TF Indicator Calculations // ----------------------------------------------------- ema200 = ta.ema(close, emaLength) // 200 EMA on LTF rsiValue = ta.rsi(close, rsiLength) kValue = ta.stoch(high, low, close, stochLengthK) dValue = ta.sma(kValue, stochLengthD) stochSignal = ta.sma(dValue, stochSmooth) [macdLine, signalLine, histLine] = ta.macd(close, macdFast, macdSlow, macdSignal) // LTF trend filter isBullTrend = close > ema200 isBearTrend = close < ema200 // ----------------------------------------------------- // Combine All Conditions // ----------------------------------------------------- // // We'll require that all filters line up for a long or short: // - HTF bias // - kill zone // - bullish/bearish FVG // - BOS up/down // - RSI, Stoch, MACD alignment // - Price above/below LTF 200 EMA longCondition = isInKillZone // must be in session and isBullHTF // HTF bias bullish and bullFVG // bullish FVG and bosUp // BOS up and (rsiValue > rsiUpper) // RSI > threshold and (kValue > dValue) // stoch K above D and (macdLine > signalLine) // MACD bullish and isBullTrend // above LTF 200 EMA shortCondition = isInKillZone // must be in session and isBearHTF // HTF bias bearish and bearFVG // bearish FVG and bosDown // BOS down and (rsiValue < rsiLower) // RSI < threshold and (kValue < dValue) // stoch K below D and (macdLine < signalLine) // MACD bearish and isBearTrend // below LTF 200 EMA // ----------------------------------------------------- // Strategy Entries // ----------------------------------------------------- if longCondition strategy.entry("Long Entry", strategy.long) if shortCondition strategy.entry("Short Entry", strategy.short) // ----------------------------------------------------- // Risk Management (Stop-Loss & Take-Profit) // ----------------------------------------------------- if strategy.position_size > 0 // Long position exit strategy.exit("Long Exit", stop = strategy.position_avg_price * (1.0 - stopLossPerc/100.0), limit = strategy.position_avg_price * (1.0 + takeProfitPerc/100.0)) if strategy.position_size < 0 // Short position exit strategy.exit("Short Exit", stop = strategy.position_avg_price * (1.0 + stopLossPerc/100.0), limit = strategy.position_avg_price * (1.0 - takeProfitPerc/100.0)) // ----------------------------------------------------- // Hide All Indicator Plots // (We only show trade markers for entry & exit) // ----------------------------------------------------- // Comment out or remove any plot() calls so chart stays clean. // // Example (commented out): // plot(ema200, title="EMA 200", color=color.new(color.yellow, 0), linewidth=2) // plot(rsiValue, title="RSI", color=color.new(color.blue, 0)) // plot(macdLine, title="MACD", color=color.new(color.teal, 0)) // plot(signalLine, title="Signal", color=color.new(color.purple, 0))