Chiến lược giao dịch định lượng áp lực kép

Tác giả:ChaoZhang, Ngày: 2023-11-02 13:56:23
Tags:

img

Tổng quan

Chiến lược giao dịch định lượng áp lực kép là một chiến lược theo xu hướng kết hợp các chỉ số Stochastic và khối lượng. Nó chủ yếu sử dụng các đường K và D Stochastic cùng với các chỉ số khối lượng để tạo ra tín hiệu mua và bán, được bổ sung bằng đường chéo trung bình động cho các tín hiệu bổ sung.

Chiến lược logic

Nhận tín hiệu

Tín hiệu mua chính được kích hoạt khi:

  1. Cả hai đường K và D qua dưới khu vực bán quá mức (ví dụ 20) và quay lên, và cả K và D đang tăng

  2. Khối lượng vượt quá ngưỡng (ví dụ: 1,4 lần khối lượng trung bình)

  3. Đóng là trên mở (nến trắng)

Các tín hiệu mua bổ sung có thể đến từ:

  1. Chữ chéo vàng: EMA nhanh vượt qua EMA chậm, cả hai đều tăng

  2. Cả K và D đều tăng từ vùng thấp lên vùng trung bình (ví dụ: từ dưới 20 lên 20-80)

Bán tín hiệu

Các tín hiệu bán chính được kích hoạt khi:

  1. Cả K và D đều đi vào khu vực mua quá mức (ví dụ trên 80)

  2. Death cross: EMA nhanh vượt qua EMA chậm

  3. K vượt qua dưới D, và cả K và D đều giảm

Dừng Loss

Một tỷ lệ phần trăm (ví dụ: 6%) dưới giá mua được thiết lập là mức dừng lỗ.

Phân tích lợi thế

  • Chế độ chứng ngẫu nhiên kép tránh tín hiệu sai
  • Tiếng ồn lọc và đảm bảo xu hướng
  • Nhiều tín hiệu kết hợp cải thiện độ chính xác
  • Trung bình động hỗ trợ xu hướng tổng thể
  • Kiểm soát rủi ro dừng lỗ

Ưu điểm 1: Chế độ Stochastic kép tránh các tín hiệu sai

Chỉ có một stochastic có thể tạo ra nhiều tín hiệu sai. Sự kết hợp stochastic kép lọc tín hiệu sai và cải thiện độ tin cậy.

Ưu điểm 2: Khối lượng lọc tiếng ồn và đảm bảo xu hướng

Điều kiện khối lượng lọc các điểm không xu hướng khối lượng thấp và giảm nguy cơ bị mắc kẹt.

Ưu điểm 3: Nhiều tín hiệu cải thiện độ chính xác

Nhiều chỉ số phải phù hợp để kích hoạt các tín hiệu giao dịch thực sự. Điều này cải thiện độ tin cậy tín hiệu.

Ưu điểm 4: Mức trung bình động hỗ trợ xu hướng tổng thể

Các quy tắc như đường trung bình động kép đảm bảo tín hiệu phù hợp với xu hướng tổng thể. Điều này tránh giao dịch ngược xu hướng.

Ưu điểm 5: Dừng lỗ kiểm soát rủi ro

Logic dừng lỗ nhận ra lợi nhuận và kiểm soát lỗ trên các giao dịch đơn lẻ.

Phân tích rủi ro

  • Các thông số cần tối ưu hóa cẩn thận, cài đặt không đúng dẫn đến hiệu suất kém
  • Đặt lệnh dừng lỗ phải xem xét rủi ro khoảng cách
  • Rủi ro thanh khoản nên được theo dõi đối với các công cụ giao dịch
  • Vấn đề xem lại giữa các khung thời gian khác nhau

Nguy cơ 1: Các thông số cần tối ưu hóa cẩn thận

Chiến lược có nhiều thông số. Họ cần tối ưu hóa cho các công cụ khác nhau, nếu không hiệu suất bị ảnh hưởng.

