Strategi Pengesanan Trend Berdasarkan Purata Bergerak

Penulis:ChaoZhang, Tarikh: 2023-10-07 15:04:00
Tag:

Ringkasan

Strategi ini mengenal pasti arah trend semasa dengan mengira purata bergerak dari tempoh yang berbeza dan menghasilkan isyarat perdagangan yang digabungkan dengan penunjuk RSI. Apabila purata bergerak tempoh pendek melintasi di atas purata bergerak tempoh panjang, trend itu dianggap dan isyarat beli dihasilkan. Apabila purata bergerak tempoh pendek melintasi di bawah purata bergerak tempoh panjang, trend dianggap terbalik dan isyarat jual dihasilkan.

Logika Strategi

  1. Mengira purata bergerak mudah 10, 20, 50, 100 dan 200 hari.

  2. Mengira nilai RSI 14 hari.

  3. Apabila SMA 10 hari melintasi di atas SMA 50 hari, dan RSI lebih besar daripada 30, dan SMA 20 hari lebih besar daripada atau sama dengan SMA 100 hari atau SMA 50 hari lebih besar daripada atau sama dengan SMA 100 hari, beli.

  4. Tetapkan harga stop loss kepada harga masuk dikalikan dengan (1 - peratusan stop loss).

  5. Jual apabila:

    • SMA 10 hari melintasi di bawah SMA 50 hari dan ditutup di bawah SMA 20 hari: isyarat jual pembalikan trend
    • Penutupan di bawah 95% daripada harga masuk: jual stop loss
    • Penutupan di bawah harga stop loss: jual stop loss

Strategi ini menilai trend pasaran menggunakan purata bergerak dan menetapkan stop loss untuk mengawal risiko. RSI menapis pecah palsu. Ia membeli apabila SMA jangka pendek melintasi di atas SMA jangka panjang, menunjukkan aliran naik, dan menetapkan garis stop loss untuk mengawal risiko semasa tempoh pegangan. Ia menjual apabila isyarat pembalikan trend berlaku atau harga stop loss dicetuskan.

Analisis Kelebihan

  • Menggunakan purata bergerak untuk menentukan arah trend, membeli semasa uptrend mengelakkan perdagangan di pasaran yang terikat julat
  • Menggunakan purata bergerak beberapa tempoh mengelakkan ditipu oleh turun naik harga jangka pendek
  • Menggabungkan dengan RSI menapis isyarat palsu
  • Menetapkan kawalan stop loss untuk risiko penurunan untuk setiap perdagangan
  • Menggunakan Stop Loss untuk mengunci keuntungan

Analisis Risiko

  • Purata bergerak mempunyai kelewatan dan mungkin terlepas masa terbaik untuk pembalikan harga
  • Stop loss yang ditetapkan terlalu longgar boleh membawa kepada kerugian besar untuk perdagangan tunggal
  • Stop loss yang ditetapkan terlalu ketat boleh menyebabkan pemicu stop loss yang terlalu kerap
  • Penghentian kerugian boleh keluar terlalu awal kehilangan keuntungan yang lebih besar

Pengoptimuman boleh dilakukan melalui penyesuaian tempoh purata bergerak, paras stop loss dan lain-lain. Juga pertimbangkan untuk menggabungkan dengan penunjuk lain untuk meningkatkan ketepatan.

Arahan pengoptimuman

  • Penyesuaian tempoh purata bergerak untuk menyesuaikan dengan keadaan pasaran yang berbeza
  • Mengoptimumkan parameter RSI untuk mengenal pasti keadaan overbought/oversold dengan lebih baik
  • Tetapkan tahap kehilangan hentian statik dan hentian jejak yang munasabah berdasarkan ciri instrumen
  • Tambah penunjuk lain untuk mengelakkan isyarat palsu
  • Sesuai secara dinamik stop loss berdasarkan turun naik dll
  • Mengoptimumkan parameter secara automatik melalui pembelajaran mesin

Ringkasan

Strategi ini mempunyai logika yang jelas secara keseluruhan, menggunakan purata bergerak untuk penentuan trend dan menetapkan stop loss untuk mengawal risiko. Ini adalah strategi penjejakan trend biasa. Penambahbaikan lanjut dapat dicapai melalui penyesuaian parameter dan penambahan penunjuk lain. Tetapi tidak ada strategi yang sempurna, penyesuaian dan pengoptimuman berterusan diperlukan untuk mengatasi ketidakpastian pasaran, bersama dengan pengurusan risiko yang betul.


