Strategi dagangan pelarian berasaskan momentum


Tarikh penciptaan: 2024-02-04 10:55:31 Akhirnya diubah suai: 2024-02-04 10:55:31
Salin: 0 Bilangan klik: 689
1
fokus pada
1617
Pengikut

Strategi dagangan pelarian berasaskan momentum

Gambaran keseluruhan

Strategi ini adalah strategi perdagangan pecah berdasarkan indikator momentum. Ia menggunakan beberapa indikator untuk menilai trend dan turun naik pasaran, seperti garis rata-rata, ATR, RSI, dan lain-lain, digabungkan dengan tetapan stop loss yang ketat untuk berdagang.

Prinsip Strategi

Strategi ini berdasarkan kepada beberapa perkara:

  1. Menggunakan garis rata-rata EMA untuk menentukan arah trend harga. Harga di atas garis rata-rata sebagai isyarat bullish dan di bawah sebagai isyarat bearish.

  2. Indeks ATR menilai kadar turun naik pasaran. ATR dikalikan dengan satu faktor sebagai had berhenti. Ini dapat mengawal kerugian tunggal dengan berkesan.

  3. Indeks RSI menilai overbought dan oversold. Penembusan perdagangan yang ditentukan oleh harga henti ATR dan penilaian garis rata mesti dicetuskan dengan RSI yang tidak melebihi harga beli dan jual. Ini dapat mengelakkan penembusan palsu.

  4. Menggunakan tahap tinggi atau rendah awal sebagai dasar untuk berhenti. Mengesan harga berhenti dapat mengunci lebih banyak keuntungan.

  5. Peraturan Stop Loss yang ketat. ATR Stop Loss yang digabungkan dengan indikator kadar turun naik dapat mengawal risiko, dan tetapan Stop Loss dapat mengunci keuntungan.

Isyarat masuk ialah harga menembusi garis purata ditambah dengan kawasan stop loss ATR. Jika isyarat bullish, maka harga perlu naik melalui titik tinggi; jika isyarat bearish, maka harga perlu menembusi titik rendah.

Analisis kelebihan

Strategi ini mempunyai kelebihan berikut:

  1. Penghakiman berbilang indikator dapat mengelakkan penembusan palsu dan meningkatkan ketepatan isyarat

  2. Tetapan Julat Kerosakan ATR untuk mengawal kerosakan pada tahap yang wajar

  3. Tracking Stop Stop Dinamis Untuk Maksimkan Keuntungan

  4. Peraturan Stop Loss yang ketat membantu mengawal risiko

  5. Indikator dan parameter mempunyai ruang yang luas untuk dioptimumkan dan boleh disesuaikan dengan pasaran yang berbeza

Analisis risiko

Strategi ini juga mempunyai risiko:

  1. Keupayaan keuntungan berkaitan dengan kadar turun naik pasaran. Apabila trend pasaran tidak jelas atau kitaran yang panjang, ruang keuntungan terhad.

  2. Keadaan yang mungkin berlaku apabila harga stop loss bergolak dan kemudian pecah lagi. Ini akan menyebabkan ketidakupayaan untuk menjejaki trend dalam masa yang tepat.

  3. chasing。

Arah pengoptimuman

Strategi ini boleh dioptimumkan dalam beberapa aspek:

  1. Parameter garis rata-rata, parameter ATR, dan lain-lain disesuaikan mengikut varieti dan kitaran.

  2. Lebih banyak penunjuk penilaian boleh diperkenalkan, seperti MACD, KDJ dan lain-lain.

  3. Koefisien hentian boleh disesuaikan secara langsung mengikut nilai ATR. Hentian lebih sesuai dengan turun naik pasaran.

  4. Menubuhkan gabungan pelbagai tempoh masa. Gabungan indikator tempoh yang berbeza dapat meningkatkan kualiti isyarat.

  5. Menggunakan teknologi pembelajaran mesin untuk menguji dan mengoptimumkan parameter dan parameter untuk mencapai parameter strategi yang optimum.

ringkaskan

Strategi ini secara keseluruhan adalah strategi perdagangan pecah yang menggunakan petunjuk untuk membuat keputusan, menghentikan penangguhan kerugian yang ketat. Ia memanfaatkan kelebihan indikator seperti garis rata, ATR dan RSI dengan berkesan, dapat menentukan arah trend pasaran dengan berkesan.

