この戦略は,将来の価格動向を決定するために内部価格チャネルを利用し,トレンドフォロー戦略に属している.価格が一定の数の内部価格変動チャネルを形成すると,それは長または短エントリを行うためのトレンド逆転信号として判断される.また,移動平均フィルタリングとストップ・ロス/テイク・プロフィートを組み込み,利益をロックし,比較的一般的な定量的な取引戦略である.
この戦略は,前2個のキャンドルスティックの最高価格と最低価格のサイズ関係に基づいて内部チャネルの形成を決定する.特定の数のキャンドルスティックが,最高価格が前回のキャンドルスティックの最高価格よりも低く,最低価格が前回のキャンドルスティックの最低価格よりも高くなる条件を満たしたとき,内部価格チャネルが特定される.
内部チャネルが特定されると,戦略はチャネルの方向も判断する.もしそれがブリーッシュな内部チャネルである場合,ロングエントリー信号が生成される.もしそれがベアッシュな内部チャネルである場合,ショートエントリー信号が生成される.したがって,これは双方向の取引戦略である.
偽信号をフィルタリングするために,移動平均指標も導入されている.実際の取引信号は,価格が移動平均線以上または下にある場合にのみ生成される.これは横向市場での誤った取引を一定程度防ぐことができる.
入力後,ストップ・ロストとテイク・プロフィートポイントもユーザーの選択に応じて設定できます. 3つの利用可能なストップ・ロスト方法があります:固定ポイントストップ・ロスト,ATRストップ・ロスト,以前の最高/最低ストップ・ロスト.テイク・プロフィートはリスク/報酬比に応じて設定されます.これは利益を一定程度ロックし,リスクを制御することができます.
この戦略の最大の利点は,トレンド逆転点を識別する強固な能力である.価格が一定の数の内部チャネルを形成すると,比較的大きな価格上昇/下落動きが起ころうとしていることを示唆する.この判断は伝統的な技術分析理論と非常に一致している.
さらに,戦略そのものの構成性は非常に強い.ユーザーは,内部チャネルの数,移動平均サイクル,ストップ損失/利益採取方法など,パラメータを自由に選択することができます.これは異なる製品と取引スタイルに大きな柔軟性を提供します.
最後に,戦略に導入された移動平均フィルターとストップ・ロスト/テイク・プロフィート設定も,取引リスクを大幅に削減し,戦略をさまざまな市場環境での取引に適応させています.
この戦略の最大のリスクは,誤ったトレンド判断の比較的高い確率である.内部チャネルは価格逆転を完全に決定することはできません.誤った判断の確率はある.決定された量が不十分であれば,誤った信号が発生する可能性があります.
さらに,この戦略は横向または不安定な市場では全く役に立たない.価格がトレンドを確立することなく上下波動するとき,戦略は絶えず間違った信号を生成する.これは戦略のメカニズムによって決定される.
最後に,ストップ・ロスは保守的に設定されている場合,戦略は主要なトレンドで利益を得るために十分に長くポジションを維持することができません.これはユーザーが自分でバランスを取ることを要求します.
この戦略の最適化空間は依然としてかなり大きい.いくつかの可能な最適化方向には,以下が含まれます.
内部チャネルの量とパターンを最適化する.異なる量や異なる組み合わせの仕組みの下で取引効果をテストする.
動向平均のサイクルパラメータを最適化してトレンド方向をより正確に決定する.現在のデフォルトサイクルはすべての製品に適していない可能性があります.
他の指標フィルターを追加します.例えば,ボリンジャー帯を導入し,価格が帯の上下線を突破したときのみ取引信号を生成します.
ストップ・ロスト/テイク・プロフィートのパラメータを最適化して,戦略がより長くポジションを保持できるようにします.それによってスーパートレンドで利益を得ることができます.
一般的に,この戦略の存在は,その傾向判断の正確性にある.判断の正確性が確保され,適切なリスク管理設定と組み合わせれば,効果的なアルゴリズム取引が実行できます.
概要すると,この戦略は,内部価格チャネルに基づいて将来の価格動向を決定する定量的な取引戦略である.トレンドフォローとトレンド逆転判断方法を組み合わせ,一定の利点がある.しかし,特定の製品や取引環境を満たすために最適化することも可能である.パラメータ最適化後に,最も理想的な定量的な取引戦略の1つになることができます.
/*backtest start: 2023-12-03 00:00:00 end: 2023-12-10 00:00:00 period: 3m basePeriod: 1m 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/ // From "Day Trading Cryptocurrency // Strategies, Tactics, Mindset, and Tools Required To Build Your // New Income Stream" // by Phil C. Senior // "Inside bars are a two -bar pattern. They can indicate either a continuation of the // existing move or a reversal. A continuation occurs when there is no significant // support or resistance level in sight, while a reversal occurs close to a strong sup- // port or resistance level... // ...A lot of traders are aware of inside bars but few manage to make money with // them. Why is this so? It goes back to interpreting price action. A lot of traders look // to trade in geometric ways. What I mean is that they search for fancy shapes on a // chart and think that this is what represents true price action. // This is not the case. A shape is just a shape. The formation by itself means // nothing unless underlying order flow backs it up. This is why it’s extremely impor- // tant that you look for inside bars when a trend is already in place. The best place to // look for them is in the beginning of trends." // © tweakerID //@version=4 strategy("Inside Bar Strategy w/ SL", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=10000, commission_value=0.04, calc_on_every_tick=false, slippage=0) direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1) strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long)) /////////////////////// STRATEGY INPUTS //////////////////////////////////////// title1=input(true, "-----------------Strategy Inputs-------------------") i_NBars = input(defval=1, type=input.integer, title="# Of Inside Bars in pattern", options=[1, 2, 3, 4]) i_BarsDirection = input(false, title="Only trade using complete bullish or bearish patterns") i_MAFilter = input(true, title="Use MA Trend Filter") i_MALen = input(65, title="MA Length") /////////////////////// BACKTESTER ///////////////////////////////////////////// title2=input(true, "-----------------General Inputs-------------------") // Backtester General Inputs i_SL=input(true, title="Use Stop Loss and Take Profit") i_SLType=input(defval="ATR Stop", title="Type Of Stop", options=["Strategy Stop", "Swing Lo/Hi", "ATR Stop"]) i_SPL=input(defval=10, title="Swing Point Lookback") i_PercIncrement=input(defval=1, step=.1, title="Swing Point SL Perc Increment")*0.01 i_ATR = input(14, title="ATR Length") i_ATRMult = input(5, step=.1, title="ATR Multiple") i_TPRRR = input(2, step=.1, title="Take Profit Risk Reward Ratio") TS=input(false, title="Trailing Stop") // Bought and Sold Boolean Signal bought = strategy.position_size > strategy.position_size[1] or strategy.position_size < strategy.position_size[1] // Price Action Stop and Take Profit LL=(lowest(i_SPL))*(1-i_PercIncrement) HH=(highest(i_SPL))*(1+i_PercIncrement) LL_price = valuewhen(bought, LL, 0) HH_price = valuewhen(bought, HH, 0) entry_LL_price = strategy.position_size > 0 ? LL_price : na entry_HH_price = strategy.position_size < 0 ? HH_price : na tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR // ATR Stop ATR=atr(i_ATR)*i_ATRMult ATRLong = ohlc4 - ATR ATRShort = ohlc4 + ATR ATRLongStop = valuewhen(bought, ATRLong, 0) ATRShortStop = valuewhen(bought, ATRShort, 0) LongSL_ATR_price = strategy.position_size > 0 ? ATRLongStop : na ShortSL_ATR_price = strategy.position_size < 0 ? ATRShortStop : na ATRtp=strategy.position_avg_price + (strategy.position_avg_price - LongSL_ATR_price)*i_TPRRR ATRstp=strategy.position_avg_price - (ShortSL_ATR_price - strategy.position_avg_price)*i_TPRRR // Strategy Stop float LongStop = valuewhen(bought,low[1],0)*(1-i_PercIncrement) float ShortStop = valuewhen(bought,high[1],0)*(1+i_PercIncrement) float StratTP = na float StratSTP = na /////////////////////// STRATEGY LOGIC ///////////////////////////////////////// MAFilter=close > sma(close, i_MALen) plot(i_MAFilter ? sma(close, i_MALen) : na) bullBar=close > open bearBar=close < open contbullBar=barssince(not bullBar) >= (i_NBars+1) contbearBar=barssince(not bearBar) >= (i_NBars+1) InsideBar(NBars) => Inside1Bar=high < high[1] and low > low[1] Inside2Bar=high < high[2] and low > low[2] and Inside1Bar Inside3Bar=high < high[3] and low > low[3] and Inside1Bar and Inside2Bar Inside4Bar=high < high[4] and low > low[4] and Inside1Bar and Inside2Bar and Inside3Bar if NBars == 1 inside1Bar=Inside1Bar [inside1Bar] else if NBars == 2 inside2Bar=Inside2Bar [inside2Bar] else if NBars == 3 inside3Bar=Inside3Bar [inside3Bar] else if NBars == 4 inside4Bar=Inside4Bar [inside4Bar] else [na] [insideBar] = InsideBar(i_NBars) bullInsideBar=bar_index > 40 and insideBar and bullBar and (i_BarsDirection ? contbullBar : true) and (i_MAFilter ? MAFilter : true) bearInsideBar=bar_index > 40 and insideBar and bearBar and (i_BarsDirection ? contbearBar : true) and (i_MAFilter ? not MAFilter : true) BUY = bullInsideBar SELL = bearInsideBar //Debugging Plots plot(contbullBar ? 1:0, transp=100, title="contbullBar") plot(contbearBar ? 1:0, transp=100, title="contbearBar") //Trading Inputs DPR=input(true, "Allow Direct Position Reverse") reverse=input(false, "Reverse Trades") // Entries if reverse if not DPR strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0) strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0) else strategy.entry("long", strategy.long, when=SELL) strategy.entry("short", strategy.short, when=BUY) else if not DPR strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0) strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0) else strategy.entry("long", strategy.long, when=BUY) strategy.entry("short", strategy.short, when=SELL) SL= i_SLType == "Swing Lo/Hi" ? entry_LL_price : i_SLType == "ATR Stop" ? LongSL_ATR_price : LongStop SSL= i_SLType == "Swing Lo/Hi" ? entry_HH_price : i_SLType == "ATR Stop" ? ShortSL_ATR_price : ShortStop TP= i_SLType == "Swing Lo/Hi" ? tp : i_SLType == "ATR Stop" ? ATRtp : StratTP STP= i_SLType == "Swing Lo/Hi" ? stp : i_SLType == "ATR Stop" ? ATRstp : StratSTP //TrailingStop dif=(valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, high,0)) -strategy.position_avg_price trailOffset = strategy.position_avg_price - SL var tstop = float(na) if strategy.position_size > 0 tstop := high- trailOffset - dif if tstop<tstop[1] tstop:=tstop[1] else tstop := na StrailOffset = SSL - strategy.position_avg_price var Ststop = float(na) Sdif=strategy.position_avg_price-(valuewhen(strategy.position_size<0 and strategy.position_size[1]>=0, low,0)) if strategy.position_size < 0 Ststop := low+ StrailOffset + Sdif if Ststop>Ststop[1] Ststop:=Ststop[1] else Ststop := na strategy.exit("TP & SL", "long", limit=TP, stop=TS? tstop : SL, when=i_SL) strategy.exit("TP & SL", "short", limit=STP, stop=TS? Ststop : SSL, when=i_SL) /////////////////////// PLOTS ////////////////////////////////////////////////// plot(i_SL and strategy.position_size > 0 and not TS ? SL : i_SL and strategy.position_size > 0 and TS ? tstop : na , title='SL', style=plot.style_cross, color=color.red) plot(i_SL and strategy.position_size < 0 and not TS ? SSL : i_SL and strategy.position_size < 0 and TS ? Ststop : na , title='SSL', style=plot.style_cross, color=color.red) plot(i_SL and strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green) plot(i_SL and strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green) // Draw price action setup arrows plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, color=color.green, title="Bullish Setup", size=size.auto) plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, color=color.red, title="Bearish Setup", size=size.auto)