동적 그리드 거래 전략은 그리드 거래 범위를 동적으로 설정하기 위해 이동 평균선과 그 상부 및 하부 트랙을 계산합니다. 가격이 그리드 범위를 넘을 때 수익성을 달성하기 위해 그리드 라인이 설정하는 고정 간격으로 거래 신호가 발산됩니다.
전략은 먼저 정의된 기간 n의 이동 평균 라인과 이동 평균 라인의 상부 및 하부 트랙을 계산합니다. 상부 트랙은 이동 평균 라인 * (1 + 입력 매개 변수 std), 하부 트랙은 이동 평균 라인 * (1 - 입력 매개 변수 std) 입니다. 이것은 동적으로 조정 된 거래 범위 영역을 구성합니다.
그 다음 범위 영역 내에서, 우리는 m 평평한 격자선을 정의합니다. 가격이 상승하고 격자선을 통과할 때, 그 격자선에서 긴 신호가 발산됩니다. 가격이 떨어지고 격자선을 통과할 때, 그 격자선에 대응하는 이전 격자선에서 종료 신호가 발산됩니다. 이 역 작용을 통해 가격이 변동할 때 이익을 얻을 수 있습니다.
구체적으로, 우리는 bool 배열 order_array를 사용하여 각 그리드 라인의 거래 상태를 기록합니다. 그리드 라인이 긴 조건을 트리거 할 때, order_array의 대응 상태는 이미 위치가 있음을 나타내는 true로 설정됩니다. 가격이 떨어지고 그리드 라인을 깨면, order_array의 이전 그리드 라인의 상태는 false로 설정되어 종료 신호가 발송됩니다.
이 전략은 다음과 같은 장점을 가지고 있습니다.
동적으로 조정된 거래 범위를 구축하기 위해 이동 평균을 사용하면 시장 변동성에 따라 범위를 조정하여 전략이 시장에 더 적응 할 수 있습니다.
그리드 디자인은 자동으로 수익을 취하고 손실을 중지하여 극단적인 시장 조건으로 인한 손실 증가를 방지 할 수 있습니다.
그리드 양과 자본 할당은 동일한 거리와 동일한 할당을 채택하여 단일 포지션의 크기를 잘 제어하고 단일 포지션의 위험을 줄일 수 있습니다.
길고 가까운 신호 설정은 트렌드를 따라 거래하고 적시에 이익을 취하고 손실을 멈추는 것이 합리적입니다.
이 전략은 또한 몇 가지 위험을 안고 있습니다.
시장이 장기적으로 약해지고 격자선을 뚫지 못하면 전략은 무지한 오시일레이션 거래에 빠질 것이고, 롱과 쇼트가 번갈아 계정에 자본 침식이 발생할 수 있습니다.
선택 된 매개 변수 std 및 그리드 수는 완전히 합리적이지 않을 수 있으며 다른 거래 품종 분석에 따라 결정해야합니다. 매개 변수가 잘못 설정되면 전략의 효과에 영향을 미치는 과도하게 크고 작은 거래 구역과 그리드에 이르게됩니다.
이 전략은 가격 격차, 단기적인 폭발적인 상승이나 하락 등과 같은 일부 극단적인 시장 조건을 고려하지 않습니다. 이러한 조건은 전략이 여러 네트워크를 뚫고 위험 통제를 벗어나는 손실을 초래할 수 있습니다.
이 전략은 다음 측면에서도 최적화 될 수 있습니다.
기계 학습 알고리즘을 도입하여 모형을 훈련하여 이동 평균의 상위 및 하위 트랙을 예측하여 거래 구역을 더 지능적이고 역동적으로 만들 수 있습니다.
그리드 수, 자본 할당 비율, 포지션 크기 등과 같은 매개 변수는 적응적인 매개 변수를 사용하여 다른 거래 목표의 특성에 따라 최적화 될 수 있습니다.
조건부 명령은 극한 시장 조건에서 사전 중지 손실 및 제어 손실의 역할을 수행하기 위해 그리드 라인에서 특정 거리에 미리 중지 손실 명령을 설정 할 수 있습니다.
극단적인 시장 조건에 대한 예외 처리 메커니즘을 설계하십시오. 초기 포지션 크기를 증가시키는 것, 중간에있는 격자를 직접적으로 중단 손실을 위해 건너뛰는 것 등, 가격 격차와 같은 상황에 대처 할 수 있습니다.
동적 그리드 트레이딩 전략은 전체적으로 합리적으로 설계되어 있습니다. 그리드를 사용하여 자동 취득 스톱 로스 시스템을 구축 할 수 있으며 이는 빈번한 가격 변동이있는 거래 품종에 적합합니다. 그러나이 전략에는 여전히 특정 시장 위험이 있습니다. 전략이 더 견고해질 전에 매개 변수 및 예외적인 상황이 최적화되어야합니다.
/*backtest start: 2023-10-31 00:00:00 end: 2023-11-30 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy('Grid Trading Strategy', overlay=true) // Input ma_length = input.int(300, 'Moving Average Length',group = 'Moving Average Conditions', step = 10) std = input.float(0.03, title='Upper and Lower Grid Deviation', group='Grid Conditions', step = 0.01) grid = input.int(15, maxval=15, title='Grid Line Quantity', group='Grid Conditions') // Moving Average ma = ta.sma(close, ma_length) upper_bound = ma * (1 + std) lower_bound = ma * (1 - std) grid_width = (upper_bound - lower_bound) / (grid - 1) grid_array = array.new_float(0) for i = 0 to grid - 1 by 1 array.push(grid_array, lower_bound + grid_width * i) var order_array = array.new_bool(grid, false) strategy.initial_capital = 10000 // Entry Conditions for i = 0 to grid - 1 by 1 if close < array.get(grid_array, i) and not array.get(order_array, i) buy_id = i array.set(order_array, buy_id, true) strategy.entry(id=str.tostring(buy_id), direction=strategy.long, comment='#Long ' + str.tostring(buy_id)) if close > array.get(grid_array, i) and i!=0 if array.get(order_array, i-1) sell_id = i - 1 array.set(order_array, sell_id, false) strategy.close(id=str.tostring(sell_id), comment='#Close ' + str.tostring(sell_id)) plot(grid > 0 ? array.get(grid_array,0) : na, color = color.yellow, transp = 10) plot(grid > 1 ? array.get(grid_array,1) : na, color = color.yellow, transp = 10) plot(grid > 2 ? array.get(grid_array,2) : na, color = color.yellow, transp = 10) plot(grid > 3 ? array.get(grid_array,3) : na, color = color.yellow, transp = 10) plot(grid > 4 ? array.get(grid_array,4) : na, color = color.yellow, transp = 10) plot(grid > 5 ? array.get(grid_array,5) : na, color = color.yellow, transp = 10) plot(grid > 6 ? array.get(grid_array,6) : na, color = color.yellow, transp = 10) plot(grid > 7 ? array.get(grid_array,7) : na, color = color.yellow, transp = 10) plot(grid > 8 ? array.get(grid_array,8) : na, color = color.yellow, transp = 10) plot(grid > 9 ? array.get(grid_array,9) : na, color = color.yellow, transp = 10) plot(grid > 10 ? array.get(grid_array,10) : na, color = color.yellow, transp = 10) plot(grid > 11 ? array.get(grid_array,11) : na, color = color.yellow, transp = 10) plot(grid > 12 ? array.get(grid_array,12) : na, color = color.yellow, transp = 10) plot(grid > 13 ? array.get(grid_array,13) : na, color = color.yellow, transp = 10) plot(grid > 14 ? array.get(grid_array,14) : na, color = color.yellow, transp = 10)