Chiến lược xu hướng dài của BTC và ETH

Tác giả:ChaoZhang, Ngày: 2023-10-07 10:16:09
Tags:

Tổng quan

Đây là một chiến lược xu hướng dài tự động dựa trên chỉ số kỹ thuật đơn giản cho các loại tiền điện tử như Bitcoin và Ethereum, nhằm mục đích nắm bắt các xu hướng tăng lớn và giảm lỗ phí giao dịch từ giao dịch thường xuyên.

Chiến lược logic

  1. Sử dụng MACD để xác định hướng xu hướng, dài khi MACD vượt lên;

  2. Tính toán đường EMA 20 giai đoạn, đường SMA 100 giai đoạn và đường SMA 200 giai đoạn, đi dài khi đường EMA và đường SMA cùng hướng lên;

  3. Mua khi EMA cao hơn SMA, và SMA cao hơn SMA chậm;

  4. Đặt đường dừng lỗ, dừng lại khi giá phá vỡ dừng lỗ.

  5. Đóng vị trí khi giá giảm và EMA vượt dưới SMA.

Chiến lược này kết hợp nhiều chỉ số để xác định xu hướng và thời gian nhập cảnh để kiếm lợi từ xu hướng tăng lớn.

Ưu điểm

  1. Sự kết hợp của nhiều chỉ báo có thể giúp lọc ra các tín hiệu sai và sai.

  2. Chỉ tham gia vào xu hướng rõ ràng có thể giảm giao dịch không cần thiết và giảm tần suất giao dịch.

  3. Stop loss có thể hạn chế hiệu quả mức lỗ tối đa cho mỗi giao dịch.

  4. Backtest cho thấy lợi nhuận tốt trong BTC và ETH.

  5. Logic đơn giản và rõ ràng, dễ hiểu và thực hiện, tốt cho người mới bắt đầu.

  6. Khả năng mở rộng cao để bao gồm nhiều chỉ số để tối ưu hóa.

Rủi ro

  1. Sự ngẫu nhiên của thị trường cao, rủi ro phán đoán sai.

  2. Cách tiếp cận vị trí duy nhất không thể bảo hiểm rủi ro có hệ thống.

  3. Cài đặt stop loss không chính xác có thể gây ra overstop loss.

  4. Backtest không đại diện cho kết quả thực tế, hiệu suất thực tế vẫn chưa được xác nhận.

  5. Tác động chi phí giao dịch không được xem xét, có thể khác với hiệu suất trực tiếp.

  6. Không tính đến đặc điểm sản phẩm, cần điều chỉnh tham số.

Hướng dẫn tối ưu hóa

  1. Kiểm tra các kết hợp tham số khác nhau để tối ưu hóa các tham số chỉ số.

  2. Thêm các bộ lọc như KDJ để lọc tín hiệu nhập cảnh.

  3. Tối ưu hóa chiến lược dừng lỗ, như thêm stop loss động.

  4. Xem xét kích thước vị trí dựa trên kích thước tài khoản.

  5. Phân biệt các đặc điểm của sản phẩm, điều chỉnh các thông số phù hợp.

  6. Bao gồm nhiều khung thời gian cho phân tích.

  7. Kiểm tra các sản phẩm khác nhau và tìm ra những sản phẩm phù hợp nhất.

Kết luận

Chiến lược logic đơn giản và rõ ràng. Sử dụng nhiều chỉ số có thể giúp lọc ra các tín hiệu sai một cách hiệu quả. Nhưng tối ưu hóa hơn nữa về các thông số, kiểm soát rủi ro vv là cần thiết, kết hợp với xác minh giao dịch trực tiếp, trước khi áp dụng thực tế. Với các phần mở rộng thích hợp, nó có thể trở thành một xu hướng tiền điện tử rất thực tế sau chiến lược.


/*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
        


Thêm nữa