Strategi Penjualan Beli Dinamis

Penulis:ChaoZhang, Tarikh: 2023-12-26 11:15:31
Tag:

img

Ringkasan

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.

Prinsip Strategi

  1. Mengira penunjuk jumlah beli dan jual dalam jangka masa yang disesuaikan
  • BV: Volume pembelian, disebabkan oleh pembelian pada titik rendah
  • SV: Jumlah jualan, disebabkan oleh jualan pada titik tinggi
  1. Volume pembelian dan jualan proses
  • Lemparan EMA 20 tempoh
  • Membahagikan jumlah pembelian dan jualan yang diproses secara berasingan kepada positif dan negatif
  1. Arah penunjuk hakim
  • Lebih besar daripada 0 adalah bullish, kurang daripada 0 adalah bearish
  1. Menentukan perbezaan digabungkan dengan VWAP mingguan dan Bollinger Bands
  • Harga di atas VWAP dan penunjuk bullish adalah isyarat panjang
  • Harga di bawah VWAP dan penunjuk penurunan adalah isyarat pendek
  1. Pendapatan dinamik mengambil keuntungan dan berhenti kerugian
  • Peratusan set mengambil keuntungan dan henti rugi berdasarkan ATR harian

Kelebihan

  1. Volume membeli dan menjual mencerminkan momentum pasaran sebenar, menangkap potensi tenaga trend
  2. VWAP mingguan menilai arah trend jangka masa yang lebih lama, Bollinger Bands menentukan isyarat pecah
  3. Set ATR dinamik mengambil keuntungan dan menghentikan kerugian, memaksimumkan kunci keuntungan dan mengelakkan overtuning

Risiko

  1. Data pembelian dan jualan jumlah mempunyai kesilapan tertentu, boleh menyebabkan salah menilai
  2. Penghakiman gabungan satu penunjuk cenderung menghasilkan isyarat palsu
  3. Tetapan parameter Bollinger Bands yang tidak betul menyempitkan penembusan yang sah

Arahan pengoptimuman

  1. Mengoptimumkan dengan pelbagai jangka masa membeli dan menjual jumlah penunjuk
  2. Tambah jumlah dagangan dan penunjuk tambahan lain untuk penapisan
  3. Sesuaikan parameter Bollinger Bands secara dinamik untuk meningkatkan kecekapan pecah

Kesimpulan

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



Lebih lanjut