Эта стратегия определяет длинный и короткий объем покупки и продажи с помощью индивидуальных временных рамок, в сочетании с еженедельным VWAP и полосами Боллинджера для фильтрации, чтобы реализовать отслеживание тренда с высокой вероятностью.
Эта стратегия в полной мере использует предсказуемость объема покупок и продаж, генерируя высоковероятные сигналы, дополненные VWAP и полосами Боллинджера, одновременно эффективно контролируя риск с помощью динамического получения прибыли и остановки убытков.
/*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