Strategi ini menggunakan saluran harga dalaman untuk menentukan trend harga masa depan dan tergolong dalam strategi trend berikut. Apabila harga membentuk beberapa saluran fluktuasi harga dalaman, ia dinilai sebagai isyarat pembalikan trend untuk membuat entri panjang atau pendek. Ia juga menggabungkan penapisan purata bergerak dan stop-loss / take-profit untuk mengunci keuntungan dan merupakan strategi perdagangan kuantitatif yang agak biasa.
Strategi menentukan pembentukan saluran dalaman mengikut hubungan saiz antara harga tertinggi dan terendah dari dua candlestick sebelumnya. Apabila sebilangan tertentu candlesticks memenuhi syarat bahawa harga tertinggi adalah lebih rendah daripada harga tertinggi candlestick sebelumnya dan harga terendah adalah lebih tinggi daripada harga terendah candlestick sebelumnya, saluran harga dalaman dikenal pasti.
Apabila saluran dalaman dikenal pasti, strategi juga menilai arah saluran. Jika ia adalah saluran dalaman bullish, isyarat masuk panjang dihasilkan. Jika ia adalah saluran dalaman bearish, isyarat masuk pendek dihasilkan. Oleh itu, ini adalah strategi perdagangan dua arah.
Untuk menapis isyarat palsu, penunjuk purata bergerak juga diperkenalkan. Isyarat dagangan sebenar hanya dihasilkan apabila harga di atas atau di bawah garis purata bergerak. Ini dapat mengelakkan perdagangan yang salah hingga tahap tertentu di pasaran sampingan.
Selepas masuk, titik stop-loss dan take-profit juga boleh ditetapkan mengikut pilihan pengguna. Terdapat tiga kaedah stop loss yang tersedia: stop loss titik tetap, ATR stop loss, stop loss tertinggi / terendah sebelumnya.
Kelebihan terbesar strategi ini adalah keupayaannya yang kuat untuk mengenal pasti titik pembalikan trend. Apabila harga membentuk beberapa saluran dalaman, ia sering memberi isyarat bahawa pergerakan harga naik / turun yang agak besar akan berlaku.
Di samping itu, konfigurasi strategi itu sendiri sangat kuat. Pengguna boleh memilih secara bebas parameter seperti bilangan saluran dalaman, kitaran purata bergerak, kaedah stop loss / mengambil keuntungan, dll. Ini memberikan fleksibiliti yang besar untuk produk dan gaya perdagangan yang berbeza.
Akhirnya, penapis purata bergerak dan tetapan stop-loss / take-profit yang diperkenalkan dalam strategi juga mengurangkan risiko perdagangan dengan ketara.
Risiko terbesar strategi ini adalah kebarangkalian yang agak tinggi penilaian trend yang salah. Saluran dalaman tidak dapat menentukan pembalikan harga sepenuhnya, terdapat kebarangkalian penilaian yang salah. Jika kuantiti yang ditentukan tidak mencukupi, isyarat palsu mungkin berlaku.
Di samping itu, strategi ini sama sekali tidak berguna dalam pasaran sampingan atau tidak menentu. Apabila harga turun naik tanpa menubuhkan trend, strategi akan terus menghasilkan isyarat yang salah. Ini ditentukan oleh mekanisme strategi.
Akhirnya, jika stop loss ditetapkan terlalu konservatif, strategi mungkin tidak dapat memegang kedudukan cukup lama untuk menangkap keuntungan dalam trend utama.
Ruang pengoptimuman strategi ini masih agak besar.
Mengoptimumkan kuantiti dan corak saluran dalaman. Uji kesan perdagangan di bawah kuantiti yang berbeza atau pengaturan gabungan yang berbeza.
Mengoptimumkan parameter kitaran purata bergerak untuk menentukan arah trend dengan lebih baik. Kitaran lalai semasa mungkin tidak sesuai untuk semua produk.
Tambah penapis penunjuk lain. Sebagai contoh, memperkenalkan Bollinger Bands dan hanya menjana isyarat perdagangan apabila harga memecahkan rel atas atau bawah Band.
Mengoptimumkan parameter stop loss / mengambil keuntungan untuk membolehkan strategi untuk memegang kedudukan untuk masa yang lebih lama.
Secara amnya, kewujudan strategi ini terletak pada ketepatan penilaian trendnya. Selagi ketepatan penilaian dapat dijamin, digabungkan dengan tetapan pengurusan risiko yang sesuai, perdagangan algoritma yang berkesan dapat dijalankan.
Ringkasnya, strategi ini adalah strategi perdagangan kuantitatif yang menentukan trend harga masa depan berdasarkan saluran harga dalaman. Ia menggabungkan trend berikut dan kaedah penghakiman pembalikan trend dan mempunyai kelebihan tertentu. Tetapi terdapat juga ruang untuk pengoptimuman untuk memenuhi produk dan persekitaran perdagangan tertentu. Selepas pengoptimuman parameter, ia boleh menjadi salah satu strategi perdagangan kuantitatif yang paling ideal.
/*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)