Strategi bull flag breakout adalah strategi analisis teknis yang mengidentifikasi pola grafik bull flag dan masuk pada titik breakout, bertujuan untuk menangkap awal tren.
Langkah-langkah utama dari strategi ini adalah:
Ketika menilai tiang bendera dan bendera, strategi dengan cerdas menggunakan indikator ATR untuk menentukan breakout yang signifikan dan membatasi tinggi bendera dalam 33% dari tinggi tiang untuk menghindari sinyal palsu yang berlebihan.
Keuntungan utama dari strategi ini meliputi:
Risiko utama dari strategi ini adalah:
Untuk mengatasi risiko di atas, kita dapat mengatur stop loss, mengoptimalkan mekanisme keluar untuk mengunci keuntungan ketika mencapai rasio keuntungan tertentu.
Beberapa arah untuk mengoptimalkan strategi:
Kesimpulannya, strategi bull flag breakout menggunakan pola teknis untuk menentukan awal tren, metode yang agak klasik, dan aturan masuk memang dirancang secara ketat untuk menyaring banyak sinyal palsu.
/*backtest start: 2024-01-22 00:00:00 end: 2024-02-21 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // © smith26 //This strategy enters on a bull flag and closes position 6 bars later. Average true range is used instead of a moving average. //The reason for ATR instead of MA is because with volatile securities, the flagpole must stand up a noticable "distance" above the trading range---which you can't determine with a MA alone. //This is broken up into multiple parts: Defining a flagpole, defining the pole height, and defining the flag, which will be constrained to the top third (33%) of the pole height to be considered a flag. //@version=4 strategy("Bull Flag v1.00", overlay=true) ATR = atr(10) //Average True Range over last 10 bars. upperATR = ohlc4[1] + ATR[1] //Open + High + Low + Close divided by 4, + prior ATR. Just used here for visually plotting the ATR upper channel. lowerATR = ohlc4[1] - ATR[1] //Open + High + Low + Close divided by 4, - prior ATR. Just used here for visually plotting the ATR lower channel. //uncomment these two lines to see ATR channels plot(upperATR, color=color.orange) plot (lowerATR, color=color.orange) //Current close higher than previous close, and current close minus current open is greater than 3 times the previous ATR. "3x ATR" is chosen because any less was not a noticeable distance above the trading range. flagpole1 = close>close[1] and (close-open) > (ATR[1] * 3) plotshape(flagpole1, text="flagpole1", style=shape.arrowdown, size=size.huge) //Plots an arrow for flagpole1 for QA testing //Two consecutive close higer than their previous close, and current close minus PREVIOUS open is greater than 3 times the previous ATR. flagpole2 = close>close[1] and close[1]>close[2] and (close-open[1]) > (ATR[1] * 3) plotshape(flagpole2, text="flagpole2", style=shape.arrowdown, size=size.huge, color=color.yellow) //Plots an arrow for flagpole2 for QA testing //Three consecutive close higer than their previous close, and current close minus open from 2 bars ago is greater than 3 times the previous ATR. flagpole3 = close>close[1] and close[1]>close[2] and close[2]>close[3] and (close-open[2]) > (ATR[1] * 3) plotshape(flagpole3, text="flagpole3", style=shape.arrowdown, size=size.huge, color=color.white) //Plots an arrow for flagpole3 for QA testing //A flagpole can be any of the three definitions of flagpole. flagpole = flagpole1 or flagpole2 or flagpole3 //This will return the number of bars since "flagpole" was true. Not being used, but could be useful. //since_flagpole = barssince(flagpole) after_pole_1 = flagpole[1] //This marks the bar directly after a flagpole. //plotshape(after_pole_1, text="after_pole_1", style=shape.cross, size=size.large, color=color.white) //Plots a cross for after_pole_1 for QA testing after_pole_2 = flagpole[2] //This marks the bar two bars after a flagpole. after_pole_3 = flagpole[3] //This marks the bar three bars after a flagpole. //This returns the price at the "top" of the flagpole (using close price) at the most recent occurence, 0. pole_top = valuewhen(flagpole, close, 0) //plot(pole_top, trackprice=true) //plots a horizontal line at the most recent pole_top //Measures the distance between last pole top and the previous SMA. pole_height = pole_top - sma(close, 10)[1] //plot(pole_height) //This marks 33% below the pole_top, which will be the lowest point a flag can be. flag_bottom = pole_top - (.33 * pole_height) //plot(flag_bottom) //The first, second, and third bars after the pole are considered part of a flag when open and close are between the pole_top and flag_bottom flag1 = after_pole_1 and (open >= flag_bottom) and (open <= pole_top) and (close >= flag_bottom) and (close <= pole_top) //plotshape(flag1, text="flag1", style=shape.flag, size=size.large, color=color.teal) flag2 = after_pole_2 and (open >= flag_bottom) and (open <= pole_top) and (close >= flag_bottom) and (close <= pole_top) //plotshape(flag2, text="flag2", style=shape.flag, size=size.large, color=color.teal) flag3 = after_pole_3 and (open >= flag_bottom) and (open <= pole_top) and (close >= flag_bottom) and (close <= pole_top) //plotshape(flag3, text="flag3", style=shape.flag, size=size.large, color=color.teal) //When all three bars after a flagpole are a flag, the criteria are met and we have a "bull_flag" //Specifically, when current bar is flag3, previous bar is flag2, and 2 bars ago is flag1, we have a bull_flag. bull_flag = flag3 and flag2[1] and flag1[2] plotshape(bull_flag, text="bull_flag", style=shape.flag, size=size.large, color=color.white) //Plots a flag for bull_flag for QA testing if (bull_flag) strategy.entry("Long", strategy.long) if barssince(bull_flag) == 6 //close 6 bars after entry. strategy.close("Long")