
Strategi ini adalah strategi mengikut trend purata bergerak sederhana yang digunakan untuk Bitcoin dan Ethereum. Ia menggabungkan beberapa petunjuk seperti garis rata-rata, MACD dan RSI untuk mengenal pasti arah trend, dan mengikuti trend dengan menggunakan garis panjang pegangan tetap.
Logik teras strategi ini adalah apabila 20 hari EMA melintasi 100 hari SMA dan 100 hari SMA melintasi 200 hari SMA lebih banyak; apabila 20 hari EMA melintasi 100 hari SMA di bawah garis. Ia menggunakan tiga purata bergerak dari tempoh yang berbeza untuk menentukan arah trend.
Khususnya, strategi ini menilai trend dengan mengira nilai garis EMA 20, 100 hari SMA dan 200 hari SMA dan membandingkan hubungan saiz mereka. Apabila garis EMA 20 memakai garis EMA 100 hari, iaitu garis EMA 20 yang lebih besar daripada garis SMA 100 hari, ini menunjukkan bahawa harga mula naik; pada masa ini, jika garis SMA 100 hari juga lebih besar daripada garis SMA 200 hari, ini menunjukkan bahawa trend jangka menengah juga meningkat, yang merupakan isyarat melakukan lebih banyak.
Selepas memasuki posisi berlebih, strategi akan terus memegang kedudukan dan mengikuti trend. Apabila garis EMA ke-20 kembali menembusi garis SMA ke-100 di bawah, menunjukkan isyarat pembalikan trend jangka pendek, maka strategi akan memilih untuk menghentikan kerugian.
Selain itu, strategi ini juga menggabungkan indikator seperti MACD dan RSI untuk mengesahkan trend. Hanya apabila garis DIF MACD, garis DEMA dan garis pilar HIST meningkat, dan apabila indikator RSI lebih tinggi daripada 50, anda akan memilih untuk membuka lebih banyak kedudukan.
Kelebihan utama strategi ini ialah menetapkan peraturan perdagangan trend yang jelas, yang dapat mengesan trend garis tengah dengan berkesan. Kelebihan spesifiknya adalah sebagai berikut:
Strategi ini juga mempunyai beberapa risiko, masalah utamanya adalah tidak dapat menghentikan dalam masa yang tepat apabila trend berbalik. Risiko dan penyelesaian khusus adalah seperti berikut:
Tidak dapat menjejaki titik perubahan trend dalam masa yang tepat: anda boleh memotong kitaran garis purata, atau menambah lebih banyak petunjuk untuk penilaian komprehensif.
Penyimpanan terlalu lama boleh menyebabkan kerugian yang lebih besar: anda boleh memendekkan garis keluar dengan tepat, dan menghentikan kerugian tepat pada masanya.
Penunjuk garis rata-rata mudah mengalami kelewatan: anda boleh menambah garis hentian dengan peratusan penarikan balik tertentu, hentian aktif.
Strategi ini juga boleh dioptimumkan dalam beberapa aspek:
Uji pusingan purata lebih banyak kombinasi untuk mencari parameter optimum.
Cubalah dengan penunjuk atau model lain untuk menilai trend dan masa kemasukan.
Parameter pengoptimuman dinamik menggunakan pembelajaran mesin dan lain-lain. Sebagai contoh, menyesuaikan stop loss menggunakan pembelajaran penguatan.
Gabungan dengan penunjuk jumlah transaksi untuk mengelakkan penembusan palsu. Seperti penunjuk arus tenaga, jumlah transaksi dan sebagainya.
Membangunkan sistem stop loss automatik dan tracking stop loss yang dapat menyesuaikan kedudukan stop loss mengikut keadaan pasaran.
Strategi ini secara keseluruhan adalah strategi mengikuti trend yang mudah dan langsung. Ia menggunakan purata bergerak untuk menentukan arah trend, MACD dan isyarat penapis RSI. Ia menggunakan masa pegangan yang lebih lama untuk mengesan trend.
/*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