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 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 terbesar dari strategi ini adalah bahwa ia merumuskan aturan perdagangan tren yang jelas yang dapat secara efektif melacak tren jangka menengah dan panjang.
Gunakan beberapa rata-rata bergerak digabungkan untuk menilai tren, yang relatif dapat diandalkan.
Mengadopsi posisi jangka panjang untuk melacak pergerakan tren tanpa terganggu oleh fluktuasi pasar jangka pendek.
Menggabungkan indikator seperti MACD dan RSI untuk konfirmasi sinyal strategi dapat menyaring terobosan palsu.
Menggunakan salib emas dan salib kematian garis EMA dan SMA untuk menentukan titik masuk dan keluar, aturannya sederhana dan jelas.
Dapat secara efektif mengendalikan risiko dengan membatasi kerugian melalui stop loss.
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:
Tidak dapat melacak titik pembalikan tren dalam waktu: Memperpendek siklus rata-rata bergerak, atau menambahkan lebih banyak indikator untuk penilaian yang komprehensif.
Waktu ditahan yang panjang dapat dengan mudah menyebabkan kerugian yang lebih besar: Singkatkan garis keluar dengan benar untuk stop loss yang tepat waktu.
Indikator rata-rata bergerak cenderung tertinggal: Tambahkan persentase tertentu dari garis stop loss untuk stop loss aktif.
Strategi ini juga dapat dioptimalkan dalam aspek berikut:
Uji lebih banyak kombinasi siklus rata-rata bergerak untuk menemukan parameter optimal.
Cobalah indikator atau model lain untuk menilai tren dan waktu masuk. seperti Bollinger Bands, Indikator KD, dll.
Menggunakan pembelajaran mesin dan metode lain untuk mengoptimalkan parameter secara dinamis.
Masukkan indikator volume perdagangan untuk menghindari breakout palsu. Misalnya, Volume saldo, volume transaksi, dll.
Mengembangkan sistem stop loss otomatis dan pelacakan stop loss yang dapat menyesuaikan posisi stop loss berdasarkan kondisi pasar.
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