동적 돌파 이동 평균 거래 전략


생성 날짜: 2023-11-13 10:27:54 마지막으로 수정됨: 2023-11-13 10:27:54
복사: 0 클릭수: 644
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

동적 돌파 이동 평균 거래 전략

개요

이 전략의 주요 아이디어는 다양한 주기의 Ratio OCHL Averager 지표를 사용하여 여러 개의 평균선을 구성하고, 평균선의 교차 모양에 따라 매매 신호를 생성하는 것입니다. 그것은 가격 추세를 동적으로 포착하여 중장기 거래에 적합합니다.

전략 원칙

이 전략은 두 개의 다른 주기 Ratio OCHL Averager 지표를 사용하여, 각각 빠른 라인 및 느린 라인 Ratio OCHL Averager 지표의 계산 공식은 다음과 같습니다:

b = abs(close-open)/(high - low) 
c = min(max(b, 0), 1)
Ratio OCHL Averager = c*close + (1-c)*前一日Ratio OCHL Averager

여기서 b는 당일 가격 변동 상황을 나타내는 비율이며, c는 b에 대한 표준화 처리 후의 값이다. Ratio OCHL Averager 지표는 오픈 가격, 클로즈 가격, 최고 가격 및 최저 가격의 네 가지 가격을 통합하여 평균선을 구성한다.

이 전략은 빠른 선의 주기가 짧고, 느린 선의 주기가 길다. 빠른 선에서 느린 선을 통과하면 구매 신호가 발생하고, 반대로 빠른 선 아래의 느린 선을 통과하면 판매 신호가 발생한다. 평선 교차 원리를 사용하여 트렌드를 잡는다.

전략적 이점

  1. Ratio OCHL Averager 지표는 가격 데이터를 부드럽게 하고, 시장 소음을 효과적으로 필터링하여 거래 신호를 더 신뢰할 수 있게 한다.

  2. 쌍평선 교차는 다른 주기와 결합하여 트렌드 방향을 판단하여 새로운 트렌드의 시작을 더 잘 판단할 수 있다.

  3. 빠른 선과 느린 선의 주기 변수를 조정하여 다양한 시장 환경에 적응할 수 있다.

  4. 전략은 간단하고 직관적이며, 실행에 옮기기 쉽다.

  5. 손해 차단 기준을 유연하게 설정하여 위험을 제어할 수 있습니다.

전략적 위험

  1. 평선 교차 전략은 더 많은 가짜 신호를 생성할 수 있으며, 다른 기술 지표와 함께 필터링이 필요합니다.

  2. 빠른 선과 느린 선의 주기적 변수를 합리적으로 선택해야 하며, 변수 선택이 잘못되면 전략 효과에 영향을 줄 수 있다.

  3. 양평선 교차 전략은 트렌드 추적 전략에 속하며, 동요행동에 적합하지 않으며, 트렌드행동에 사용되어야 한다.

  4. 손실 위험을 줄이기 위해 스톱포트를 적절하게 조정해야 하며, 스톱포트는 합리적으로 설정되어야 한다.

최적화 방향

  1. 동력 지표와 같은 조합으로 신호 필터링을 고려할 수 있으며, 신호 품질을 향상시킬 수 있다. 예를 들어 MACD, KDJ 등이다.

  2. 다양한 패스트라인과 패스트라인 주기 파라미터 조합을 테스트하여 최적의 파라미터를 찾을 수 있다.

  3. 피드백 결과에 따라 최적의 스톱포인트를 최적화하여 최적의 설정을 찾을 수 있다.

  4. 특정 시장 환경에서 동적으로 조정되는 파라미터를 고려할 수 있습니다. 예를 들어, 대시장 흔들림 때 확대되는 주기적 파라미터 .

요약하다

이 전략의 전체적인 아이디어는 명확하고 이해하기 쉽다. 급속한 평평선 교차를 통해 트렌드 방향을 판단한다. 중·단기 거래에 적합한 동적 추적 전략이다. 최적화 공간이 넓고, 매개 변수 조정, 신호 필터링 등의 방법으로 전략 효과를 더욱 향상시킬 수 있다.

전략 소스 코드
/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="[XC] Adaptive Strategy V3 - Ratio OCHL Averager no repaint",shorttitle="R_OHCL", overlay=true, currency=currency.EUR,initial_capital=10000,
     default_qty_value=100, default_qty_type=strategy.percent_of_equity , calc_on_every_tick=false, calc_on_order_fills=true)


//                  ╔═ SETTINGS                  ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

