Trend purata bergerak pelbagai faktor mengikut strategi

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

img

Ringkasan

Ini adalah trend purata bergerak yang mudah mengikuti strategi yang sesuai untuk Bitcoin dan Ethereum. Ia menggabungkan beberapa penunjuk seperti purata bergerak, MACD dan RSI untuk mengenal pasti arah trend, dan menggunakan ukuran kedudukan tetap untuk penjejakan trend jangka panjang.

Logika Strategi

Logik teras strategi ini adalah untuk pergi lama apabila EMA 20 hari melintasi di atas SMA 100 hari dan SMA 100 hari melintasi di atas SMA 200 hari; tutup kedudukan apabila EMA 20 hari melintasi di bawah SMA 100 hari.

Secara khusus, strategi ini mengira nilai EMA 20 hari, SMA 100 hari dan SMA 200 hari, dan membandingkan hubungan magnitud mereka untuk menilai trend. Apabila EMA 20 hari melintasi di atas SMA 100 hari, ini bermakna harga telah mula meningkat. Pada ketika ini, jika SMA 100 hari juga lebih besar daripada SMA 200 hari, ini menunjukkan bahawa trend jangka menengah dan panjang juga meningkat. Ini adalah isyarat panjang yang kuat.

Selepas memasuki kedudukan panjang, strategi akan terus memegang kedudukan untuk mengikuti trend. Apabila EMA 20 hari menyeberangi di bawah SMA 100 hari sekali lagi, ia menunjukkan bahawa isyarat pembalikan trend jangka pendek telah berlaku. Pada ketika ini, strategi akan memilih untuk menutup kedudukan untuk menghentikan kerugian.

Di samping itu, strategi ini juga menggabungkan penunjuk seperti MACD dan RSI untuk mengesahkan trend. Hanya apabila garis DIF, garis DEMA dan garis bar HIST MACD semuanya meningkat, dan penunjuk RSI di atas 50, ia akan memilih untuk membuka kedudukan panjang.

Kelebihan

Kelebihan terbesar strategi ini adalah bahawa ia merumuskan peraturan perdagangan trend yang jelas yang dapat dengan berkesan mengesan trend jangka sederhana dan panjang.

  1. Gunakan pelbagai purata bergerak digabungkan untuk menilai trend, yang agak boleh dipercayai.

  2. Mengambil kedudukan memegang jangka panjang untuk mengesan pergerakan trend tanpa diganggu oleh turun naik pasaran jangka pendek.

  3. Menggabungkan penunjuk seperti MACD dan RSI untuk pengesahan isyarat strategi boleh menapis pecah palsu.

  4. Menggunakan salib emas dan salib kematian garis EMA dan SMA untuk menentukan titik masuk dan keluar, peraturan adalah mudah dan jelas.

  5. Dapat mengawal risiko dengan berkesan dengan mengehadkan kerugian melalui stop loss.

Risiko dan Penyelesaian

Terdapat juga beberapa risiko untuk strategi ini. Masalah utama adalah bahawa ia tidak dapat menghentikan kerugian pada masa yang sama apabila trend berbalik. Risiko dan penyelesaian khusus adalah seperti berikut:

  1. Tidak dapat mengesan titik pembalikan trend dalam masa: Memendekkan kitaran purata bergerak, atau menambah lebih banyak penunjuk untuk penilaian yang komprehensif.

  2. Masa tahan lama dengan mudah boleh membawa kepada kerugian yang lebih besar: Memendekkan garis keluar dengan betul untuk menghentikan kerugian tepat pada masanya.

  3. Penunjuk purata bergerak cenderung tertinggal: Tambah peratusan tertentu garis stop loss untuk stop loss aktif.

Arahan pengoptimuman

Strategi ini juga boleh dioptimumkan dalam aspek berikut:

  1. Uji lebih banyak gabungan kitaran purata bergerak untuk mencari parameter optimum.

  2. Cuba indikator atau model lain untuk menilai trend dan masa kemasukan. seperti Bollinger Bands, Indikator KD, dll.

  3. Menggunakan pembelajaran mesin dan kaedah lain untuk mengoptimumkan parameter secara dinamik.

  4. Menggabungkan penunjuk jumlah dagangan untuk mengelakkan pecah palsu.

  5. Membangunkan sistem stop loss automatik dan penjejakan stop loss yang boleh menyesuaikan kedudukan stop loss berdasarkan keadaan pasaran.

Kesimpulan

Ringkasnya, strategi ini adalah strategi trend berikut yang mudah dan mudah. Ia menggunakan purata bergerak untuk menentukan arah trend, MACD dan RSI untuk menapis isyarat. Mengambil tempoh tahan yang agak lama untuk mengesan pergerakan trend. Ia dapat menangkap peluang trend jangka menengah dan panjang dengan berkesan. Pada masa yang sama, terdapat juga risiko ketinggalan dalam mengenal pasti pembalikan trend. Penambahbaikan dan peningkatan masa depan boleh dibuat melalui pengoptimuman parameter, menambah penunjuk, 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 lanjut