Kod sumber strategi
/*backtest
start: 2024-01-27 00:00:00
end: 2024-02-03 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="UT Bot Strategy", overlay = true)
//CREDITS to HPotter for the orginal code. The guy trying to sell this as his own is a scammer lol. 
// Inputs
emaLengh = input(2, title = "emaLengh")
a = input(3.0,     title = "Key Vaule. 'This changes the sensitivity'")
c = input(10,    title = "ATR Period")
h = input(false, title = "Signals from Heikin Ashi Candles")
emaLengh2 = input(9, title = "emaLengh show")




rate = input(0.00025,    title = "波动率min")
rateMax = input(0.00045,    title = "波动率max")
adx_length =   input(20,    title = "adx_length")
adx_min =   input(14,    title = "adx_min")

sma_length =   input(11,    title = "sma_length")
rsi_len = input(9, title = "rsi_len")

src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, close, lookahead = false) : close

// boll 通道----------------------------------------------------
length = input(20, minval=1)
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
bbr = (src - lower)/(upper - lower)
// plot(upper, color = color.rgb(46, 59, 240), title="upper")
// plot(lower, color = color.rgb(46, 59, 240), title="lower")


// plot(bbr, "Bollinger Bands %B", color=#26A69A)
// band1 = hline(1, "Overbought", color=#787B86, linestyle=hline.style_dashed)
// hline(0.5, "Middle Band", color=color.new(#787B86, 50))
// band0 = hline(0, "Oversold", color=#787B86, linestyle=hline.style_dashed)
// fill(band1, band0, color=color.rgb(38, 166, 154, 90), title="Background")
// boll 通道----------------------------------------------------

// 线性回归 --------------------------------------------------------------
zlsma_length = input(title="zlsma-Length", type=input.integer, defval=50)
zlsma_offset = input(title="zlsma-Offset", type=input.integer, defval=0)
lsma = linreg(src, zlsma_length, zlsma_offset)
lsma2 = linreg(lsma, zlsma_length, zlsma_offset)
eq= lsma-lsma2
zlsma = lsma+eq
// plot(zlsma , color = color.rgb(243, 243, 14), title="zlsma",linewidth=3)
// 线性回归 --------------------------------------------------------------



// --------------------------------
rsi = rsi(src, 6)

// xHH = sma(high, sma_length)
// xLL = sma(low, sma_length)
// movevalue = (xHH - xLL) / 2
// xHHM = xHH + movevalue
// xLLM = xLL - movevalue

// plot(xHHM, color = color.rgb(208, 120, 219), title="xHHM")
// plot(xLLM, color = color.rgb(208, 120, 219), title="xLLM")


xATR  = atr(c)
nLoss = a * xATR



xATRTrailingStop = 0.0
xATRTrailingStop := iff(src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), src - nLoss),
   iff(src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), src + nLoss), 
   iff(src > nz(xATRTrailingStop[1], 0), src - nLoss, src + nLoss)))


 
pos = 0   
pos :=	iff(src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0), 1,
   iff(src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0))) 
   
xcolor = pos == -1 ? color.red: pos == 1 ? color.green : color.blue 

ema   = ema(src,emaLengh)
// sma   = sma(src,emaLengh)
emaFast   = ema(src,100)
emaSlow   = ema(src,576)
emaShow   = ema(src, emaLengh2)
// sma       =  sma(src, 8)

// [superTrend, dir] = supertrend(3, 200) 
// 判断连续涨

[diplus, diminus, adx] = dmi(adx_length, adx_length)


above = crossover(ema, xATRTrailingStop)
below = crossover(xATRTrailingStop, ema)
// above = ema == xATRTrailingStop
// below = xATRTrailingStop== ema

// smaabove = crossover(src, sma)
// smabelow = crossover(sma, src)
// smaabove = src > sma
// smabelow = sma > src
close_rate (n)=>
    abs(close[n]-open[n])/min(close[n],open[n])

rate_val = close_rate(0)
rate_val1 = close_rate(1)

buy  = src > xATRTrailingStop and above  and src > zlsma  and adx >adx_min
// and  src>emaShow
// and rate_val < rate_val1*2 and rate_val >=rate_val1
// and rate_val1<rateMax
// and close[1]>open[1] 
sell = src < xATRTrailingStop and below  and src < zlsma and adx >adx_min
// and  src<emaShow
// and rate_val < rate_val1*2  and rate_val >=rate_val1
//  and rate_val1<rateMax
// and open[1]>close[1]  and rate_val1 > rate  

// buy  = src > xATRTrailingStop 
// sell = src < xATRTrailingStop 
// plot(rate_val1 , color = color.red, title="rate_val1")



barbuy  = src > xATRTrailingStop 
barsell = src < xATRTrailingStop

atrRsi = rsi(xATRTrailingStop,rsi_len)

// plot(emaFast , color = color.rgb(243, 206, 127), title="emaFast")
// plot(ema , color = color.rgb(47, 227, 27), title="ut-ema")



// plot(emaShow , color = color.rgb(47, 227, 27), title="ema9")

plot(xATRTrailingStop, color = color.rgb(233, 233, 232), title="xATRTrailingStop")

plotshape(buy,  title = "Buy",  text = 'Buy',  style = shape.labelup,   location = location.belowbar, color= color.green, textcolor = color.white, size = size.tiny)
plotshape(sell, title = "Sell", text = 'Sell', style = shape.labeldown, location = location.abovebar, color= color.red,   textcolor = color.white, size = size.tiny)


// plotshape(buy,  title = "Sell",  text = 'Sell',  style = shape.labelup,   location = location.belowbar, color= color.green, textcolor = color.white, transp = 0, size = size.tiny)
// plotshape(sell, title = "buy", text = 'buy', style = shape.labeldown, location = location.abovebar, color= color.red,   textcolor = color.white, transp = 0, size = size.tiny)

// barcolor(barbuy  ? color.green : na)
// barcolor(barsell ? color.red   : na)

// strategy.entry("short",   false, when = buy)
// strategy.entry("long ", true, when = sell)


strategy.entry("long",   true, when = buy and strategy.position_size == 0)
strategy.entry("short", false, when = sell and strategy.position_size == 0)


//动态止盈start------------------------------------------------------------------------------------------
profit = input( 0.015,     title = "最小收益率")
close_profit_rate = input( 10,     title = "平仓收益回撤比")
loss = input(0.004,    title = "回撤率")

// 收益回撤比例
profit_price_scale =profit/close_profit_rate

var float profit_price = 0


// 计算小收益价格

get_profit_price(long) =>
    float res = 0
    if long == true
        res := strategy.position_avg_price * (1+profit)
    if long == false
        res := strategy.position_avg_price * (1-profit)
    res

// 止盈平仓条件
close_profit_position(long)=>
    bool result=false
    if long == true and profit_price>0 and profit_price*(1-profit_price_scale) >=close and  get_profit_price(true) <= close 
        result:=true
    if long == false and profit_price>0 and profit_price*(1+profit_price_scale) <=close and  get_profit_price(false) >= close 
        result:=true
    result

// 更新动态止盈价格
update_profit_price(price)=>
    float res = price
   // 无仓位时 动态止盈价格为0
    if strategy.position_size == 0 
        res := 0
   // long - 价格大于最小收益时保存
    if strategy.position_size > 0 and get_profit_price(true) <= close and (res==0 or res < close)
        res := close
   // short - 价格小于最小收益时保存
    if strategy.position_size < 0 and get_profit_price(true) >= close and (res==0 or res > close)
        res := close
    res
   
///////



profit_price := update_profit_price(profit_price)
long_close_profit_position = close_profit_position(true)
short_close_profit_position = close_profit_position(false)

// plot(profit_price, color = color.green, title="profit_price")
//动态止盈end------------------------------------------------------------------------------------------




strategy.close("long",comment="long-止盈",when = strategy.position_size > 0 and long_close_profit_position)

strategy.close("long",comment="long-止损",when = strategy.position_size >0 and strategy.position_avg_price * (1-loss) >= close)

strategy.close("short",comment="short-止盈",when = strategy.position_size <0 and short_close_profit_position)

strategy.close("short",comment="short-止损",when = strategy.position_size <0 and strategy.position_avg_price * (1+loss) <= close)