Strategi Pelacakan Tren Berdasarkan Moving Average

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

Gambaran umum

Strategi ini mengidentifikasi arah tren saat ini dengan menghitung rata-rata bergerak dari periode yang berbeda dan menghasilkan sinyal perdagangan yang dikombinasikan dengan indikator RSI. Ketika rata-rata bergerak periode pendek melintasi di atas rata-rata bergerak periode panjang, tren tersebut dipertimbangkan dan sinyal beli dihasilkan. Ketika rata-rata bergerak periode pendek melintasi di bawah rata-rata bergerak periode panjang, tren dianggap terbalik dan sinyal jual dihasilkan. Indikator RSI digunakan untuk menghindari sinyal palsu yang disebabkan oleh fluktuasi harga kecil.

Logika Strategi

  1. Hitung rata-rata bergerak sederhana 10 hari, 20 hari, 50 hari, 100 hari dan 200 hari.

  2. Menghitung nilai RSI 14 hari.

  3. Ketika SMA 10 hari melintasi SMA 50 hari, dan RSI lebih besar dari 30, dan SMA 20 hari lebih besar dari atau sama dengan SMA 100 hari atau SMA 50 hari lebih besar dari atau sama dengan SMA 100 hari, beli.

  4. Atur harga stop loss ke harga masuk dikalikan dengan (1 - persentase stop loss).

  5. Jual saat:

    • SMA 10 hari melintasi di bawah SMA 50 hari dan menutup di bawah SMA 20 hari: sinyal jual pembalikan tren
    • Penutupan di bawah 95% dari harga masuk: stop loss jual
    • Close di bawah harga stop loss: trailing stop loss sell

Strategi ini menilai tren pasar dengan menggunakan moving average dan menetapkan stop loss untuk mengendalikan risiko. RSI menyaring breakout palsu. Ini membeli ketika SMA jangka pendek melintasi SMA jangka panjang, menunjukkan tren naik, dan menetapkan garis stop loss untuk mengendalikan risiko selama periode kepemilikan. Ini menjual ketika sinyal pembalikan tren terjadi atau harga stop loss dipicu.

Analisis Keuntungan

  • Menggunakan rata-rata bergerak untuk menentukan arah tren, membeli selama uptrend menghindari perdagangan di pasar yang terikat rentang
  • Menggunakan rata-rata bergerak beberapa periode menghindari tertipu oleh fluktuasi harga jangka pendek
  • Menggabungkan dengan RSI menyaring sinyal palsu
  • Menetapkan kontrol stop loss risiko penurunan untuk setiap perdagangan
  • Menggunakan stop loss trailing untuk mengunci keuntungan

Analisis Risiko

  • Rata-rata bergerak memiliki lag dan mungkin kehilangan waktu terbaik untuk pembalikan harga
  • Stop loss yang diatur terlalu longgar dapat menyebabkan kerugian besar untuk perdagangan tunggal
  • Stop loss yang diatur terlalu ketat dapat menyebabkan pemicu stop loss yang terlalu sering
  • Trailing stop loss mungkin keluar terlalu awal kehilangan keuntungan yang lebih besar

Optimasi dapat dilakukan melalui penyesuaian periode rata-rata bergerak, tingkat stop loss dll. Juga pertimbangkan untuk menggabungkan dengan indikator lain untuk meningkatkan akurasi.

Arahan Optimasi

  • Penyesuaian periode rata-rata bergerak agar sesuai dengan kondisi pasar yang berbeda
  • Mengoptimalkan parameter RSI untuk lebih mengidentifikasi kondisi overbought/oversold
  • Menetapkan tingkat stop loss statis dan trail stop yang wajar berdasarkan karakteristik instrumen
  • Tambahkan indikator lain untuk menghindari sinyal palsu
  • Mengatur stop loss secara dinamis berdasarkan volatilitas dll.
  • Otomatis mengoptimalkan parameter melalui pembelajaran mesin

Ringkasan

Strategi ini memiliki logika yang jelas secara keseluruhan, menggunakan rata-rata bergerak untuk penentuan tren dan mengatur stop loss untuk mengendalikan risiko. Ini adalah strategi pelacakan tren khas. Peningkatan lebih lanjut dapat dicapai melalui penyesuaian parameter dan penambahan indikator lain.


/*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 banyak