이 전략은 거래량의 장기 및 단기 이동 평균의 교차를 기반으로합니다. 거래량의 장기 및 단기 트렌드를 계산하기 위해 서로 다른 기간의 EMA를 사용하여 그 차이에 따라 오시일레이터를 구성합니다. 오시일레이터가 0 수준을 넘을 때 길게 이동하고, 그 아래에 넘을 때 짧게 이동합니다. 또한 특정 방향을 결정하기 위해 이전 높은 가격과 낮은 가격을 통합합니다.
이 전략의 핵심 지표는 볼륨 오시레이터입니다. 그것은 장기 및 단기 기하급수적 이동 평균 사이의 차이를 계산함으로써 거래량 변화의 경향을 반영합니다. 구체적인 공식은:
부피 오시레이터 = (ShortEMA - LongEMA) / LongEMA * 100
여기서 쇼트EMA와 롱EMA는 각각 단기 및 장기 EMA를 의미합니다. 쇼트EMA가 롱EMA를 넘으면 지표가 긍정적으로 변하여 거래량이 증가한다는 것을 의미합니다. 쇼트EMA가 롱EMA를 넘으면 지표가 부정적으로 변하여 거래량이 감소한다는 것을 의미합니다.
오시일레이터를 계산한 후, 이 전략은 거래 신호를 생성하기 위해 제로 레벨의 크로스오버를 사용합니다. 오시일레이터가 음에서 양으로 전환하면 길게, 즉 제로 레벨 이상으로 전환하면 짧게, 즉 양에서 음으로 전환하면 짧게, 즉 0 수준 아래로 전환하면 짧게됩니다. 이것은 거래 부피의 추진량 변환을 반영합니다.
또한, 전략은 또한 특정 방향을 결정하기 위해 이전 고가와 낮은 가격을 통합합니다. 즉, 오시레이터가 0 수준 이상으로 넘어가면, 이전 고가가 이전 낮은 가격의 절대 값보다 크다면 긴 신호를 암시합니다. 그렇지 않으면 짧은 신호입니다. 이 기능은 볼륨 확장의 힘을 판단하는 데 도움이됩니다.
이 전략은 다음과 같은 장점을 가지고 있습니다.
기본 지표로 거래량을 사용하는 것은 시장 참여자의 의지를 효과적으로 결정할 수 있으며 매우 실용적입니다.
장기 및 단기 EMA를 통합하면 중장기 동향과 단기 동력을 동시에 파악할 수 있습니다.
지표와 제로 레벨로 형성된 교차 신호는 의사 결정에 간단하고 명확합니다.
방향성을 결정하기 위해 이전 최고와 최저를 추가하면 거래량의 추진 크기를 잘 사용할 수 있습니다.
전략 논리는 간단하고 매개 변수는 조정할 수 있고 적응력이 상대적으로 강합니다.
이 전략의 몇 가지 위험 요소는 다음과 같습니다.
부피 지표는 잘못된 신호를 생성하는 잘못된 시장 파열에 영향을받을 수 있습니다. 위험을 제어하기 위해 스톱 로스를 설정해야합니다.
범위에 묶인 시장에서는 부피 교차가 자주 발생할 수 있습니다. 지표의 전환점을 적절히 확인해야합니다.
과거 고도와 하도는 최근 확장을 반영하고 그 지속가능성을 결정할 수 없습니다.
매개 변수들은 다른 제품과 기간에 대해 별도의 최적화가 필요합니다. 보편성은 제한적입니다.
부피 지표는 고주파 알고리즘 거래에 느리게 반응하고, 아마도 가장 좋은 출입 시기를 놓칠 수 있습니다.
이 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.
잘못된 신호를 피하기 위해 필터를 추가합니다. 예를 들어 가격 지표로 확인합니다.
장기 및 단기 EMA의 기간을 최적화하여 다른 제품의 특성을 일치시킵니다.
이전 최고와 최저값에 대한 기간 매개 변수를 설정하여 한 기간의 최대 및 최소 가격을 사용합니다.
과도한 거래를 피하기 위해 단일 레벨 대신 지표의 전환 영역에 대한 범위를 정의합니다.
단일 손실을 통제하기 위해 스톱 로스 전략을 추가합니다.
VRP와 같은 다른 부피 기반 지표를 포함합니다.
매개 변수를 자동으로 최적화하기 위해 기계 학습 방법을 사용합니다.
요약하자면, 볼륨 오시일레이터 장기 단기 이동 평균 크로스오버 전략은 볼륨 역전 기능을 잘 활용하고 트렌드의 초기 단계에서 강한 판단력을 가지고 있습니다. 방향을 결정하기 위해 이전 최고와 최하위를 추가하면 거래 결정이 더 정확합니다. 또한 잘못된 신호로 인한 손실을 방지하기 위해 위험 통제가 중요합니다. 이 전략은 매개 변수 조정 및 지표 조합과 같은 측면에서 최적화 할 수있는 넓은 공간을 가지고 있으며 시장 변화에 대한 거래 지연 및 반응 시간을 단축합니다.
/*backtest start: 2022-12-05 00:00:00 end: 2023-03-11 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("SB_Volume_oscillator_Prev_high_low", overlay=true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100) shortlen = input(5, minval=1) longlen = input(10, minval=1) short = ema(volume, shortlen) long = ema(volume, longlen) osc = 100 * (short - long) / long //hline(0, title="Zero") //plot(osc) zero=input(0.0) low_val=input(0.0) high_val=input(0.0) prev_high_val=input(0.0) prev_low_val=input(0.0) where=input(0) where:=nz(where[1]) low_val:=nz(low_val[1]) high_val:=nz(high_val[1]) prev_high_val:=nz(prev_high_val[1]) prev_low_val:=nz(prev_low_val[1]) if(crossover(osc,zero)) high_val:=osc where:=1 prev_low_val:=low_val low_val:=osc if(crossunder(osc,zero)) low_val:=osc where:=-1 prev_high_val:=high_val high_val:=osc if(where==1) if(high_val<osc) high_val:=osc if(where==-1) if(low_val>osc) low_val:=osc if (crossover(osc,zero)) if(prev_high_val<=abs(prev_low_val)) strategy.entry("My Long Entry Id", strategy.long) if(prev_high_val>abs(prev_low_val)) strategy.entry("My Short Entry Id", strategy.short) if (crossunder(osc,zero)) if(prev_high_val<=abs(prev_low_val)) strategy.entry("My Long Entry Id", strategy.long) if(prev_high_val>abs(prev_low_val)) strategy.entry("My Short Entry Id", strategy.short)