Strategi Mengikuti Tren Rata-rata Pergerakan Seimbang Jangka Panjang-Pendek


Tanggal Pembuatan: 2024-01-18 12:07:52 Akhirnya memodifikasi: 2024-01-18 12:07:52
menyalin: 0 Jumlah klik: 608
1
fokus pada
1617
Pengikut

Strategi Mengikuti Tren Rata-rata Pergerakan Seimbang Jangka Panjang-Pendek

Ringkasan

Strategi ini adalah strategi mengikuti tren rata-rata bergerak sederhana yang berlaku untuk Bitcoin dan Ethereum. Ini menggabungkan beberapa indikator seperti garis rata-rata, MACD, dan RSI untuk mengidentifikasi arah tren, dan melacak tren dengan cara memegang posisi tetap dengan garis panjang.

Prinsip Strategi

Logika inti dari strategi ini adalah ketika 20 hari EMA melintasi 100 hari SMA dan 100 hari SMA melintasi 200 hari SMA; ketika 20 hari EMA melintasi 100 hari SMA di bawah garis Emas. Menggunakan tiga rata-rata bergerak dari periode yang berbeda untuk menentukan arah tren.

Secara khusus, strategi menilai tren dengan menghitung nilai-nilai 20 hari EMA, 100 hari SMA dan 200 hari SMA, dan membandingkan hubungan besar-besaran mereka. Ketika 20 hari EMA melewati 100 hari SMA, yaitu 20 hari EMA lebih besar dari 100 hari SMA, harga mulai naik; Jika 100 hari SMA juga lebih besar dari 200 hari SMA, berarti tren jangka menengah juga naik, yang merupakan sinyal yang lebih kuat.

Setelah memasuki posisi multi-posisi, strategi akan terus memegang posisi dan mengikuti tren. Ketika garis EMA ke-20 kembali menembus garis SMA ke-100 di bawah, yang menunjukkan adanya sinyal pembalikan tren jangka pendek, strategi akan memilih stop loss.

Selain itu, strategi ini juga menggabungkan indikator seperti MACD dan RSI untuk mengkonfirmasi tren. Hanya ketika MACD DIF line, DEMA line dan HIST pilar line naik, dan RSI lebih tinggi dari 50, opsi untuk membuka posisi lebih banyak.

Keunggulan Strategis

Keuntungan terbesar dari strategi ini adalah membuat aturan perdagangan tren yang jelas, yang dapat secara efektif melacak tren garis tengah. Keuntungan spesifiknya adalah sebagai berikut:

  1. Menggunakan multiple moving averages dalam kombinasi dengan trend, lebih dapat diandalkan.
  2. Dengan cara memegang posisi dengan garis panjang, Anda dapat melacak tren dan tidak mudah terganggu oleh pergerakan pasar jangka pendek.
  3. Dalam kombinasi dengan indikator seperti MACD dan RSI untuk konfirmasi sinyal strategi, dapat disaring penipuan.
  4. Aturan yang jelas dan sederhana untuk menentukan tempat masuk dan keluar adalah dengan menggunakan garis EMA dan garis SMA.
  5. Mampu mengontrol risiko secara efektif dengan membatasi kerugian melalui stop loss.

Risiko dan Solusi

Strategi ini juga memiliki beberapa risiko, masalah utamanya adalah tidak dapat berhenti tepat waktu ketika tren berbalik. Risiko dan solusi spesifiknya adalah sebagai berikut:

  1. Tidak dapat melacak titik balik tren tepat waktu: Anda dapat mempersingkat siklus rata-rata, atau menambahkan lebih banyak indikator untuk penilaian komprehensif.

  2. Terlalu lama memegang posisi dapat menyebabkan kerugian yang lebih besar: Anda dapat mengurangi garis keluar dengan tepat, dan menghentikan kerugian tepat waktu.

  3. Indikator garis rata-rata mudah mengalami lag: Anda dapat menambahkan garis stop loss dengan rasio penarikan tertentu, stop loss aktif.

Arah optimasi

Strategi ini juga dapat dioptimalkan dalam beberapa hal:

  1. Uji siklus garis rata-rata dengan kombinasi lebih banyak untuk mencari parameter optimal.

  2. Cobalah indikator atau model lain untuk menilai tren dan waktu masuk. Misalnya, pita Brin, indikator KD, dll.

  3. Parameter optimasi dinamis menggunakan pembelajaran mesin dan lain-lain. Misalnya, penyesuaian stop loss menggunakan pembelajaran penguatan.

  4. Kombinasi dengan volume transaksi untuk menghindari false breakout.

  5. Mengembangkan stop loss otomatis dan sistem tracking stop loss yang dapat menyesuaikan posisi stop loss sesuai dengan kondisi pasar.

Meringkaskan

Strategi ini secara keseluruhan adalah strategi mengikuti tren yang sederhana dan langsung. Ini menggunakan arah tren yang ditentukan oleh rata-rata bergerak, MACD dan sinyal filter RSI. Menggunakan waktu pemegang yang lebih lama untuk melacak tren.

