Strategi Tren Panjang BTC dan ETH

Penulis:ChaoZhang, Tanggal: 2023-10-07 10:16:09
Tag:

Gambaran umum

Ini adalah strategi tren panjang otomatis berbasis indikator teknis sederhana untuk mata uang kripto seperti Bitcoin dan Ethereum, yang bertujuan untuk menangkap tren naik utama dan mengurangi kerugian biaya perdagangan dari perdagangan yang sering.

Logika Strategi

  1. Menggunakan MACD untuk menentukan arah tren, panjang ketika MACD melintasi ke atas;

  2. Menghitung EMA 20 periode, SMA 100 periode dan SMA 200 periode, pergi panjang ketika EMA dan SMA menunjuk ke atas bersama-sama;

  3. Membeli ketika EMA lebih tinggi dari SMA, dan SMA lebih tinggi dari SMA lambat;

  4. Setel stop loss line, stop out saat harga pecah stop loss.

  5. Tutup posisi ketika harga turun dan EMA melintasi SMA.

Strategi ini menggabungkan beberapa indikator untuk menentukan tren dan waktu masuk untuk mendapatkan keuntungan dari tren naik utama.

Keuntungan

  1. Kombinasi beberapa indikator dapat membantu menyaring kebohongan dan sinyal yang salah.

  2. Hanya masuk ke tren yang jelas dapat mengurangi perdagangan yang tidak perlu dan mengurangi frekuensi perdagangan.

  3. Stop loss dapat secara efektif membatasi kerugian maksimum per perdagangan.

  4. Backtest menunjukkan keuntungan yang layak di BTC dan ETH.

  5. Logika yang sederhana dan jelas, mudah dimengerti dan diterapkan, bagus untuk pemula.

  6. Ekspansibilitas tinggi untuk memasukkan lebih banyak indikator untuk optimasi.

Risiko

  1. Kecenderungan pasar yang tinggi, risiko penilaian yang salah.

  2. Pendekatan posisi tunggal tidak dapat melindungi risiko sistematis.

  3. Pengaturan stop loss yang tidak benar dapat menyebabkan overstop loss.

  4. Backtest tidak mewakili hasil hidup, kinerja nyata belum divalidasi.

  5. Dampak biaya perdagangan tidak dipertimbangkan, mungkin berbeda dari kinerja langsung.

  6. Tidak mempertimbangkan karakteristik produk, pengaturan parameter diperlukan.

Arahan Optimasi

  1. Uji kombinasi parameter yang berbeda untuk mengoptimalkan parameter indikator.

  2. Tambahkan filter seperti KDJ untuk menyaring sinyal masuk.

  3. Mengoptimalkan strategi stop loss, seperti menambahkan stop loss dinamis.

  4. Pertimbangkan ukuran posisi berdasarkan ukuran akun.

  5. Membedakan karakteristik produk, menyesuaikan parameter sesuai.

  6. Masukkan lebih banyak kerangka waktu untuk analisis.

  7. Cobalah berbagai produk dan carilah yang paling cocok.

Kesimpulan

Logika strategi sederhana dan jelas. Menggunakan beberapa indikator dapat membantu menyaring sinyal yang salah secara efektif. Tetapi optimasi lebih lanjut pada parameter, kontrol risiko dll diperlukan, dikombinasikan dengan verifikasi perdagangan langsung, sebelum aplikasi sebenarnya. Dengan ekstensi yang tepat, itu bisa menjadi tren crypto yang sangat praktis mengikuti strategi.


/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="BTC Long strategy", overlay=true, max_bars_back=3000, initial_capital=1000, commission_value=0.075)

//////////// !!!!!!!!!!!!!!!! WORK BEST IN 2 HOURS for BTC, ETH and ETHXBT !!!!!!!!!!!!!!!!!!! /////////////////////


[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 (1.5, "StopLoss in %", type=input.float) //StopLoss associated with the order 
//positionSize = input (1000, "in $")
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  = 2019


//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     = 31
ToMonth   = 12
ToYear    = 2099

// === 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"



//emaLength = input(20, "EMA Length")
//smaLength = input(100, "SMA Length")
//smaSlowLength = input(200, "SMA Length") 
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]) ? 50000 : positionSize[1]
stockPositionSize := na(stockPositionSize[1]) ? 0 : stockPositionSize[1]
//leverage := na(leverage[1]) ? 1 : leverage[1]
 
//ReEvaluate the direction of indicators
bEMAIsRising := rising(ema, 2) 
bSMAIsRising := rising(sma, 3)
bMACDIsRising := rising(macdLine, 3)
bMACDHistIsRising := rising(macdHist, 1)
bSMASlowIsRising := rising(smaSlow, 10)
bMACDSignalIsRising := rising(macdSignalLine, 3)

atrValue := atr(14)
volatilityPercentage := (atrValue/currentPrice)*100 //calcute the volatility. Percentage of the actual price


//There is too many signal in tranding market, to avoid this we need to make sure that the smaSlow has a mininal increase
//THIS DOES NOT WORK AT ALL!!!!!
//if bSMASlowIsRising == true
//    //calculate the percentegage difference over the last 10 bars
//    smaPercentageIncrease := ((smaSlow[0]/sma[10])-1)*100
//    if smaPercentageIncrease < SMA_PERCENT_INCREASE
//        //Not enough increase we reset the flag 
//        bSMASlowIsRising := false 
        
 
if (window()) 
    //Check if we can open a LONG
//sma > smaSlow and
    if ( volatilityPercentage < 2 and bPositionOpened == false and bSMASlowIsRising == true and bMACDIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[0] > sma[0] and sma[0] < currentPrice)
    // add comparaison between macd and macd signal line
    //if (bPositionOpened == false and macdSignalLine < macdLine and bMACDIsRising == true and bMACDHistIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[1] > sma[1] and sma[1] < 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]) or currentPrice < sma[1]))  
    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 banyak