Chiến lược mua Bitcoin VWMA-ADX dựa trên động lượng và xu hướng

VWMA ADX DMI SMA EMA RMA WMA HMA SMMA
Ngày tạo: 2024-04-03 17:47:49 sửa đổi lần cuối: 2024-04-03 17:47:49
sao chép: 8 Số nhấp chuột: 951
1
tập trung vào
1617
Người theo dõi

Chiến lược mua Bitcoin VWMA-ADX dựa trên động lượng và xu hướng

Tổng quan

Chiến lược này sử dụng nhiều đường trung bình di chuyển (VWMA), chỉ số định hướng trung bình (ADX) và chỉ số chuyển động (DMI) để nắm bắt nhiều cơ hội trong thị trường Bitcoin. Bằng cách kết hợp nhiều chỉ số kỹ thuật như động lượng giá, hướng xu hướng và khối lượng giao dịch, chiến lược này nhằm tìm ra điểm vào có xu hướng tăng mạnh và đủ động lượng, đồng thời kiểm soát chặt chẽ rủi ro.

Nguyên tắc chiến lược

  1. Sử dụng VWMA ngày 9 và 14 để đánh giá xu hướng đa đầu, tạo ra tín hiệu đa đầu khi đường trung bình ngắn hạn đi qua đường trung bình dài hạn.
  2. Lập một đường trung bình tự điều chỉnh được xây dựng bởi giá cao nhất và giá thấp nhất VWMA 89 ngày làm bộ lọc xu hướng, chỉ xem xét mở vị trí khi giá đóng cửa hoặc giá mở cửa cao hơn đường trung bình.
  3. Chỉ số ADX và DMI xác nhận cường độ của xu hướng, chỉ khi ADX lớn hơn 18 và chênh lệch + DI so với -DI lớn hơn 15, xu hướng được coi là đủ mạnh.
  4. Sử dụng hàm phần trăm khối lượng giao dịch để lọc khối lượng giao dịch trong khoảng từ 60% đến 95%, tránh các khoảng thời gian khối lượng giao dịch quá thấp.
  5. Cài đặt stop loss nằm ở mức cao 0.96 - 0.99 lần của đường K trước và giảm dần theo khung thời gian để kiểm soát rủi ro.
  6. Khi đạt được thời gian giữ vị trí dự kiến hoặc giá giảm xuống đường trung bình tự điều chỉnh, vị trí được giải quyết.

Phân tích lợi thế

  1. Kết hợp nhiều chỉ số kỹ thuật để đánh giá tình trạng thị trường từ nhiều chiều như xu hướng, động lực và khối lượng giao dịch, tín hiệu được tin cậy hơn.
  2. Các cơ chế lọc tự điều chỉnh đường trung bình và khối lượng giao dịch có thể lọc hiệu quả các tín hiệu giả và giảm các giao dịch không hiệu quả.
  3. Thiết lập dừng lỗ nghiêm ngặt và giới hạn thời gian nắm giữ đã làm giảm đáng kể lỗ hổng rủi ro của chiến lược.
  4. Mã được thiết kế theo mô-đun, dễ đọc và bảo trì hơn, cho phép tối ưu hóa và mở rộng hơn nữa.

Phân tích rủi ro

  1. Chiến lược này có thể tạo ra nhiều tín hiệu giả khi thị trường đang trong tình trạng biến động hoặc xu hướng không rõ ràng.
  2. Vị trí dừng lỗ tương đối gần, có thể kích hoạt dừng lỗ quá sớm khi thị trường biến động lớn, dẫn đến tổn thất mở rộng.
  3. Thiếu sự cân nhắc về tình hình kinh tế vĩ mô và các sự kiện quan trọng có thể không hiệu quả khi đối mặt với sự kiện “Black Swan”.
  4. Cài đặt tham số tương đối cố định, thiếu khả năng thích ứng, có thể không ổn định trong các môi trường thị trường khác nhau.

Hướng tối ưu hóa

  1. Việc đưa ra nhiều chỉ số hơn để mô tả môi trường thị trường, chẳng hạn như chỉ số tương đối mạnh (RSI) và Blink, giúp tăng độ tin cậy của tín hiệu.
  2. Động thái tối ưu hóa vị trí dừng lỗ, ví dụ như sử dụng ATR hoặc dừng phần trăm để đối phó với các biến động thị trường khác nhau.
  3. Kết hợp dữ liệu kinh tế vĩ mô và phân tích tình cảm, các mô-đun kiểm soát rủi ro của chiến lược được tăng cường.
  4. Sử dụng thuật toán học máy để tự động tối ưu hóa các tham số, cải thiện khả năng thích ứng và ổn định của chiến lược.

