이 전략은 거래 신호를 생성하고 양성 상관관계 자산 MCL와 YG 사이의 쌍 거래를 구현하기 위해 볼링거 밴드 브레이크오웃을 사용합니다. MCL 가격이 상위 밴드에 닿을 때 MCL과 YG가 길어지고 MCL 가격이 하위 밴드에 닿을 때 MCL과 YG가 길어지고 가격 추세를 따라 거래합니다.
우선, 전략은 SMA 라인과 StdDev를 특정 기간 동안의 폐쇄 가격에 기초하여 계산합니다. 다음에는 SMA 위와 아래의 오프셋을 추가하여 볼링거 밴드의 상부 및 하부 밴드를 형성합니다. 가격이 상부 밴드에 닿을 때 구매 신호가 생성되며 가격이 하부 밴드에 닿을 때 판매 신호가 생성됩니다.
이 전략은 볼링거 밴드 (Bollinger Bands) 의 브레이크아웃 거래 논리를 활용합니다. 가격이 상위 밴드 이상으로 넘어갈 때 길고 가격이 하위 밴드 아래로 넘어갈 때 짧습니다. 볼링거 밴드는 시장 변동성에 따라 밴드의 폭을 동적으로 조정하여 범위 기간 동안 시장 소음을 필터링하는 데 도움이됩니다. 고정 채널 밴드와 달리 볼링거 밴드는 높은 변동성 중에 넓어지고 낮은 변동성 중에 좁아집니다. 이것은 변동성이 높을 때 약간의 소음을 필터링하고 변동성이 낮을 때 더 작은 브레이크아웃을 캡처 할 수 있습니다.
이 전략은 양성 상관관계 자산 MCL와 YG 사이의 쌍 거래를 구현합니다. MCL가 상단 범위를 넘을 때 MCL가 상승 추세에 있음을 보여줍니다. 전략은 MCL와 YG를 길게 길게 - 더 강한 자산을 구입하고 더 약한 자산을 판매하여 가격의 차이에서 이익을 얻습니다.
위험은 매개 변수를 최적화하고, 더 강한 상관관계와 유동성을 가진 자산을 선택하고, 적절한 스톱 로스를 설정함으로써 감소 할 수 있습니다.
전체적으로 전략은 간단하고 직설적이며 볼링거 밴드를 사용하여 트렌드를 포착하고 쌍 거래에서 알파를 얻습니다. 그러나 매개 변수 조정, 스톱 로스 및 쌍 선택에서 개선할 여지가 있습니다. 매개 변수, 거래 차량, 트렌드 필터 등을 추가 테스트하면 전략 성능을 향상시킬 수 있습니다.
/*backtest start: 2022-11-07 00:00:00 end: 2023-11-13 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © shark792 //@version=5 // 1. Define strategy settings strategy(title="MCL-YG Pair Trading Strategy", overlay=true, pyramiding=0, initial_capital=10000, commission_type=strategy.commission.cash_per_order, commission_value=4, slippage=2) smaLength = input.int(title="SMA Length", defval=20) stdLength = input.int(title="StdDev Length", defval=20) ubOffset = input.float(title="Upper Band Offset", defval=1, step=0.5) lbOffset = input.float(title="Lower Band Offset", defval=1, step=0.5) usePosSize = input.bool(title="Use Position Sizing?", defval=true) riskPerc = input.float(title="Risk %", defval=0.5, step=0.25) // 2. Calculate strategy values smaValue = ta.sma(close, smaLength) stdDev = ta.stdev(close, stdLength) upperBand = smaValue + (stdDev * ubOffset) lowerBand = smaValue - (stdDev * lbOffset) riskEquity = (riskPerc / 100) * strategy.equity atrCurrency = (ta.atr(20) * syminfo.pointvalue) posSize = usePosSize ? math.floor(riskEquity / atrCurrency) : 1 // 3. Output strategy data plot(series=smaValue, title="SMA", color=color.teal) plot(series=upperBand, title="UB", color=color.green, linewidth=2) plot(series=lowerBand, title="LB", color=color.red, linewidth=2) // 4. Determine long trading conditions enterLong = ta.crossover(close, upperBand) exitLong = ta.crossunder(close, smaValue) // 5. Code short trading conditions enterShort = ta.crossunder(close, lowerBand) exitShort = ta.crossover(close, smaValue) // 6. Submit entry orders if enterLong strategy.entry(id="EL", direction=strategy.long, qty=posSize) if enterShort strategy.entry(id="ES", direction=strategy.short, qty=posSize) // 7. Submit exit orders strategy.close(id="EL", when=exitLong) strategy.close(id="ES", when=exitShort)