
この戦略はブリン帯突破を用いて取引信号を検出し,MCLとYGの2つの正に関連した資産のペア取引を実現する.MCLの価格がブリン帯を上線に触れたとき,MCLをオフにすると,YGをオフにします.MCLの価格がブリン帯をダウンに触れたとき,MCLをオフにすると,YGをオフにすると,価格の傾向の順調取引を実現します.
まず,この戦略は,一定の周期内の閉盘価格に基づいて,SMA平均線と標準差StdDevを計算する.そして,SMA平均線の上にそれぞれ偏移量を加え,ブリン帯の上線と下線を形成する.価格が上線に触れたときに買取信号を生じ,下線に触れたときに売り信号を生成する.
この戦略は,ブリン帯の突破取引考え方を採用している.つまり,価格が突破上線時に見多し,突破下線時に見空である.ブリン帯は,チャネル幅を動的に調整することで,市場の変化に適応し,市場の揺れ騒音を効果的にフィルターすることができる.固定チャネルとは異なり,ブリン帯のチャネル幅は,市場の変動性の変化に伴い,拡大または縮小する.波動性が大きいとき,ブリン帯の下線隙間は大きいので,部分的な騒音をフィルターすることができる.波動性が少ないとき,ブリン帯の上下線隙間は小さいので,より小さな突破信号を捕捉することができる.
2つの正の関連資産MCLとYGのペア取引.MCLが軌道に乗ったとき,MCLの価格は上昇傾向にあることを示し,MCLを多めにすると同時にYGを空白する.つまり,より強い資産を購入し,より弱い資産を売却して,2つの資産価格の差から利益を得る.
パラメータの最適化,より関連性のある,流動性の高い取引相手の選択,合理的なストップ・ポジションの設定などの方法によってリスクを減らすことができます.
この戦略は,全体的に見ると単純で直接的なもので,ブリン帯を通してトレンドをキャプチャし,取引をペアしてアルファ収益を得る.しかし,いくつかのパラメータ最適化,ストップ損失,ペア選択などの最適化可能なスペースがあります.異なるパラメータ,取引対象をテストし,トレンドフィルターなどの方法を適切に導入することによって,より良い戦略効果を得ることができます.
/*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)