/*backtest
start: 2022-09-30 00:00:00
end: 2023-10-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("MA_Script", overlay=true)

// STEP 1:
// Configure trail stop level with input options (optional)
longTrailPerc=input(title="Trail Long Loss (%)", type=input.float, minval=0.0, step=0.05, defval=0.1)

// Configure backtest start date with inputs
startDate=input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31)
startMonth=input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
startYear=input(title="Start Year", type=input.integer, defval=2020, minval=1800, maxval=2100)

// See if this bar's time happened on/after start date
afterStartDate=(time >=timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0))

// Calculate Relative Strength Index
rsiValue=rsi(close, 14)

// Calculate moving averages
MA10_Val =sma(close, 10)
//plot(MA10_Val, color=color.yellow, linewidth=1)

MA20_Val =sma(close, 20)
plot(MA20_Val, color=color.green, linewidth=1)

MA50_Val =sma(close, 50)
plot(MA50_Val, color=color.red, linewidth=1)

MA100_Val =sma(close, 100)
plot(MA100_Val, color=color.blue, linewidth=1) 

MA200_Val =sma(close, 200)
plot(MA200_Val, color=color.purple, linewidth=1) 

// Calculate candlestick
C_BodyHi = max(close, open)
C_BodyLo = min(close, open)
C_Body = C_BodyHi - C_BodyLo
C_UpShadow = high - C_BodyHi
C_DnShadow = C_BodyLo - low

// STEP 2:
// Calculate entry trading conditions
buyCondition_1=crossover(MA10_Val, MA50_Val) and (rsiValue > 30) and ((MA20_Val >=  MA100_Val) or (MA50_Val >=  MA100_Val))
avg_price = (close + open)/2

// First Entry
if (afterStartDate)
    strategy.entry(id="Entry_Trade_1", long=true, limit=avg_price, when=buyCondition_1)

plotchar(afterStartDate and crossover(MA10_Val, MA50_Val), textcolor = color.blue, text = 'MA\n')

// Determine trail stop loss prices
longStopPrice=0.0

longStopPrice :=if (strategy.position_size > 0)
    stopValue=C_BodyHi * (1 - longTrailPerc)
    max(stopValue, longStopPrice[1])
else
    0
plot(longStopPrice, color=color.orange, linewidth=1)

bought_1=strategy.position_size[0] > strategy.position_size[1]
entry_Point_1=valuewhen(bought_1, avg_price, 0)

// STEP 3:
// Calculate exit trading conditions
sellCondition_2=crossunder(MA10_Val, MA50_Val) and (close < MA20_Val)
sellCondition_3_temp=valuewhen((C_BodyHi >= entry_Point_1*1.2), 1, 0)
sellCondition_1=(entry_Point_1*0.95 > close) and (sellCondition_3_temp != 1)
sellCondition_3=(sellCondition_3_temp == 1) and (strategy.position_size > 0) and close <= longStopPrice
plotchar((sellCondition_3 == 1) and (strategy.position_size > 0) and close <= longStopPrice, textcolor = color.red, text = 'TS\n', show_last = 11)
plotchar(crossunder(MA10_Val, MA50_Val), textcolor = color.red, text = 'MA\n')

id_val = ""
stop_val = close
condition = false

if sellCondition_1
    id_val := "Exit By Stop Loss At 7%"
    stop_val := entry_Point_1*0.93
    condition := true
else if sellCondition_2
    id_val := "Exit By Take Profit based on MA"
    stop_val := close
    condition := true
else if sellCondition_3
    id_val := "Exit By Trailing Stop"
    stop_val := longStopPrice
    condition := true

// Submit exit orders for trail stop loss price
if (strategy.position_size > 0)
    //strategy.exit(id="Exit By Stop Loss At 7%", from_entry="Entry_Trade_1", stop=entry_Point_1*0.93, when=sellCondition_1)
    //strategy.exit(id="Exit By Take Profit based on MA", from_entry="Entry_Trade_1", stop=close, when=sellCondition_2)
    strategy.exit(id=id_val, from_entry="Entry_Trade_1", stop=stop_val, when=condition)
    
    


Lebih lanjut