Kode Sumber Strategi
/*backtest
start: 2024-01-16 00:00:00
end: 2024-01-17 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

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

//////////// !!!!!!!!!!!!!!!! WORK BEST IN 2 HOURS for BTC, ETH and ETHXBT !!!!!!!!!!!!!!!!!!! /////////////////////
//280820 - After long esting this is the best script for ETHUSD in 4 hours. From 01/01/2020 til 28/08/2020


[macdLine, macdSignalLine, macdHist] = macd(close, 12, 26, 7)  

//_rsi_len = input(14, title="RSI length")
_rsi_len = 14 
  
NewValue = 0
PreviousValue = 0
leverage = 1

smaPercentageIncrease = 0.0
SMA_PERCENT_INCREASE = 0.0
float atrValue = 0
bool bPositionOpened = false
float stockPositionSize = 0 
float volatilityPercentage = 0.0
bool bDisplayArrow = false 
bool bEMAIsRising = false
bool bSMAIsRising = false
bool bSMASlowIsRising = false
bool bMACDIsRising = false
bool bMACDHistIsRising = false
bool bMACDSignalIsRising = false

float stopLoss = input (5, "StopLoss in %", type=input.float) //StopLoss associated with the order
//Best for alt versus BTC float stopLoss = input (3, "StopLoss in %", type=input.float) //StopLoss associated with the order 
float positionSize = 1000
float currentPrice = close 
float stopLossPrice = 0
float entryPrice = 0


//-----------------------------------------------------------


// === INPUT BACKTEST RANGE ONE YEAR 
//FromDay   = input(defval = 01, title = "From Day", minval = 1, maxval = 31)
//FromMonth = input(defval = 01, title = "From Month", minval = 1, maxval = 12)
//FromYear  = input(defval = 2020, title = "From Year", minval = 2017)
FromDay   = 01
FromMonth = 01
FromYear  = 2020

//ToDay     = input(defval = 01, title = "To Day", minval = 1, maxval = 31)
//ToMonth   = input(defval = 01, title = "To Month", minval = 1, maxval = 12)
//ToYear    = input(defval = 2023, title = "To Year", minval = 2017)
ToDay     = 14
ToMonth   = 05
ToYear    = 2029

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true // create function "within window of time"


//FUNCTION DEFINITIONS
//----------------------
IsRising(data, loopBack) =>
    bIsRising = true
    for n = 1 to loopBack
        if data[n] > data[n-1]
            bIsRising := false
        continue
    bIsRising
    
IsFalling(data, loopBack) =>
    bIsFalling = true
    for n = 1 to loopBack
        if data[n] < data[n-1]
            bIsFalling := false
        continue
    bIsFalling
    
// END OF FUNCTION DEFINITIONS //


emaLength = 20
smaLength = 100
smaSlowLength = 200
 
ema = ema(close, emaLength) 
sma = sma(close, smaLength)
smaSlow = sma(close, smaSlowLength)

plot(sma, color=color.green)
plot(smaSlow, color=color.orange)
plot(ema, color=color.yellow)

//reload previous values
stopLossPrice := na(stopLossPrice[1]) ? 0.0 : stopLossPrice[1]
entryPrice := na(entryPrice[1]) ? 0.0 : entryPrice[1]
bPositionOpened := na(bPositionOpened[1]) ? false : bPositionOpened[1]
positionSize := na(positionSize[1]) ? 1000 : positionSize[1]
stockPositionSize := na(stockPositionSize[1]) ? 0 : stockPositionSize[1]
//leverage := na(leverage[1]) ? 1 : leverage[1]

bEMAIsRising := IsRising(ema, 2) 
bSMAIsRising := IsRising(sma, 3)
bMACDIsRising := IsRising(macdLine, 3)
bMACDHistIsRising := IsRising(macdHist, 1)
bSMASlowIsRising := IsRising(smaSlow, 10)
bMACDSignalIsRising := IsRising(macdSignalLine, 3)


atrValue := atr(14)
volatilityPercentage := (atrValue/currentPrice)*100 //calcute the volatility. Percentage of the actual price

 
if (window()) 
    //Check if we can open a LONG
    if (bPositionOpened == false and bSMASlowIsRising == true and bMACDIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[0] > sma[0] and sma[0] < currentPrice)
        //Enter in short position 
        stockPositionSize := (positionSize*leverage)/currentPrice //Calculate the position size based on the actual price and the position Size (in $) configured.
        
        //calculate exit values
        stopLossPrice := currentPrice*(1-stopLoss/100) 
        strategy.entry("myPosition", strategy.long, qty=stockPositionSize, comment="BUY at " + tostring(currentPrice))
        entryPrice := currentPrice //store the entry price
        bPositionOpened := true  
        bDisplayArrow := true 
        
    if (bPositionOpened == true and (currentPrice <= stopLossPrice or crossunder(ema[1], sma[1])))
        strategy.close("myPosition", comment="" + tostring(currentPrice) ) //Stop
        //uncomment the below line to make the bot investing the full portfolio amount to test compounding effect.
        //positionSize := positionSize + ((stockPositionSize * currentPrice) - (positionSize*leverage)) 
        //reset some flags 
        bPositionOpened := false 
        bDisplayArrow := true 
        entryPrice := 0.0