이 전략은 TTM 지표에 기반한 동적 그리드 거래 시스템으로, 상승과 하락의 기하급수적 이동 평균 (EMA) 을 계산하여 시장 트렌드 방향을 결정하고, 동적으로 업데이트 된 기본 가격 주위에서 그리드 거래 시스템을 배포합니다. 그리드의 방향과 가격 수준은 트렌드에 따라 조정되며, 가격이 미리 정의된 그리드 수준을 넘으면 거래를 실행하며, 각 거래는 계좌 자본의 고정 비율을 위험에 빠뜨립니다.
핵심 논리는 다음 단계를 통해 구현된 TTM 상태 계산에 있습니다.
네트워크 거래 시스템은 TTM 상태에 따라 동적으로 조정됩니다.
이 전략은 TTM 트렌드 탐지와 동적 그리드 트레이딩을 결합하여 적응력 있고 위험 제어 된 거래 시스템을 만듭니다. 그리드 방향과 가격 수준을 동적으로 조정함으로써 전략은 다른 시장 환경에 효과적으로 적응 할 수 있습니다. 고유한 위험이 존재하지만 적절한 매개 변수 설정 및 최적화 조치를 통해 전략은 좋은 실용적 가치와 개발 잠재력을 보여줍니다.
/*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)