Strategi Kuantitatif Pesanan Pembalikan ATR Zon Momentum


Tarikh penciptaan: 2023-11-24 15:55:36 Akhirnya diubah suai: 2023-11-24 15:55:36
Salin: 0 Bilangan klik: 646
1
fokus pada
1617
Pengikut

Strategi Kuantitatif Pesanan Pembalikan ATR Zon Momentum

Gambaran keseluruhan

Idea utama strategi ini adalah menggabungkan kawasan tenaga bergerak dan penunjuk ATR, melakukan lebih banyak apabila terdapat garpu emas, dan kosong apabila terdapat garpu mati. Pada masa yang sama, menetapkan harga berhenti dan berhenti. Apabila harga muncul isyarat pembalikan, ia akan membuka kedudukan terbalik, untuk mencapai fungsi pesanan pembalikan.

Prinsip

  1. Menggunakan EMA pantas dan EMA perlahan untuk mengira isyarat kosong. EMA pantas lebih tinggi daripada EMA perlahan adalah bullish, sebaliknya adalah bearish.
  2. Apabila tidak ada kedudukan, jika terdapat garpu emas, anda akan melakukan lebih banyak, jika terdapat garpu mati, anda akan kosong.
  3. Apabila kedudukan telah dibuka, jika terdapat isyarat pembalikan, kedudukan semasa akan dihapuskan terlebih dahulu, dan kemudian kedudukan baru akan dibuka ke arah yang berlawanan.
  4. Menggunakan indikator ATR untuk mengira harga hentian dan hentian. Harga hentian akan disesuaikan dengan saluran ATR untuk memastikan risiko hentian kecil.
  5. Apabila harga memasuki kawasan overbuying dan overselling, harga stop loss akan disesuaikan dengan harga tertinggi atau terendah pada garis K terakhir, untuk mengelakkan penarikan.

Kelebihan

  1. Gabungan zon tenaga dinamik dan ATR, dapat membuka kedudukan dalam trend, dan dapat menghentikan dan menghentikan kerugian secara berkala.
  2. Mempunyai fungsi pesanan terbalik yang membolehkan anda menukar arah dengan cepat apabila harga berbalik, memanfaatkan fluktuasi harga dua arah untuk mendapatkan keuntungan yang lebih tinggi.
  3. Mekanisme Hentikan Kerosakan ATR dapat mengawal risiko Hentikan Kerosakan secara berkesan, mencapai kadar kemenangan yang tinggi secara keseluruhan.
  4. Di samping itu, ia juga boleh membantu untuk mengelakkan kejadian yang tidak disangka-sangka.

Risiko dan penyelesaian

  1. Pesanan reverse boleh terlalu kerap diperdagangkan dalam keadaan yang tidak menentu, meningkatkan kos perdagangan dan peluang untuk menghentikan kerugian.
    • Penyelesaian: Meningkatkan tempoh pegangan minimum dan mengurangkan reversal dalam keadaan goyah.
  2. Perubahan nilai ATR boleh menyebabkan terhad terlalu besar atau terlalu kecil.
    • Penyelesaian: Sesuaikan jarak stop loss mengikut nilai ATR dalam masa nyata.
  3. Tetapan parameter yang tidak betul boleh menyebabkan frekuensi dagangan yang terlalu tinggi atau kesan isyarat yang tidak baik.
    • Penyelesaian: Kombinasi parameter pilihan yang munasabah berdasarkan pelbagai jenis.

Arah pengoptimuman

  1. Mengoptimumkan parameter untuk mencari kombinasi parameter yang terbaik.
  2. Menambah penapisan penunjuk teknologi tambahan untuk meningkatkan kualiti isyarat.
  3. Menambah modul pengurusan wang untuk menghubungkan kedudukan dengan jumlah aset akaun.
  4. Menambah analisis jangka masa, menggunakan lebih banyak maklumat untuk meningkatkan kesan strategi.

ringkaskan