Rủi ro 2: Đặt dừng lỗ phải xem xét rủi ro lỗ

Điểm dừng lỗ nên tính đến các kịch bản chênh lệch giá. Nó không nên quá gần với giá mua.

Rủi ro 3: Giám sát rủi ro thanh khoản

Đối với các công cụ không thanh khoản, các quy tắc khối lượng có thể lọc quá nhiều tín hiệu.

Nguy cơ 4: Vấn đề nhìn lại giữa các khung thời gian

Sự sai lệch giữa các tín hiệu trên các khung thời gian khác nhau có thể xảy ra. Các tín hiệu phải được xác minh để phù hợp.

Cơ hội gia tăng

Chiến lược có thể được tăng cường trong các lĩnh vực như:

  1. Tối ưu hóa các thông số cho độ bền

  2. Đưa ra máy học cho các thông số thích nghi

  3. Cải thiện chiến lược dừng lỗ để giảm tỷ lệ dừng lỗ

  4. Thêm bộ lọc để giảm tần suất giao dịch

  5. Khám phá các lệnh có điều kiện hoặc lấy lợi nhuận để cải thiện phần thưởng

Cơ hội 1: Tối ưu hóa các thông số cho độ bền

Các phương pháp như thuật toán di truyền có thể tối ưu hóa các tham số cho sự ổn định trên các chế độ thị trường.

Cơ hội 2: giới thiệu máy học cho các thông số thích nghi

Các mô hình có thể đánh giá điều kiện thị trường và điều chỉnh các tham số phù hợp, đạt được tối ưu hóa năng động.

Cơ hội 3: Cải thiện chiến lược dừng lỗ để giảm tỷ lệ dừng lỗ

Các thuật toán dừng lỗ tốt hơn có thể giảm các điểm dừng không cần thiết trong khi duy trì kiểm soát rủi ro.

Cơ hội 4: Thêm bộ lọc để giảm tần suất giao dịch

Tăng cường các bộ lọc có thể làm giảm tần suất giao dịch, giảm chi phí và cải thiện lợi nhuận cho mỗi giao dịch.

Cơ hội 5: Khám phá các lệnh có điều kiện hoặc lấy lợi nhuận

Theo điều kiện thị trường, lệnh có điều kiện hoặc chiến lược lấy lợi nhuận có thể tối đa hóa lợi nhuận tốt hơn trong khi kiểm soát rủi ro.

Kết luận

Chiến lược cân bằng xu hướng, kiểm soát rủi ro, chi phí và các khía cạnh khác. Những lợi thế cốt lõi là hai stochastic cộng với khối lượng cho xu hướng và dừng lỗ để kiểm soát rủi ro.


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

//@version=3
// SW SVE - Stochastic+Vol+EMAs [Sergio Waldoke]
// Script created by Sergio Waldoke (BETA VERSION v0.5, fine tuning PENDING)
// Stochastic process is the main source of signals, reinforced on buying by Volume. Also by Golden Cross.
// Selling is determined by K and D entering overselling zone or EMA's Death Cross signal, the first occurring,
// and some other signals combined.
// Buy Long when you see a long buy arrow.
// Sell when you see a close arrow.
// This is a version to be tuned and improved, but already showing excelent results after tune some parameters
// according to the kind of market.
// Strategy ready for doing backtests.

// SVE SYSTEM DESIGN:
// Buy Signal Trigger:
// - Both Stoch <= 20 crossing up and both growing and green candle and Vol/sma vol >= 1.40 Avg Vol
//   or
// - Both Stoch growing up and Vol/sma vol >= 1.40 Avg Vol and green candle and
//   both prior Stoch crossing up
//   or
//   [OPTIONAL]: (Bad for BTC 2018, excelent for 2017)
// - Crossingover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and green candle

