Chiến lược đầu tư BTC theo dõi thông minh

Tác giả:ChaoZhang, Ngày: 2023-11-22 15:18:53
Tags:

img

Tổng quan

Chiến lược này chủ yếu được sử dụng cho đầu tư dài hạn tự động vào BTC. Nó sử dụng sự chéo chéo của EMA và LSMA kép để xác định hướng xu hướng và sử dụng chỉ số ATR để tính toán stop loss động để theo dõi hiệu quả xu hướng tăng của BTC.

Chiến lược logic

  1. Sử dụng EMA 25 giai đoạn và LSMA 100 giai đoạn để tạo thành một đường trung bình động kép. Sự chéo chéo của chúng được sử dụng để xác định xu hướng thị trường. EMA phản ứng nhanh chóng với những thay đổi giá trong khi LSMA lọc ra những đột phá sai.

  2. Khi EMA nhanh vượt qua trên LSMA chậm, nó được xác định rằng xu hướng tăng vẫn còn nguyên vẹn và các vị trí dài được thực hiện. Ngược lại, khi EMA nhanh vượt qua dưới LSMA chậm, nó được xác định rằng xu hướng giảm đã bắt đầu và các vị trí hiện có được đóng.

  3. Sau khi thực hiện các vị trí dài, stop loss động được tính bằng chỉ số ATR tiếp tục điều chỉnh để theo dõi hiệu quả xu hướng tăng của BTC. Cụ thể, điểm khởi đầu của đường stop loss là giá nhập. Sau đó, mỗi điều chỉnh sẽ trượt lên một tỷ lệ phần trăm cố định của kích thước ATR.

  4. Đường dừng lỗ có thể khóa hiệu quả lợi nhuận nổi do xu hướng tăng BTC mang lại, đồng thời ngăn chặn điểm dừng lỗ quá gần với giá mới nhất để tránh giảm giảm thường xuyên. Ngoài ra, chiến lược cũng đặt ra hai lợi nhuận dừng chuyển động có tỷ lệ khác nhau để khóa thêm lợi nhuận.

Phân tích lợi thế

  1. Sử dụng các đường trung bình động kép để xác định xu hướng là đáng tin cậy hơn và có thể ngăn chặn hiệu quả các tín hiệu sai.

  2. Các ATR động trailing stop loss có thể khóa trong hầu hết lợi nhuận trong khi tránh thường xuyên nhỏ stop losses.

  3. Bất kể xu hướng tăng có kết thúc hay không, miễn là đường trung bình động phát ra tín hiệu thoát, vị trí sẽ được dừng lại để kiểm soát rủi ro.

  4. Chiến lược có mức độ tự động hóa cao mà không cần can thiệp bằng tay, làm cho nó phù hợp với giao dịch trực tiếp dài hạn.

Phân tích rủi ro

  1. Vẫn cần chú ý đến tin tức đột ngột để tránh mất mát lớn.

  2. Mặc dù sự kết hợp của hai đường trung bình động có thể làm giảm các tín hiệu sai, nhưng vẫn rất khó để tránh hoàn toàn chúng trong các thị trường giới hạn phạm vi.

  3. Cài đặt tham số không chính xác của ATR cũng có thể ảnh hưởng đến hiệu ứng dừng lỗ.

  4. Các khoảng thời gian trung bình động không hợp lý hoặc không cập nhật đúng thời gian có thể dẫn đến sự chậm trễ tín hiệu.

  5. Đảm bảo sự ổn định của máy chủ để tránh sự cố bất thường làm gián đoạn giao dịch tự động.

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

  1. Nhiều chỉ số như Bollinger Bands có thể được thêm vào để xác định xu hướng. Các mô hình học máy cũng có thể được sử dụng để dự đoán giá.

  2. Phương pháp tính toán của lỗ dừng động ATR cũng có thể được điều chỉnh và tối ưu hóa để làm cho lỗ dừng trơn tru hơn.

  3. Các cơ chế cảnh báo dựa trên khối lượng giao dịch và tính năng xoay trong ngày có thể được thêm vào để bảo vệ chống lại tác động từ tin tức lớn.

  4. Các tham số khác nhau cho các đồng xu khác nhau.

Tóm lại

Nhìn chung, đây là một chương trình đầu tư BTC tự động rất thực tế. Sử dụng EMA kép để xác định xu hướng chính là rất đáng tin cậy. Với ATR trailing stop loss, nó có thể đạt được lợi nhuận tốt và thời gian hiệu lực có thể rất dài. Khi các thông số tiếp tục được tối ưu hóa, vẫn còn nhiều chỗ để cải thiện hiệu suất của chiến lược này. Nó rất đáng để xác minh giao dịch trực tiếp.


// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Wunderbit Trading

//@version=4
strategy("Automated Bitcoin (BTC) Investment Strategy", overlay=true, initial_capital=5000,pyramiding = 0, currency="USD", default_qty_type=strategy.percent_of_equity, default_qty_value=100,  commission_type=strategy.commission.percent,commission_value=0.1)

////////////  Functions

Atr(p) =>
    atr = 0.
    Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1])))
    atr := nz(atr[1] + (Tr - atr[1])/p,Tr)

//TEMA
TEMA(series, length) =>
    if (length > 0)
        ema1 = ema(series, length)
        ema2 = ema(ema1, length)
        ema3 = ema(ema2, length)
        (3 * ema1) - (3 * ema2) + ema3
    else
        na
tradeType = input("LONG", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH", "NONE"])

///////////////////////////////////////////////////
/// INDICATORS
source=close

/// TREND
trend_type1 = input("TEMA", title ="First Trend Line : ", options=["LSMA", "TEMA","EMA","SMA"])
trend_type2 = input("LSMA", title ="First Trend Line : ", options=["LSMA", "TEMA","EMA","SMA"])

trend_type1_length=input(25, "Length of the First Trend Line")
trend_type2_length=input(100, "Length of the Second Trend Line")

leadLine1 = if trend_type1=="LSMA"
    linreg(close, trend_type1_length, 0)
else if trend_type1=="TEMA"
    TEMA(close,trend_type1_length)
else if trend_type1 =="EMA"
    ema(close,trend_type1_length)
else
    sma(close,trend_type1_length)

leadLine2 = if trend_type2=="LSMA"
    linreg(close, trend_type2_length, 0)
else if trend_type2=="TEMA"
    TEMA(close,trend_type2_length)
else if trend_type2 =="EMA"
    ema(close,trend_type2_length)
else
    sma(close,trend_type2_length)

p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)

//Upward Trend
UT=crossover(leadLine1,leadLine2)
DT=crossunder(leadLine1,leadLine2)

// TP/ SL/  FOR LONG
// TAKE PROFIT AND STOP LOSS
long_tp1_inp = input(15, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(20, title="Long Take Profit 1 Qty", step=1)

long_tp2_inp = input(30, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(20, title="Long Take Profit 2 Qty", step=1)

long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)

long_sl_input = input(5, title='stop loss in %', step=0.1)/100
long_sl_input_level = strategy.position_avg_price * (1 - long_sl_input)

// Stop Loss
multiplier = input(3.5, "SL Mutiplier", minval=1, step=0.1)
ATR_period=input(8,"ATR period", minval=1, step=1)

// Strategy
//LONG STRATEGY CONDITION

SC = input(close, "Source", input.source)
SL1 = multiplier * Atr(ATR_period)  // Stop Loss
Trail1 = 0.0
Trail1 :=  iff(SC < nz(Trail1[1], 0) and SC[1] < nz(Trail1[1], 0), min(nz(Trail1[1], 0), SC + SL1), iff(SC > nz(Trail1[1], 0), SC - SL1, SC + SL1))
Trail1_high=highest(Trail1,50)

// iff(SC > nz(Trail1[1], 0) and SC[1] > nz(Trail1[1], 0), max(nz(Trail1[1], 0), SC - SL1),

entry_long=crossover(leadLine1,leadLine2) and Trail1_high < close
exit_long = close < Trail1_high or crossover(leadLine2,leadLine1) or close < long_sl_input_level

///// BACKTEST PERIOD ///////
testStartYear = input(2016, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(9999, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false

if testPeriod()
    if tradeType=="LONG" or tradeType=="BOTH"
        if strategy.position_size == 0 or strategy.position_size > 0
            strategy.entry("long", strategy.long, comment="b8f60da7_ENTER-LONG_BINANCE_BTC/USDT_b8f60da7-BTC-Investment_4H", when=entry_long)
            strategy.exit("TP1", "long", qty_percent=long_tp1_qty, limit=long_take_level_1)
            strategy.exit("TP2", "long", qty_percent=long_tp2_qty, limit=long_take_level_2)
            strategy.close("long", when=exit_long, comment="b8f60da7_EXIT-LONG_BINANCE_BTC/USDT_b8f60da7-BTC-Investment_4H" )


// LONG POSITION

plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? Trail1_high : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")

Thêm nữa