Strategi ini mengintegrasikan kelebihan zon tenaga aktif dan indikator ATR, untuk mencapai perdagangan dua hala yang cekap. Mekanisme pembalikan pesanan dan penutupan pintar ATR, dapat memanfaatkan sepenuhnya turun naik harga. Tetapan parameter yang dioptimumkan dan gabungan lebih banyak indikator dapat meningkatkan lagi keberkesanan strategi.

Kod sumber strategi
/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 00:00:00
period: 1h
basePeriod: 15m
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/
// © fenirlix

//@version=5
// Strategy parameter incl. position size, commission and initial capital
strategy("ACTIONZONE-ATR REVERSEORDER STRATEGY", "ACTIONZONEATR-REVERSEORDER", overlay=true
     )

// User Input Variable
fastMaInput     = input.int(12, "Fast MA Period", minval=2, step=1)
slowMaInput     = input.int(26, "Fast MA Period", minval=2, step=1)

atrLengthInput  = input.int(14, "ATR length", minval=2,step=1)
atrInnerMultInput = input.float(1, "atr inner multiplier", minval=0.1, step=0.1)
atrMidMultInput = input.float(2, "atr inner multiplier", minval=0.1, step=0.1) //***** MOST OF RISK MANAGEMENT LOGIC BASE ON THIS INPUT *****//
atrOuterMultInput = input.float(3, "atr inner multiplier", minval=0.1, step=0.1)

// Backtesting Date range
startYearInput      = input.int(2021, "Start Year", minval=1900, maxval=2100, step=1)
startMonthInput     = input.int(12, "Start Month", minval=1, maxval=12, step=1)
startDateInput      = input.int(1, "Start Day", minval=1, maxval=31, step=1)
setEndRangeInput    = input.bool(false, "Using Specific End Test Date") //Set specific End date or use present(end of candle) data
endYearInput        = input.int(2022, "End Year", minval=1900, maxval=2100, step=1)
endMonthInput       = input.int(1, "End Month", minval=1, maxval=12, step=1)
endDateInput        = input.int(31, "End Day", minval=1, maxval=31, step=1)

startDate = timestamp(syminfo.timezone, startYearInput, startMonthInput, startDateInput)
endDate = timestamp(syminfo.timezone, endYearInput, endMonthInput, endDateInput)
inDateRange = time >= startDate //Set backtest date range to present data
if setEndRangeInput
    inDateRange and time <= endDate //set backtest date range to specific date

// minimum position hold period (to get rid of false signal in sideway trend)
minHoldInput = input.int(8, 'Minimum position Hold Limit', minval=1, maxval=365, step=1) // Set Minimum Position Hold

var bool reverseToLong = false // Assign reverse order operator
var bool reverseToShort = false // Assign reverse order operator

// Indicator Declaration
fastEma = ta.ema(close, fastMaInput)
slowEma = ta.ema(close, slowMaInput)
atr = ta.atr(atrLengthInput)

// Declare trend of asset
isBullish = fastEma > slowEma
isBearish = fastEma <= slowEma

// Record position hold length, to limit minimum hold period(candle)
var int hold_length = 0
if strategy.opentrades > 0 or strategy.opentrades < 0
    hold_length := hold_length + 1
else
    hold_length := 0

// create permanent variable of stop price
var float longStopPrice = na
var float shortStopPrice = na
    
// Chart-Indicator COLOR declaration
REDBEAR     = color.new(color.red, 80)
GREENBULL   = color.new(color.green, 80)

greenLong = isBullish and close > fastEma
yellowLong = isBullish and close < fastEma
blueShort = isBearish and close > fastEma
redShort = isBearish and close < fastEma

// assign oversold, overbought condition(in this case, price over middle atr plus/minus fastEma)
overBand = high[1] > fastEma + (2*atr)
underBand = low[1] < fastEma - (2*atr)

// Strategy

// Main Entry Condition
goLong = isBullish and isBullish[1] == 0
goShort = isBearish and isBearish[1] == 0