// Exit position:
// - Both Stoch <= 20 and Both Stoch were > 20 during position
//   or
// - CrossingUnder(Fast EMA, Medium EMA)
//   or   [OPTIONAL] (Better for BTC 2018, Worse for BNB 1H)
// - CrossingUnder(k, d) and (k and d starting over over_buying) and (k and d descending) and k crossing down over_buying line

//calc_on_every_tick=true,
//calc_on_order_fills=true,   (affects historical calculation, triggers in middle of the bar, may be better for automatic orders)
strategy("SW SVE - Stochastic+Vol+EMAs [Sergio Waldoke]", shorttitle="SW SVE", overlay=true, max_bars_back=5000,
         default_qty_type=strategy.percent_of_equity, default_qty_value=100, currency="USD",
         commission_type=strategy.commission.percent, commission_value=0.25)

//Strategy Parameters
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromYear  = input(defval = 2018, title = "From Year", minval = 2009, maxval = 2200)
ToDay     = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToMonth   = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToYear    = input(defval = 2030, title = "To Year", minval = 2009, maxval = 2200)

//Indicator Parameters
//Original defaults for 4HS: 14, 3, 80, 20,   14, 23, 40,   20, 40,   3:
stoch_k = input(title="Stoch K",  defval=14, minval=1)
stoch_d = input(title="Stoch D",  defval=3, minval=1)
over_buying  = input(title="Stoch Overbuying Zone",  defval=80, minval=0, maxval=100)
over_selling = input(title="Stoch Overselling Zone",  defval=20, minval=0, maxval=100)

fast_ema_periods = input(title="Fast EMA (Death Cross)",  defval=14, minval=1, maxval=600)
slow_ema_periods = input(title="Slow EMA (Death Cross)",  defval=23, minval=1, maxval=600)
trend_ema_periods = input(title="Slowest EMA (Trend Test)",  defval=40, minval=1, maxval=600)

volume_periods = input(title="Volume Periods",  defval=20, minval=1, maxval=600)
volume_factor = input(title="Min Volume/Media Increase (%)",  defval=80, minval=-100) / 100 + 1

threshold_sl_perc = input(title="[Sell Trigger] Stop Loss Threshold %", defval=6.0, type=float, minval=0, maxval=100)

//before_buy = input(title="# Growing Before Buy",  defval=2, minval=1)
//before_sell = input(title="# Decreasing Before Sell",  defval=1, minval=1)
//stepsignal = input(title="Show White Steps", type=bool, defval=true)
//steps_base = input(title="White Steps Base",  defval=242, minval=0)

//Signals
fast_ema = ema(close, fast_ema_periods)
slow_ema = ema(close, slow_ema_periods)
trend_ema = ema(close, trend_ema_periods)
k = stoch(close, high, low, stoch_k)
d = sma(k, stoch_d)
vol_ma = sma(volume, volume_periods)

//REVIEW CONSTANT 1.75:
in_middle_zone(a) => a > over_selling * 1.75 and a < over_buying
growing(a) => a > a[1] 

was_in_middle_zone = k == d
was_in_middle_zone := was_in_middle_zone[1] or in_middle_zone(k) and in_middle_zone(d)

//Buy Signal Trigger:
//- Both Stoch <= 20 crossing up and both growing and 
//  green candle and Vol/sma vol >= 1.40 Avg Vol
buy = k <= over_selling and d <= over_selling and crossover(k, d) and growing(k) and growing(d) and
      close > open and volume/vol_ma >= volume_factor

//or
//- Both Stoch growing up and Vol/sma vol >= 1.40 Avg Vol and green candle and
//  both prior Stoch crossing up
buy := buy or (growing(k) and growing(d) and volume/vol_ma >= volume_factor and close > open and
              crossover(k[1], d[1]) )
//Worse:
//              (crossover(k[1], d[1]) or (crossover(k, d) and k[1] <= over_selling and d[1] <= over_selling) ) )

