
동적 격자 거래 전략은 이동 평균과 그 상승과 하락을 계산하여 격자 거래 범위를 동적으로 설정합니다. 가격이 격자 범위를 돌파 할 때, 고정 간격으로 설정된 격자 선에 따라 거래 신호를 발산하여 수익을 얻습니다.
이 전략은 먼저 정의된 기간 n의 이동 평균을 계산하고 이동 평균의 상하를 이동 평균으로 니다.(1 + 입력 변수 std), 하단 트랙은 이동 평균(1 - 입력 변수 std) ᅲ.ᅲ 이렇게 하면 동적으로 조정된 거래 영역을 구성할 수 있습니다.
그 다음, 간격 영역에서, 우리는 m 줄의 간격의 그리드 라인을 정의한다. 가격이 상승하면 어떤 그리드 라인을 뚫을 때, 그 그리드 라인에서 다중 신호를 발산한다. 가격이 하락하면 어떤 그리드 라인을 뚫을 때, 그 그리드 라인에 대응하는 상위 그리드 라인에서 평소 신호를 발산한다.
구체적으로, 우리는 order_array의 boolean 형태의 배열을 사용하여 각 격자 라인의 거래 상태를 기록합니다. 어떤 격자 라인이 다항 조건으로 촉발되면, 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)