この戦略は,レジベア
中間帯,上帯,下帯を計算します.中間帯は閉値のn日間の単純な移動平均線で,上帯と下帯は閉値のn日間の標準偏差の+/マイナスm倍です.
Keltner Channels の中間線,上間線,下間線を計算する.中間線は閉値の n 日間の単純な移動平均線,上間線と下間線は真範囲の n 日間の単純な移動平均線+/マイナス m × である.
価格がボリンジャー帯とケルトナーチャネルの上下帯を突破して圧縮と拡大パターンを形成するかどうかを決定する.圧縮は価格が下帯を突破すると形成され,膨張は価格が上帯を突破すると形成される.
動力指標として線形回帰曲線の値を計算する. 0 を上向きは買い信号で, 0 を下向きは売り信号である.
圧縮/拡張パターン,モメント方向,平均フィルタリング,その他の条件を組み合わせて最終的な取引信号を決定します. 悪い取引を避けるためにすべての条件が満たされたときにのみ信号が起動します.
ボリンガー帯とケルターチャネルを二重フィルタリングして 質の圧縮と膨張パターンを特定します
モメントインジケーターはチャネルインジケーターを補完して 価格トレンドの逆転をタイミングで把握できます
利益の機会を増やすために 早期に入場を許可します
多条件判断を採用する.
技術指標のパラメータは,異なる製品とパラメータ組み合わせに適応し,カスタマイズできます.
バックテストのタイムフレームは,特定の期間を最適化するように設定できます.
トレンドをフォローする戦略は,トレンドが逆転すると損失を伴う傾向があります.
パラメータの設定が正しくない場合,過剰な取引や信号の質が低下する可能性があります.
過去のデータに頼ることは 将来の安定した収益を保証することはできない.
ブラック・スワン事件による 市場動乱と急激な価格変動に対処できない
バックテスト時の設定が正しくない場合 オーバーフィッティングが発生します
最適な組み合わせを見つけるためにボリンガー帯とケルトナーチャネルのパラメータを最適化します
トレーリングストップロスを追加して最大損失を制御するテスト
特定の製品と期間/パラメータの組み合わせに対してさらなる最適化を試みる.
トレンドリバースを判断するための機械学習モデルを統合する.
異なるエントリーシーケンシングと位置サイズ戦略をテストする.
トレンド逆転の信号を特定し タイミングで脱出する方法について研究してください
この戦略は,価格トレンドの方向を判断し,トレンドに従うために複数の技術指標を統合し,比較的強い適応性を有しています.パラメータをカスタマイズし,複数の条件フィルターを使用することで,取引頻度を効果的に制御し,シグナル品質を改善することができます. しかし,逆転トレードやブラックスワンイベントはまだ見られなければなりません.
/*backtest start: 2022-11-06 00:00:00 end: 2023-11-12 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 //Strategy based on LazyBear Squeeze Momentum Indicator //I added some custom feature and filters // // @author LazyBear // List of all my indicators: // https://docs.google.com/document/d/15AGCufJZ8CIUvwFJ9W-IKns88gkWOKBCvByMEvm5MLo/edit?usp=sharing // v2 - fixed a typo, where BB multipler was always stuck at 1.5. [Thanks @ucsgears] // strategy(shorttitle = "SQZMOM_LB", title="Strategy for Squeeze Momentum Indicator [LazyBear]", overlay=false, calc_on_every_tick=true, pyramiding=0,default_qty_type=strategy.percent_of_equity,default_qty_value=100,currency=currency.USD) length = input(14, title="BB Length") mult = input(2.0,title="BB MultFactor") lengthKC=input(16, title="KC Length") multKC = input(1.5, title="KC MultFactor") useTrueRange = input(true, title="Use TrueRange (KC)", type=bool) //FILTERS useExtremeOrders = input(false, title="Early entry on momentum change", type=bool) useMomAverage = input(false, title="Filter for Momenutum value", type=bool) MomentumMin = input(20, title="Min for momentum") // Calculate BB src = close basis = sma(src, length) dev = mult * stdev(src, length) upperBB = basis + dev lowerBB = basis - dev // Calculate KC ma = sma(src, lengthKC) range = useTrueRange ? tr : (high - low) rangema = sma(range, lengthKC) upperKC = ma + rangema * multKC lowerKC = ma - rangema * multKC sqzOn = (lowerBB > lowerKC) and (upperBB < upperKC) sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC) noSqz = (sqzOn == false) and (sqzOff == false) val = linreg(src - avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0) bcolor = iff( val > 0, iff( val > nz(val[1]), lime, green), iff( val < nz(val[1]), red, maroon)) scolor = noSqz ? blue : sqzOn ? black : aqua plot(val, color=bcolor, style=histogram, linewidth=4) plot(0, color=scolor, style=cross, linewidth=2) //LOGIC //momentum filter filterMom=useMomAverage?abs(val)>(MomentumMin/100000)?true:false:true //standard condition longCondition = scolor[1]!=aqua and scolor==aqua and bcolor==lime and filterMom exitLongCondition = bcolor==green and not useExtremeOrders shortCondition = scolor[1]!=aqua and scolor==aqua and bcolor==red and filterMom exitShortCondition = bcolor==maroon and not useExtremeOrders //early entry extremeLong= useExtremeOrders and scolor==aqua and bcolor==maroon and bcolor[1]!=bcolor[0] and filterMom exitExtLong = scolor==black or bcolor==red extremeShort = useExtremeOrders and scolor==aqua and bcolor==green and bcolor[1]!=bcolor[0] and filterMom exitExtShort = scolor==black or bcolor==lime //STRATEGY strategy.entry("SQ_Long", strategy.long, when = longCondition) strategy.close("SQ_Long",when = exitLongCondition ) strategy.entry("SQ_Long_Ext", strategy.long, when = extremeLong) strategy.close("SQ_Long_Ext",when = exitExtLong) //strategy.exit("exit Long", "SQ_Long", when = exitLongCondition) strategy.entry("SQ_Short", strategy.short, when = shortCondition) strategy.close("SQ_Short",when = exitShortCondition) strategy.entry("SQ_Short_Ext", strategy.short, when = extremeShort) strategy.close("SQ_Short_Ext",when = exitExtShort) //strategy.exit("exit Short", "SQ_Short", when = exitShortCondition) // // === Backtesting Dates === thanks to Trost // testPeriodSwitch = input(true, "Custom Backtesting Dates") // testStartYear = input(2018, "Backtest Start Year") // testStartMonth = input(1, "Backtest Start Month") // testStartDay = input(1, "Backtest Start Day") // testStartHour = input(0, "Backtest Start Hour") // testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0) // testStopYear = input(2018, "Backtest Stop Year") // testStopMonth = input(12, "Backtest Stop Month") // testStopDay = input(14, "Backtest Stop Day") // testStopHour = input(23, "Backtest Stop Hour") // testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0) // testPeriod() => // time >= testPeriodStart and time <= testPeriodStop ? true : false // isPeriod = testPeriodSwitch == true ? testPeriod() : true // // === /END // if not isPeriod // strategy.cancel_all() // strategy.close_all()