Tóm tắt

Chiến lược đa đầu Bitcoin VWMA-ADX có thể nắm bắt các cơ hội tăng giá trong thị trường Bitcoin một cách hiệu quả bằng cách cân nhắc tổng hợp nhiều chỉ số kỹ thuật như xu hướng giá, động lực và khối lượng giao dịch. Đồng thời, các biện pháp kiểm soát rủi ro nghiêm ngặt và điều kiện bán tháo rõ ràng giúp rủi ro của chiến lược được kiểm soát tốt hơn. Tuy nhiên, chiến lược này cũng có một số hạn chế, chẳng hạn như không thích ứng với sự thay đổi của môi trường thị trường và chiến lược dừng lỗ cần được tối ưu hóa.

Mã nguồn chiến lược
/*backtest
start: 2024-03-01 00:00:00
end: 2024-03-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Q_D_Nam_N_96

//@version=5
strategy("Long BTC Strategy", overlay=true, 
     default_qty_type = strategy.percent_of_equity, 
     default_qty_value = 100, initial_capital = 1000, currency = currency.USD)

Volume_Quartile(vol) =>
    qvol1 = ta.percentile_linear_interpolation(vol, 60,15)
    qvol2 = ta.percentile_linear_interpolation(vol, 60,95)
    vol > qvol1 and vol < qvol2

smma(src, length) =>
	smma =  0.0
	smma := na(smma[1]) ? ta.sma(src, length) : (smma[1] * (length - 1) + src) / length
	smma

ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "RMA" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)
        "HMA" => ta.hma(source, length)
        "SMMA" => smma(source, length)

DMI(len, lensig) =>
    up = ta.change(high)
    down = -ta.change(low)
    plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
    trur = ta.rma(ta.tr, len)
    plus = fixnan(100 * ta.rma(plusDM, len) / trur)+11
    minus = fixnan(100 * ta.rma(minusDM, len) / trur)-11
    sum = plus + minus
    adx = 100 * ta.vwma(math.abs(plus - minus-11) / (sum == 0 ? 1 : sum), lensig)

    [adx, plus, minus]

cond1 = Volume_Quartile(volume*hlcc4)

ma1 = ma(close,9, "VWMA")
// plot(ma1, color = color.blue)
ma2 = ma(close,14, "VWMA")
// plot(ma2, color = color.orange)

n = switch timeframe.period
    "240" => 0.997
    => 0.995

ma3 = (0.1*ma(ta.highest(close,89),89, "VWMA") + 
     0.9*ma(ta.lowest(close,89),89, "VWMA"))*n

plot(ma3, color = color.white)

[adx, plus, minus] = DMI(7, 10)


cond2 = adx > 18 and plus - math.abs(minus) > 15

var int count = 0

if barstate.isconfirmed and strategy.position_size != 0
    count += 1
else
    count := 0

p_roc = 0
if timeframe.period == '240'
    p_roc := 14
else
    p_roc := 10

longCondition = ta.crossover(ma1, ma2) and (close > open ? close > ma3 : open > ma3) and ((ma3 - ma3[1])*100/ma3[1] >= -0.2) and ((close-close[p_roc])*100/close[p_roc] > -2.0)
float alpha = 0.0
float sl_src = high[1]
if (longCondition and cond1 and cond2 and strategy.position_size == 0)
    strategy.entry("buy", strategy.long)
    if timeframe.period == '240'
        alpha := 0.96
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+5, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '30'
        alpha := 0.985
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '45'
        alpha := 0.985
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '60'
        alpha := 0.98
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '120'
        alpha := 0.97
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '180'
        alpha := 0.96
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == 'D'
        alpha := 0.95
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else 
        alpha := 0.93
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)

period = switch timeframe.period
    "240" => 90
    "180" => 59
    "120" => 35
    "30" => 64
    "45" => 40
    "60" => 66
    "D" => 22
    => 64

if (count > period or close < ma3)
    strategy.close('buy', immediately = true)