Trend Rata-rata Bergerak Berbagai Faktor Mengikuti Strategi

Penulis:ChaoZhang, Tanggal: 2024-01-18 12:07:52
Tag:

img

Gambaran umum

Ini adalah trend moving average sederhana yang mengikuti strategi yang cocok untuk Bitcoin dan Ethereum. Ini menggabungkan beberapa indikator seperti moving average, MACD dan RSI untuk mengidentifikasi arah tren, dan mengadopsi ukuran posisi tetap untuk pelacakan tren jangka panjang.

Logika Strategi

Logika inti dari strategi ini adalah untuk pergi panjang ketika EMA 20 hari melintasi di atas SMA 100 hari dan SMA 100 hari melintasi di atas SMA 200 hari; menutup posisi ketika EMA 20 hari melintasi di bawah SMA 100 hari. Artinya, gunakan tiga moving average dari periode yang berbeda untuk menentukan arah tren.

Secara khusus, strategi ini menghitung nilai EMA 20 hari, SMA 100 hari dan SMA 200 hari, dan membandingkan hubungan magnitud mereka untuk menilai tren. Ketika EMA 20 hari melintasi di atas SMA 100 hari, itu berarti harga telah mulai naik. Pada titik ini, jika SMA 100 hari juga lebih besar dari SMA 200 hari, itu menunjukkan bahwa tren jangka menengah dan panjang juga meningkat. Ini adalah sinyal panjang yang kuat.

Setelah memasuki posisi long, strategi akan terus memegang posisi untuk mengikuti tren. Ketika EMA 20 hari menyeberangi di bawah SMA 100 hari lagi, ini menunjukkan bahwa sinyal pembalikan tren jangka pendek telah terjadi. Pada titik ini, strategi akan memilih untuk menutup posisi untuk menghentikan kerugian.

Selain itu, strategi ini juga menggabungkan indikator seperti MACD dan RSI untuk mengkonfirmasi tren. Hanya ketika garis DIF, garis DEMA dan garis bar HIST dari MACD semuanya naik, dan indikator RSI berada di atas 50, maka strategi akan memilih untuk membuka posisi panjang.

Keuntungan

Keuntungan terbesar dari strategi ini adalah bahwa ia merumuskan aturan perdagangan tren yang jelas yang dapat secara efektif melacak tren jangka menengah dan panjang.

  1. Gunakan beberapa rata-rata bergerak digabungkan untuk menilai tren, yang relatif dapat diandalkan.

  2. Mengadopsi posisi jangka panjang untuk melacak pergerakan tren tanpa terganggu oleh fluktuasi pasar jangka pendek.

  3. Menggabungkan indikator seperti MACD dan RSI untuk konfirmasi sinyal strategi dapat menyaring terobosan palsu.

  4. Menggunakan salib emas dan salib kematian garis EMA dan SMA untuk menentukan titik masuk dan keluar, aturannya sederhana dan jelas.

  5. Dapat secara efektif mengendalikan risiko dengan membatasi kerugian melalui stop loss.

Risiko dan Solusi

Ada juga beberapa risiko untuk strategi ini. Masalah utama adalah bahwa ia tidak dapat menghentikan kerugian pada waktunya ketika tren berbalik. Risiko dan solusi khusus adalah sebagai berikut:

  1. Tidak dapat melacak titik pembalikan tren dalam waktu: Memperpendek siklus rata-rata bergerak, atau menambahkan lebih banyak indikator untuk penilaian yang komprehensif.

  2. Waktu ditahan yang panjang dapat dengan mudah menyebabkan kerugian yang lebih besar: Singkatkan garis keluar dengan benar untuk stop loss yang tepat waktu.

  3. Indikator rata-rata bergerak cenderung tertinggal: Tambahkan persentase tertentu dari garis stop loss untuk stop loss aktif.

Arahan Optimasi

Strategi ini juga dapat dioptimalkan dalam aspek berikut:

  1. Uji lebih banyak kombinasi siklus rata-rata bergerak untuk menemukan parameter optimal.

  2. Cobalah indikator atau model lain untuk menilai tren dan waktu masuk. seperti Bollinger Bands, Indikator KD, dll.

  3. Menggunakan pembelajaran mesin dan metode lain untuk mengoptimalkan parameter secara dinamis.

  4. Masukkan indikator volume perdagangan untuk menghindari breakout palsu. Misalnya, Volume saldo, volume transaksi, dll.

  5. Mengembangkan sistem stop loss otomatis dan pelacakan stop loss yang dapat menyesuaikan posisi stop loss berdasarkan kondisi pasar.

Kesimpulan

Singkatnya, strategi ini adalah strategi yang sederhana dan langsung mengikuti tren. Ini menggunakan moving average untuk menentukan arah tren, MACD dan RSI untuk menyaring sinyal. Mengadopsi periode penahan yang relatif panjang untuk melacak pergerakan tren. Ini dapat secara efektif menangkap peluang tren jangka menengah dan panjang. Pada saat yang sama, ada juga risiko ketinggalan dalam mengidentifikasi pembalikan tren. Peningkatan dan peningkatan masa depan dapat dilakukan melalui optimasi parameter, menambahkan indikator, dll.


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


Lebih banyak