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.
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 terbesar strategi ini adalah bahawa ia merumuskan peraturan perdagangan trend yang jelas yang dapat dengan berkesan mengesan trend jangka sederhana dan panjang.
Gunakan pelbagai purata bergerak digabungkan untuk menilai trend, yang agak boleh dipercayai.
Mengambil kedudukan memegang jangka panjang untuk mengesan pergerakan trend tanpa diganggu oleh turun naik pasaran jangka pendek.
Menggabungkan penunjuk seperti MACD dan RSI untuk pengesahan isyarat strategi boleh menapis pecah palsu.
Menggunakan salib emas dan salib kematian garis EMA dan SMA untuk menentukan titik masuk dan keluar, peraturan adalah mudah dan jelas.
Dapat mengawal risiko dengan berkesan dengan mengehadkan kerugian melalui stop loss.
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:
Tidak dapat mengesan titik pembalikan trend dalam masa: Memendekkan kitaran purata bergerak, atau menambah lebih banyak penunjuk untuk penilaian yang komprehensif.
Masa tahan lama dengan mudah boleh membawa kepada kerugian yang lebih besar: Memendekkan garis keluar dengan betul untuk menghentikan kerugian tepat pada masanya.
Penunjuk purata bergerak cenderung tertinggal: Tambah peratusan tertentu garis stop loss untuk stop loss aktif.
Strategi ini juga boleh dioptimumkan dalam aspek berikut:
Uji lebih banyak gabungan kitaran purata bergerak untuk mencari parameter optimum.
Cuba indikator atau model lain untuk menilai trend dan masa kemasukan. seperti Bollinger Bands, Indikator KD, dll.
Menggunakan pembelajaran mesin dan kaedah lain untuk mengoptimumkan parameter secara dinamik.
Menggabungkan penunjuk jumlah dagangan untuk mengelakkan pecah palsu.
Membangunkan sistem stop loss automatik dan penjejakan stop loss yang boleh menyesuaikan kedudukan stop loss berdasarkan keadaan pasaran.
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