Chiến lược này là một hệ thống giao dịch lưới năng động dựa trên chỉ số TTM, xác định hướng xu hướng thị trường bằng cách tính toán trung bình động theo cấp số nhân (EMA) của mức cao và thấp, và triển khai một hệ thống giao dịch lưới xung quanh giá cơ sở được cập nhật năng động.
Logic cốt lõi nằm trong tính toán trạng thái TTM, được thực hiện thông qua các bước sau: 1. Tính toán hai EMA dựa trên tham số ttmPeriod: EMA thấp nhất (lowMA) và cao nhất (highMA) Định nghĩa hai mức ngưỡng giữa highMA và lowMA: - thấpThứ 3:1⁄3vị trí từ dưới - cao thứ ba:2⁄3vị trí từ dưới 3. Xác định trạng thái TTM dựa trên vị trí giá đóng liên quan đến các ngưỡng sau: - Trả về 1 (hành động tăng) khi đóng là trên cao - Trả 0 (hướng giảm) khi đóng dưới mức thấp - Trả về -1 (trạng thái trung lập) khi close nằm giữa lowThird và highThird
Hệ thống giao dịch lưới điều chỉnh năng động dựa trên trạng thái TTM: 1. Cập nhật giá cơ sở lưới và hướng khi trạng thái TTM thay đổi 2. Tính toán mức giá mua / bán dựa trên hướng lưới và khoảng cách 3. Thực hiện các giao dịch mua hoặc bán tương ứng khi giá vượt qua các mức lưới
Chiến lược này kết hợp phát hiện xu hướng TTM với giao dịch lưới năng động để tạo ra một hệ thống giao dịch thích nghi, kiểm soát rủi ro. Thông qua điều chỉnh năng động hướng lưới và mức giá, chiến lược có thể thích nghi hiệu quả với các môi trường thị trường khác nhau.
/*backtest start: 2024-12-04 00:00:00 end: 2024-12-11 00:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("TTM Grid Strategy", overlay=true) // Input parameters int ttmPeriod = input.int(6, minval=1, title="TTM Period") int gridLevels = input.int(5, minval=2, title="Grid Levels") float gridSpacing = input.float(0.01, minval=0.0001, title="Grid Spacing (%)") // Calculate TTM State ttmState() => lowMA = ta.ema(low, ttmPeriod) highMA = ta.ema(high, ttmPeriod) lowThird = (highMA - lowMA) / 3 + lowMA highThird = 2 * (highMA - lowMA) / 3 + lowMA if close > highThird 1 else if close < lowThird 0 else -1 // State tracking variables var float gridBasePrice = 0.0 var int gridDirection = -1 // Determine grid state updateGridState(float currentClose, int currentState) => float newBasePrice = gridBasePrice int newDirection = gridDirection if currentState != -1 and currentState != gridDirection newBasePrice := currentClose newDirection := currentState [newBasePrice, newDirection] // Calculate grid levels calcGridLevels(float basePrice, int direction, int levels) => float[] buyLevels = array.new_float(levels) float[] sellLevels = array.new_float(levels) for i = 1 to levels multiplier = i * gridSpacing if direction == 1 // Buy grid array.set(buyLevels, i-1, basePrice * (1 - multiplier)) array.set(sellLevels, i-1, basePrice * (1 + multiplier)) else // Sell grid array.set(buyLevels, i-1, basePrice * (1 + multiplier)) array.set(sellLevels, i-1, basePrice * (1 - multiplier)) [buyLevels, sellLevels] // Execute grid trades executeGridTrades(float basePrice, int direction, int levels) => [buyLevels, sellLevels] = calcGridLevels(basePrice, direction, levels) for i = 0 to levels - 1 float buyLevel = array.get(buyLevels, i) float sellLevel = array.get(sellLevels, i) if direction == 1 // Buy grid if low <= buyLevel strategy.entry("GridBuy" + str.tostring(i), strategy.long, comment="Buy Level " + str.tostring(i)) if high >= sellLevel strategy.entry("GridSell" + str.tostring(i), strategy.short, comment="Sell Level " + str.tostring(i)) else // Sell grid if high >= buyLevel strategy.entry("GridBuy" + str.tostring(i), strategy.long, comment="Buy Level " + str.tostring(i)) if low <= sellLevel strategy.entry("GridSell" + str.tostring(i), strategy.short, comment="Sell Level " + str.tostring(i)) // Main strategy logic currentState = ttmState() [newGridBasePrice, newGridDirection] = updateGridState(close, currentState) // Update global variables if newGridBasePrice != gridBasePrice gridBasePrice := newGridBasePrice if newGridDirection != gridDirection gridDirection := newGridDirection // Execute grid trades executeGridTrades(newGridBasePrice, newGridDirection, gridLevels) // Visualization plotColor = newGridDirection == 1 ? color.green : color.red plot(newGridBasePrice, color=plotColor, style=plot.style_cross)