//or
//  [OPTIONAL]: (Bad for BTC 2018, excelent for 2017)
//- Crossingover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and green candle
buy := buy or (crossover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and close > open)


//Debug:
//d1 = close > open  ? 400 : 0
//plot(d1+5200, color=white, linewidth = 3, style = stepline)

//Exit position:
//- Both Stoch <= 20 and Both Stoch were > 20 during position
sell = k <= over_selling and d <= over_selling and was_in_middle_zone

//  or
//- CrossingUnder(Fast EMA, Medium EMA)
sell := sell or crossunder(fast_ema, slow_ema)

//  or  [OPTIONAL] (Better for BTC 2018, Worse for BNB 1H)
//- CrossingUnder(k, d) and (k and d starting over over_buying) and (k and d descending) and k crossing down over_buying line
sell := sell or (crossunder(k, d) and k[1] >= over_buying and d[1] >= over_buying and
                 not growing(k) and not growing(d) and k <= over_buying)

color = buy ? green : red

bought_price = close
bought_price := nz(bought_price[1])

already_bought = false
already_bought := nz(already_bought[1], false)

//Date Ranges
buy  := buy and  not already_bought


//d1 = buy ? 400 : 0
//plot(d1+6500, color=white, linewidth = 3, style = stepline)

was_in_middle_zone := (not buy and was_in_middle_zone) or (in_middle_zone(k) and in_middle_zone(d))

already_bought   := already_bought[1] or buy
bought_price := buy ? close * (1 - threshold_sl_perc/100) : bought_price[1]
trigger_SL = close < bought_price[0]
sell := sell or trigger_SL

sell := sell and  
                 already_bought and not buy and (was_in_middle_zone or trigger_SL)

//plot((sell?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)
                 
already_bought   := already_bought[0] and not sell
bought_price := sell ? 0 : bought_price[0]

//plot((was_in_middle_zone?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)

was_in_middle_zone := not sell and was_in_middle_zone

//Plot signals
plot(fast_ema, title="Fast EMA", color=red, linewidth = 4)
plot(slow_ema, title="Slow EMA", color=blue, linewidth = 4)
plot(trend_ema, title="Trend EMA", color=yellow, linewidth = 4)

//Stop Loss
plot(bought_price, color=gray, linewidth=2, style=cross, join=true, title="Stop Loss")

//Y = stepsignal ? lowest(40) : na
//Y = steps_base
//plot(mysignal+Y, title="Steps", color=white, linewidth = 3, style = stepline)
//Unit steps - for debugging
//plot(mysteps+Y, title="Steps2", color=yellow, linewidth = 3, style = stepline)

//Bought or not - for debugging
//plot((already_bought?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)
//plot((sell?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)

plotshape(buy, title="Buy arrows", style=shape.arrowup, location=location.belowbar, color=color, text="Buy", textcolor=color, size=size.huge, transp=30)
plotshape(sell, title="Sell arrows", style=shape.arrowdown, location=location.abovebar, color=color, text="Sell", textcolor=color, size=size.huge, transp=30)

//if n>2000
strategy.entry("buy", strategy.long, when=buy)
strategy.close_all(when=sell)

//plot(strategy.equity, title="Equity", color=white, linewidth = 4, style = line)

//AlertS trigger
//msg = "[SW Magic Signals EMA] BUY/SELL Signal has been triggered." + "(" + tostring(fastema) + ", " + tostring(slowema) + ") on " + tickerid + ", " + period + "."
msg = "SW SVE BUY/SELL Signal has been triggered. (#, #) on EXCH:PAIR, period: #."

alertcondition(buy or sell, title="SW SVE (BUY/SELL SIGNAL)", message=msg)
alertcondition(buy, title="SW SVE (BUY SIGNAL)", message=msg)
alertcondition(sell, title="SW SVE (SELL SIGNAL)", message=msg)


Thêm nữa