
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.
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.
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:
Strategi ini juga memiliki beberapa risiko, masalah utamanya adalah tidak dapat berhenti tepat waktu ketika tren berbalik. Risiko dan solusi spesifiknya adalah sebagai berikut:
Tidak dapat melacak titik balik tren tepat waktu: Anda dapat mempersingkat siklus rata-rata, atau menambahkan lebih banyak indikator untuk penilaian komprehensif.
Terlalu lama memegang posisi dapat menyebabkan kerugian yang lebih besar: Anda dapat mengurangi garis keluar dengan tepat, dan menghentikan kerugian tepat waktu.
Indikator garis rata-rata mudah mengalami lag: Anda dapat menambahkan garis stop loss dengan rasio penarikan tertentu, stop loss aktif.
Strategi ini juga dapat dioptimalkan dalam beberapa hal:
Uji siklus garis rata-rata dengan kombinasi lebih banyak untuk mencari parameter optimal.
Cobalah indikator atau model lain untuk menilai tren dan waktu masuk. Misalnya, pita Brin, indikator KD, dll.
Parameter optimasi dinamis menggunakan pembelajaran mesin dan lain-lain. Misalnya, penyesuaian stop loss menggunakan pembelajaran penguatan.
Kombinasi dengan volume transaksi untuk menghindari false breakout.
Mengembangkan stop loss otomatis dan sistem tracking stop loss yang dapat menyesuaikan posisi stop loss sesuai dengan kondisi pasar.
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.
/*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