inPosition = strategy.position_size != 0
minHoldPeriod = hold_length > minHoldInput ? true : false

// Entry Condition
if not inPosition and inDateRange and barstate.isconfirmed == true //compute after close of the bar to avoid repainting
    if goLong or reverseToLong // Long if longcondition or reverse order receive.
        strategy.entry('long', strategy.long)
        longStopPrice := fastEma - (atr * 2) // Set stop loss price
        reverseToLong := false // Reset reverse order status
    
    else if goShort or reverseToShort
        strategy.entry('short', strategy.short)
        shortStopPrice := fastEma + (atr * 2)
        reverseToShort := false
// Take profit and Set Higher Stop 
if inPosition and minHoldPeriod and barstate.isconfirmed == true // check if we're in position and pass minimum hold period, confirm no repainting
    if strategy.position_size > 0
        // if exit position by Sellcondition(which is the same as ShortCondition), Exit Long position and make Short order(by set reverse order to true)
        strategy.close('long', when=goShort, comment='exitLong(' + str.tostring(hold_length) + ')')
        reverseToShort := true
        if overBand //If overbought condition met, set Stop price to LAST LOW, and not reverse any position
            longStopPrice := low[1]
            reverseToShort := false
    else if strategy.position_size < 0
        strategy.close('short', when=goLong, comment='exitShort(' + str.tostring(hold_length) + ')')
        reverseToLong := true
        if underBand
            shortStopPrice := high[1]
            reverseToLong := false
// Stop Loss and Set calculate stop loss using Atr Channel
if inPosition 
    if strategy.position_size > 0
        if fastEma - (atr * atrMidMultInput) > longStopPrice // set long stop price to the higher of latest long stop price and ATR lower channel
            longStopPrice := fastEma - (atr * atrMidMultInput)
        strategy.exit('Long Stop atr ', 'long', stop=longStopPrice)
    else if strategy.position_size < 0
        if fastEma + (atr * atrMidMultInput) < shortStopPrice
            shortStopPrice := fastEma + (atr * atrMidMultInput)
        strategy.exit('Short Stop atr ', 'short', stop=shortStopPrice)

// Plotting
fastLine = plot(fastEma, title='fast ema line', linewidth=1, color=isBullish ? color.green : color.red)
slowLine = plot(slowEma, title='slow ema line', linewidth=2, color= isBullish? color.green : color.red)
atrUpperLine1 = plot(fastEma + (atr * atrInnerMultInput), title='ATR Upperline1', color=color.new(color.black,85))
atrLowerLine1 = plot(fastEma - (atr * atrInnerMultInput), title='ATR Lowerline1', color=color.new(color.black,85))
atrUpperLine2 = plot(fastEma + (atr * atrMidMultInput), title='ATR Upperline2', color=color.new(color.black,75))
atrLowerLine2 = plot(fastEma - (atr * atrMidMultInput), title='ATR Lowerline2', color=color.new(color.black,75))
atrUpperLine3 = plot(fastEma + (atr * atrOuterMultInput), title='ATR Upperline3', color=color.new(color.black,50))
atrLowerLine3 = plot(fastEma - (atr * atrOuterMultInput), title='ATR Lowerline3', color=color.new(color.black,50))

plot(longStopPrice, color=strategy.position_size > 0 ? color.red : na, linewidth=2)
plot(shortStopPrice, color=strategy.position_size < 0 ? color.red : na, linewidth=2)

//  Filling
fill(fastLine, slowLine, color=isBullish ? GREENBULL : REDBEAR)
fill(atrUpperLine3, atrLowerLine3, color=inPosition and (minHoldInput - hold_length > 0) ? color.new(color.blue,90): na)

barColor = switch
    greenLong => color.green
    yellowLong =>  color.yellow
    blueShort => color.blue
    redShort => color.red
    => color.black
barcolor(color=barColor)

// Fill background to distinguish inactive time(Zulu time)
nightTime = time(timeframe.period, "1500-0100") ? color.new(color.black, 95): na
bgcolor(nightTime)