strategy_1     = input ( defval=true   , type=input.bool    , title="STRATEGY 1? —>"      )
Recursive      = input(false)
RES201         = "Min",RES202= "D",RES203 = "W",RES204 = "M"

//++ Resolution 1 ++
inp_resolution1 = input(600, minval=1, title="Resolution Line 1")
restype1        = input ( defval="Min"  , type=input.string , title= "Resolution Line 1" , options=[ "Min","D","W","M"])
multiplier1     = restype1 == "Min" ? "" : restype1 == "D" ? "D" : restype1 == "W" ? "W" : "M"
resolution1     = tostring(inp_resolution1)+ multiplier1

//++ Resolution 2 ++
inp_resolution2 = input(1440, minval=1, title="Resolution Line 2")
restype2        = input ( defval="Min"  , type=input.string , title= "Resolution Line 2" , options=["Min","D","W","M"])
multiplier2     = restype2 == "Min" ? "" : restype2 == "D" ? "D" : restype2 == "W" ? "W" : "M"
resolution2     = tostring(inp_resolution2)+ multiplier2

StopLoss        = input(defval = 500 , title = "Stop Loss", minval = 0)
TakeProfit      = input(defval = 2500 , title = "Take Profit", minval = 0)
// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = TakeProfit  >= 1 ? TakeProfit  : na
useStopLoss     = StopLoss    >= 1 ? StopLoss    : na


//                  ╔═ BACKTEST RANGE            ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░
line_breakBTR  = input ( defval = true   , type=input.bool   , title="BACKTEST RANGE —"      ) 
FromYear       = input ( defval = 2019, title = "From Year", minval = 2017)
FromMonth      = input ( defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay        = input ( defval = 2, title = "From Day", minval = 1, maxval = 31)
//FromHour     = input ( defval = 1, title = "From Hour", minval = 1, maxval = 24)
ToYear         = input ( defval = 9999, title = "To Year", minval = 2017)
//ToHour       = input ( defval = 0, title = "From Hour", minval = 0, maxval = 24)
ToMonth        = input ( defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay          = input ( defval = 1, title = "To Day", minval = 1, maxval = 31)

// === FUNCTION EXAMPLE ===
start     = timestamp(syminfo.timezone, FromYear, FromMonth, FromDay, 0, 00)  // backtest start window
finish    = timestamp(syminfo.timezone, ToYear  , ToMonth  , ToDay  , 0, 59)  // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"

//                  ╔═ INDICATOR                 ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

// "Ratio OCHL Averager" -> alexgrover / tradingview.com/script/RGAtOI6h-Ratio-OCHL-Averager-An-Alternative-to-VWAP/

rochla( res,Recursive)=>
    //Recursive = false
    H =  security(syminfo.tickerid,res,high[1],gaps = barmerge.gaps_off,  lookahead = barmerge.lookahead_on)
    L =  security(syminfo.tickerid,res,low[1] ,gaps = barmerge.gaps_off,  lookahead = barmerge.lookahead_on)
    d = 0.
    //----
    a = Recursive ? nz(d[1],open) : open
    b = abs(close-a)/(H - L)
    c = b > 1 ? 1 : b
    d := c*close+(1-c)*nz(d[1],close)



strat1_line1=rochla(resolution1,Recursive)
strat1_line2=rochla(resolution2,Recursive)

plot(strat1_line1, title="Ratio OCHL Averager 1", color=#DAA520,linewidth=2,transp=0)
plot(strat1_line2, title="Ratio OCHL Averager 2", color=#B22222,linewidth=2,transp=0)



//                  ╔═ STRATEGY 1                ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

trading_strat1_line1 = strategy_1 == 1    ? strat1_line1   : na
trading_strat1_line2 = strategy_1 == 1    ? strat1_line2   : na

longCross  = crossunder (trading_strat1_line2, trading_strat1_line1) ? true : false
shortCross = crossover  (trading_strat1_line2, trading_strat1_line1) ? true : false

plot( longCross  ? trading_strat1_line1 : na , title = "Long"  , color=color.aqua, style=plot.style_circles, linewidth=5, offset= 0)
plot( shortCross ? trading_strat1_line2 : na , title = "Short" , color=color.red , style=plot.style_circles, linewidth=5, offset= 0)



//                  ╔═ Backtest 1                ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░


strategy.exit("close",loss = useStopLoss, profit = useTakeProfit)

if longCross  and window() and strategy_1 == 1 
    strategy.entry("Go Long", strategy.long)
if shortCross and window() and strategy_1 == 1 
    strategy.entry("Go Short", strategy.short)

//end