Strategi ini menentukan jangka panjang dan pendek melalui jumlah pembelian dan penjualan jangka masa yang disesuaikan, digabungkan dengan VWAP mingguan dan Bollinger Bands untuk penapisan, untuk merealisasikan penjejakan trend kebarangkalian tinggi.
Strategi ini memanfaatkan sepenuhnya kebolehjangkauan jumlah pembelian dan penjualan, menghasilkan isyarat kebarangkalian tinggi yang dilengkapi dengan VWAP dan Bollinger Bands, sambil mengawal risiko dengan berkesan melalui keuntungan dan stop loss yang dinamik.
/*backtest start: 2022-12-19 00:00:00 end: 2023-12-25 00:00:00 period: 1d basePeriod: 1h 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/ // © original author ceyhun //@ exlux99 update //@version=5 strategy('Buying Selling Volume Strategy', format=format.volume, precision=0, overlay=false) weekly_vwap = request.security(syminfo.tickerid, "W", ta.vwap(hlc3)) vi = false customTimeframe = input.timeframe("60", group="Entry Settings") allow_long = input.bool(true, group="Entry Settings") allow_short = input.bool(false, group="Entry Settings") xVolume = request.security(syminfo.tickerid, customTimeframe, volume) xHigh = request.security(syminfo.tickerid, customTimeframe, high) xLow = request.security(syminfo.tickerid, customTimeframe, low) xClose = request.security(syminfo.tickerid, customTimeframe, close) BV = xHigh == xLow ? 0 : xVolume * (xClose - xLow) / (xHigh - xLow) SV = xHigh == xLow ? 0 : xVolume * (xHigh - xClose) / (xHigh - xLow) vol = xVolume > 0 ? xVolume : 1 TP = BV + SV BPV = BV / TP * vol SPV = SV / TP * vol TPV = BPV + SPV tavol20 = request.security(syminfo.tickerid, customTimeframe, ta.ema(vol, 20)) tabv20= request.security(syminfo.tickerid, customTimeframe, ta.ema(BV, 20)) tasv20= request.security(syminfo.tickerid, customTimeframe, ta.ema(SV, 20)) VN = vol / tavol20 BPN = BV / tabv20 * VN * 100 SPN = SV / tasv20 * VN * 100 TPN = BPN + SPN xbvp = request.security(syminfo.tickerid, customTimeframe,-math.abs(BPV)) xbpn = request.security(syminfo.tickerid, customTimeframe,-math.abs(BPN)) xspv = request.security(syminfo.tickerid, customTimeframe,-math.abs(SPV)) xspn = request.security(syminfo.tickerid, customTimeframe,-math.abs(SPN)) BPc1 = BPV > SPV ? BPV : xbvp BPc2 = BPN > SPN ? BPN : xbpn SPc1 = SPV > BPV ? SPV : xspv SPc2 = SPN > BPN ? SPN : xspn BPcon = vi ? BPc2 : BPc1 SPcon = vi ? SPc2 : SPc1 minus = BPcon + SPcon plot(minus, color = BPcon > SPcon ? color.green : color.red , style=plot.style_columns) length = input.int(20, minval=1, group="Volatility Settings") src = minus//input(close, title="Source") mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev", group="Volatility Settings") xtasma = request.security(syminfo.tickerid, customTimeframe, ta.sma(src, length)) xstdev = request.security(syminfo.tickerid, customTimeframe, ta.stdev(src, length)) basis = xtasma dev = mult * xstdev upper = basis + dev lower = basis - dev plot(basis, "Basis", color=#FF6D00, offset = 0) p1 = plot(upper, "Upper", color=#2962FF, offset = 0) p2 = plot(lower, "Lower", color=#2962FF, offset = 0) fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95)) // Original a longOriginal = minus > upper and BPcon > SPcon and close > weekly_vwap shortOriginal = minus > upper and BPcon < SPcon and close< weekly_vwap high_daily = request.security(syminfo.tickerid, "D", high) low_daily = request.security(syminfo.tickerid, "D", low) close_daily = request.security(syminfo.tickerid, "D", close) true_range = math.max(high_daily - low_daily, math.abs(high_daily - close_daily[1]), math.abs(low_daily - close_daily[1])) atr_range = ta.sma(true_range*100/request.security(syminfo.tickerid, "D", close), 14) ProfitTarget_Percent_long = input.float(100.0, title='TP Multiplier for Long entries ', step=0.5, step=0.5, group='Dynamic Risk Management') Profit_Ticks_long = close + (close * (atr_range * ProfitTarget_Percent_long))/100 LossTarget_Percent_long = input.float(1.0, title='SL Multiplier for Long entries', step=0.5, group='Dynamic Risk Management') Loss_Ticks_long = close - (close * (atr_range * LossTarget_Percent_long ))/100 ProfitTarget_Percent_short = input.float(100.0, title='TP Multiplier for Short entries ', step=0.5, step=0.5, group='Dynamic Risk Management') Profit_Ticks_short = close - (close * (atr_range*ProfitTarget_Percent_short))/100 LossTarget_Percent_short = input.float(5.0, title='SL Multiplier for Short entries', step=0.5, group='Dynamic Risk Management') Loss_Ticks_short = close + (close * (atr_range*LossTarget_Percent_short))/100 var longOpened_original = false var int timeOfBuyLong = na var float tpLong_long_original = na var float slLong_long_original = na long_entryx = longOriginal longEntry_original = long_entryx and not longOpened_original if longEntry_original longOpened_original := true tpLong_long_original := Profit_Ticks_long slLong_long_original := Loss_Ticks_long timeOfBuyLong := time //lowest_low_var_sl := lowest_low tpLong_trigger = longOpened_original[1] and ((close > tpLong_long_original) or (high > tpLong_long_original)) //or high > lowest_low_var_tp slLong_Trigger = longOpened_original[1] and ((close < slLong_long_original) or (low < slLong_long_original)) //or low < lowest_low_var_sl longExitSignal_original = shortOriginal or tpLong_trigger or slLong_Trigger if(longExitSignal_original) longOpened_original := false tpLong_long_original := na slLong_long_original := na if(allow_long) strategy.entry("long", strategy.long, when=longOriginal) strategy.close("long", when= longExitSignal_original) //or shortNew if(allow_short) strategy.entry("short", strategy.short, when=shortOriginal ) strategy.close("short", when= longOriginal) //or shortNew