Strategi traing stop loss berdasarkan purata bergerak dan aliran super


Tarikh penciptaan: 2023-10-20 16:50:01 Akhirnya diubah suai: 2023-10-20 16:50:01
Salin: 2 Bilangan klik: 727
1
fokus pada
1617
Pengikut

Strategi traing stop loss berdasarkan purata bergerak dan aliran super

Gambaran keseluruhan

Strategi ini menggabungkan penunjuk purata bergerak dan penunjuk supertrend untuk mewujudkan strategi mengikuti trend dengan fungsi berhenti kehilangan. Strategi ini memanfaatkan sepenuhnya keupayaan penilaian trend rata-rata bergerak dan fungsi berhenti kehilangan supertrend, yang dapat mengesan trend dengan berkesan sambil mengawal risiko.

Prinsip Strategi

Strategi ini menggunakan dua garis rata-rata FRAMA untuk menilai isyarat beli dan jual, dan disaring dengan penunjuk super trend.

Khususnya, apabila garis pantas melintasi garis perlahan, ia menghasilkan isyarat beli, dan apabila garis pantas melintasi garis perlahan, ia menghasilkan isyarat jual. Untuk mengelakkan pecah palsu, strategi ini menambah syarat penapisan indikator supertrend, yang hanya akan diperdagangkan apabila indikator supertrend berarah sama.

Dalam pengurusan pegangan, strategi menggunakan perubahan indikator supertrend sebagai isyarat keluar rugi. Apabila indikator supertrend berbalik, keluar rugi dilakukan.

Selain itu, strategi ini juga menyediakan pilihan untuk menjejaki hentian kerugian. Setelah mencapai keuntungan tertentu, anda boleh mengaktifkan hentian kerugian untuk mengunci keuntungan.

Analisis kelebihan

  • Menggunakan purata bergerak untuk menentukan arah trend, dapat menghapuskan bunyi pasaran dengan berkesan dan menentukan trend dengan tepat
  • Penapisan indikator super trend untuk mengelakkan kesilapan perdagangan yang menyebabkan penembusan palsu
  • Pergeseran indikator trend super sebagai titik henti, boleh menghentikan kerugian dengan cepat dan mengawal risiko dengan berkesan
  • Fungsi Stop Loss yang boleh dipilih untuk memaksimumkan keuntungan

Analisis risiko

  • Sebagai strategi trend-following, mudah untuk dipetik apabila trend bergoyang, perlu berhati-hati untuk mengawal saiz kedudukan
  • Kelemahan dalam purata bergerak yang boleh menyebabkan kemasukan terlalu awal atau terlambat
  • Tetapan parameter penunjuk Super Trend yang tidak betul boleh menyebabkan stop loss yang terlalu radikal atau konservatif
  • Mengaktifkan Tracking Stop perlu berhati-hati untuk menetapkan amplitud Tracking yang munasabah, mengelakkan terlalu radikal Stop Loss

Risiko ini boleh dikurangkan dengan menyesuaikan parameter purata bergerak, mengoptimumkan tetapan indikator super trend, dan menggunakan tracking stop loss dengan bijak.

Arah pengoptimuman

Strategi ini boleh dioptimumkan dalam beberapa aspek:

  1. Mengoptimumkan parameter purata bergerak untuk mencari kombinasi parameter terbaik

Kombinasi parameter kitaran yang berbeza boleh diuji untuk mencari keseimbangan terbaik antara kesan halus dan kepekaan.

  1. Tentukan parameter penunjuk trend super

Anda boleh menguji pelbagai kitaran ATR dan parameter perkalian untuk mengoptimumkan hentikan kerugian.

  1. Menambah penapis untuk penunjuk lain

Ujian boleh dilakukan untuk menambah indikator saluran komoditi, indikator kadar turun naik dan lain-lain untuk menapis lebih lanjut.

  1. Optimumkan parameter Tracking Stop Loss

Anda boleh menguji pelbagai stop loss untuk mencari parameter terbaik untuk memaksimumkan keuntungan dan kawalan risiko.

  1. Bersama-sama dengan strategi lain untuk menghentikan kerugian

Ia boleh diuji dalam kombinasi dengan strategi seperti general stop, shock stop, dan stop bergerak.

ringkaskan

Strategi ini mengintegrasikan penghakiman trend dalam purata bergerak dan pengurusan kerugian dalam supertrend, membentuk strategi trend yang lebih lengkap dengan fungsi pengesanan berhenti. Dengan pengoptimuman parameter dan pengurusan risiko, anda dapat meningkatkan lagi kestabilan dan keuntungan strategi. Strategi ini sesuai untuk digunakan oleh peniaga kuantitatif dengan asas tertentu.

