Ini adalah strategi yang menggunakan purata bergerak dan Bollinger Bands untuk penilaian trend, digabungkan dengan penapisan pecah dan prinsip-prinsip stop loss.
Strategi ini terdiri daripada bahagian utama berikut:
Penghakiman trend: Gunakan MACD untuk menilai trend harga dan membezakan trend menaik dan menurun.
Penapisan julat: Gunakan Bollinger Bands untuk menilai julat turun naik harga dan menapis isyarat yang tidak menembusi julat.
Pengesahan purata bergerak berganda: EMA pantas dan EMA perlahan membentuk purata bergerak berganda untuk mengesahkan isyarat trend. Isyarat beli dihasilkan hanya apabila EMA pantas > EMA perlahan.
Mekanisme Stop Loss: Tetapkan titik stop loss. Tutup kedudukan apabila harga menembusi titik stop loss ke arah yang tidak menguntungkan.
Logik untuk isyarat masuk adalah:
Apabila ketiga-tiga syarat dipenuhi pada masa yang sama, isyarat beli dihasilkan.
Terdapat dua jenis kedudukan penutupan, mengambil keuntungan dan berhenti kerugian. titik mengambil keuntungan adalah harga kemasukan dikalikan dengan peratusan tertentu, dan titik berhenti kerugian adalah harga kemasukan dikalikan dengan peratusan tertentu. apabila harga memecahkan mana-mana titik, posisi ditutup.
Kelebihan strategi ini ialah:
Terdapat juga beberapa risiko dalam strategi ini:
Untuk menangani risiko ini, strategi boleh dioptimumkan dengan menyesuaikan parameter, menetapkan kedudukan stop loss, dll.
Strategi ini boleh dioptimumkan dalam aspek berikut:
Dengan menguji tetapan parameter yang berbeza dan menilai pulangan dan nisbah Sharpe, keadaan optimum strategi dapat dijumpai.
Ini adalah strategi kuantitatif yang menggunakan penghakiman trend, penapisan julat, pengesahan purata bergerak berganda dan idea-idea stop loss. Ia dapat menentukan arah trend dengan berkesan dan mencapai keseimbangan antara pemaksiman keuntungan dan kawalan risiko. Melalui pengoptimuman parameter, pembelajaran mesin dan cara lain, strategi mempunyai ruang yang besar untuk peningkatan untuk mencapai hasil yang lebih baik.
/*backtest start: 2022-11-20 00:00:00 end: 2023-11-26 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy(title="Range Filter Buy and Sell Strategies", shorttitle="Range Filter Strategies", overlay=true,pyramiding = 5) // Original Script > @DonovanWall // Adapted Version > @guikroth // // Updated PineScript to version 5 // Republished by > @tvenn // Strategizing by > @RonLeigh ////////////////////////////////////////////////////////////////////////// // Settings for 5min chart, BTCUSDC. For Other coin, change the parameters ////////////////////////////////////////////////////////////////////////// SS = input.bool(false,"Percentage Take Profit Stop Loss") longProfitPerc = input.float(title='LongProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01 shortProfitPerc = input.float(title='ShortProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01 longLossPerc = input.float(title='LongStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01 shortLossPerc = input.float(title='ShortStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01 // Color variables upColor = color.white midColor = #90bff9 downColor = color.blue // Source src = input(defval=close, title="Source") // Sampling Period // Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters per = input.int(defval=100, minval=1, title="Sampling Period") // Range Multiplier mult = input.float(defval=3.0, minval=0.1, title="Range Multiplier") // Smooth Average Range smoothrng(x, t, m) => wper = t * 2 - 1 avrng = ta.ema(math.abs(x - x[1]), t) smoothrng = ta.ema(avrng, wper) * m smoothrng smrng = smoothrng(src, per, mult) // Range Filter rngfilt(x, r) => rngfilt = x rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r : x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r rngfilt filt = rngfilt(src, smrng) // Filter Direction upward = 0.0 upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1]) downward = 0.0 downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1]) // Target Bands hband = filt + smrng lband = filt - smrng // Colors filtcolor = upward > 0 ? upColor : downward > 0 ? downColor : midColor barcolor = src > filt and src > src[1] and upward > 0 ? upColor : src > filt and src < src[1] and upward > 0 ? upColor : src < filt and src < src[1] and downward > 0 ? downColor : src < filt and src > src[1] and downward > 0 ? downColor : midColor filtplot = plot(filt, color=filtcolor, linewidth=2, title="Range Filter") // Target hbandplot = plot(hband, color=color.new(upColor, 70), title="High Target") lbandplot = plot(lband, color=color.new(downColor, 70), title="Low Target") // Fills fill(hbandplot, filtplot, color=color.new(upColor, 90), title="High Target Range") fill(lbandplot, filtplot, color=color.new(downColor, 90), title="Low Target Range") // Bar Color barcolor(barcolor) // Break Outs longCond = bool(na) shortCond = bool(na) longCond := src > filt and src > src[1] and upward > 0 or src > filt and src < src[1] and upward > 0 shortCond := src < filt and src < src[1] and downward > 0 or src < filt and src > src[1] and downward > 0 CondIni = 0 CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1] longCondition = longCond and CondIni[1] == -1 shortCondition = shortCond and CondIni[1] == 1 // alertcondition(longCondition, title="Buy alert on Range Filter", message="Buy alert on Range Filter") // alertcondition(shortCondition, title="Sell alert on Range Filter", message="Sell alert on Range Filter") // alertcondition(longCondition or shortCondition, title="Buy and Sell alert on Range Filter", message="Buy and Sell alert on Range Filter") ////////////// 副 sensitivity = input(150, title='Sensitivity') fastLength = input(20, title='FastEMA Length') slowLength = input(40, title='SlowEMA Length') channelLength = input(20, title='BB Channel Length') multt = input(2.0, title='BB Stdev Multiplier') DEAD_ZONE = nz(ta.rma(ta.tr(true), 100)) * 3.7 calc_macd(source, fastLength, slowLength) => fastMA = ta.ema(source, fastLength) slowMA = ta.ema(source, slowLength) fastMA - slowMA calc_BBUpper(source, length, multt) => basis = ta.sma(source, length) dev = multt * ta.stdev(source, length) basis + dev calc_BBLower(source, length, multt) => basis = ta.sma(source, length) dev = multt * ta.stdev(source, length) basis - dev t1 = (calc_macd(close, fastLength, slowLength) - calc_macd(close[1], fastLength, slowLength)) * sensitivity e1 = calc_BBUpper(close, channelLength, multt) - calc_BBLower(close, channelLength, multt) trendUp = t1 >= 0 ? t1 : 0 trendDown = t1 < 0 ? -1 * t1 : 0 duoad = trendUp > 0 and trendUp > e1 kongad = trendDown > 0 and trendDown > e1 duo = longCondition and duoad kong = shortCondition and kongad //Alerts plotshape(longCondition and trendUp > e1 and trendUp > 0 , title="Buy Signal", text="Buy", textcolor=color.white, style=shape.labelup, size=size.small, location=location.belowbar, color=color.new(#aaaaaa, 20)) plotshape(shortCondition and trendDown > e1 and trendDown > 0 , title="Sell Signal", text="Sell", textcolor=color.white, style=shape.labeldown, size=size.small, location=location.abovebar, color=color.new(downColor, 20)) if longCondition and trendUp > e1 and trendUp > 0 strategy.entry('Long',strategy.long, comment = "buy" ) if shortCondition and trendDown > e1 and trendDown > 0 strategy.entry('Short',strategy.short, comment = "sell" ) longlimtPrice = strategy.position_avg_price * (1 + longProfitPerc) shortlimtPrice = strategy.position_avg_price * (1 - shortProfitPerc) longStopPrice = strategy.position_avg_price * (1 - longLossPerc) shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc) if (strategy.position_size > 0) and SS == true strategy.exit(id="Long",comment_profit = "Profit",comment_loss = "StopLoss", stop=longStopPrice,limit = longlimtPrice) if (strategy.position_size < 0) and SS == true strategy.exit(id="Short",comment_profit = "Profit",comment_loss = "StopLoss", stop=shortStopPrice,limit = shortlimtPrice)