Kod sumber strategi
/*backtest
start: 2023-10-01 00:00:00
end: 2023-10-13 00:00:00
period: 30m
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/
// © 03.freeman

//@version=4
// strategy("FRAMA strategy", overlay=true,precision=6, initial_capital=1000,calc_on_every_tick=true, pyramiding=0, default_qty_type=strategy.fixed, default_qty_value=10000, currency=currency.EUR)
ma_src = input(title="MA FRAMA Source", type=input.source, defval=close)
ma_frama_len = input(title="MA FRAMA Length", type=input.integer, defval=12)
res = input(title="Resolution", type=input.resolution, defval="1W")
frama_FC = input(defval=1,minval=1, title="* Fractal Adjusted (FRAMA) Only - FC")
frama_SC = input(defval=200,minval=1, title="* Fractal Adjusted (FRAMA) Only - SC")
High = security(syminfo.tickerid, res, high)
Low = security(syminfo.tickerid, res, low)
source = security(syminfo.tickerid, res, ma_src)
enterRule = input(false,title = "Use supertrend for enter")
exitRule = input(false,title = "Use supertrend for exit")

ma(src, len) =>
    float result = 0
    int len1 = len/2
    e = 2.7182818284590452353602874713527
    w = log(2/(frama_SC+1)) / log(e) // Natural logarithm (ln(2/(SC+1))) workaround
    H1 = highest(High,len1)
    L1 = lowest(Low,len1)
    N1 = (H1-L1)/len1
    H2_ = highest(High,len1)
    H2 = H2_[len1]
    L2_ = lowest(Low,len1)
    L2 = L2_[len1]
    N2 = (H2-L2)/len1
    H3 = highest(High,len)
    L3 = lowest(Low,len)
    N3 = (H3-L3)/len
    dimen1 = (log(N1+N2)-log(N3))/log(2)
    dimen = iff(N1>0 and N2>0 and N3>0,dimen1,nz(dimen1[1]))
    alpha1 = exp(w*(dimen-1))
    oldalpha = alpha1>1?1:(alpha1<0.01?0.01:alpha1)
    oldN = (2-oldalpha)/oldalpha
    N = (((frama_SC-frama_FC)*(oldN-1))/(frama_SC-1))+frama_FC
    alpha_ = 2/(N+1)
    alpha = alpha_<2/(frama_SC+1)?2/(frama_SC+1):(alpha_>1?1:alpha_)
    frama = 0.0
    frama :=(1-alpha)*nz(frama[1]) + alpha*src
    result := frama
    result

frama = ma(sma(source,1),ma_frama_len)
signal = ma(frama,ma_frama_len)
plot(frama, color=color.red)
plot(signal, color=color.green)


longCondition = crossover(frama,signal)
shortCondition = crossunder(frama,signal)

Factor=input(3, minval=1,maxval = 100)
Pd=input(7, minval=1,maxval = 100)


Up=hl2-(Factor*atr(Pd))
Dn=hl2+(Factor*atr(Pd))

TrendUp = 0.0
TrendDown = 0.0
Trend = 0.0
Tsl = 0.0
TrendUp :=close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up
TrendDown :=close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn

Trend := close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1)
Tsl := Trend==1? TrendUp: TrendDown

linecolor = Trend == 1 ? color.green : color.red

//plot(Tsl, color = linecolor , style =  plot.style_line , linewidth = 2,title = "SuperTrend")

plotshape(cross(close,Tsl) and close>Tsl , "Up Arrow", shape.triangleup,location.belowbar,color.green,0,0)
plotshape(cross(Tsl,close) and close<Tsl , "Down Arrow", shape.triangledown , location.abovebar, color.red,0,0)

plotarrow(Trend == 1 and Trend[1] == -1 ? Trend : na, title="Up Entry Arrow", colorup=color.lime, maxheight=60, minheight=50, transp=0)
plotarrow(Trend == -1 and Trend[1] == 1 ? Trend : na, title="Down Entry Arrow", colordown=color.red, maxheight=60, minheight=50, transp=0)


//  Strategy: (Thanks to JayRogers)
// === STRATEGY RELATED INPUTS ===
//tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
// the risk management inputs
inpTakeProfit   = input(defval = 0, title = "Take Profit Points", minval = 0)
inpStopLoss     = input(defval = 0, title = "Stop Loss Points", minval = 0)
inpTrailStop    = input(defval = 0, title = "Trailing Stop Loss Points", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset Points", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

// === STRATEGY - LONG POSITION EXECUTION ===
enterLong() => enterRule? (longCondition and Trend ==1):longCondition                                             // functions can be used to wrap up and work out complex conditions
exitLong() => exitRule and Trend == -1

strategy.entry(id = "Buy", long = true, when = enterLong() )             // use function or simple condition to decide when to get in
strategy.close(id = "Buy", when = exitLong() )                         // ...and when to get out

// === STRATEGY - SHORT POSITION EXECUTION ===
enterShort() => enterRule? (shortCondition and Trend ==-1):shortCondition
exitShort() => exitRule and Trend == 1

strategy.entry(id = "Sell", long = false, when = enterShort())
strategy.close(id = "Sell", when = exitShort() )

// === STRATEGY RISK MANAGEMENT EXECUTION ===
// finally, make use of all the earlier values we got prepped
strategy.exit("Exit Buy", from_entry = "Buy", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Exit Sell", from_entry = "Sell", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)

// === Backtesting Dates === thanks to Trost

testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2020, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testStopHour = input(23, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = true
// === /END

if not isPeriod
    strategy.cancel_all()
    strategy.close_all()