Chiến lược giao dịch định lượng áp lực hai chiều


Ngày tạo: 2023-11-02 13:56:23 sửa đổi lần cuối: 2023-11-02 13:56:23
sao chép: 0 Số nhấp chuột: 633
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch định lượng áp lực hai chiều

Tổng quan

Chiến lược giao dịch hai chiều áp lực là một chiến lược theo dõi xu hướng kết hợp các chỉ số ngẫu nhiên và các chỉ số giao dịch. Chiến lược này chủ yếu sử dụng các chỉ số ngẫu nhiên K và D và các chỉ số giao dịch để tạo ra tín hiệu mua và bán, hỗ trợ bởi các đồng bằng đường vàng và chết để tạo ra tín hiệu bổ sung.

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

Giao thức mua

Các tín hiệu mua hàng chính được kích hoạt bởi các logic sau:

  1. K và D cùng phá vỡ khu vực oversold (ví dụ 20), và tạo ra một đường chéo lên, và K và D cùng có xu hướng tăng

  2. Số lượng giao dịch cao hơn một ngưỡng nhất định (ví dụ: 1,4 lần số lượng giao dịch trung bình)

  3. Giá đóng cửa cao hơn giá mở cửa (đường K màu trắng)

Các tín hiệu mua thêm có thể đến từ:

  1. Kích thước trung bình: vượt qua đường EMA chậm trên đường EMA nhanh và hai đường trung bình cùng lúc tăng

  2. K và D cùng một lúc đi vào khu vực oversold từ mức thấp (ví dụ như tăng từ dưới 20 xuống 20 đến 80)

Bán tín hiệu

Các động cơ chính của tín hiệu bán hàng là:

  1. K-line và D-line cùng đi vào khu vực bán quá mức (ví dụ 80).

  2. Đường chết trung bình: Đường EMA nhanh dưới đường EMA chậm

  3. K đường dưới xuyên qua D đường và K và D đường cùng một xu hướng giảm

Tín hiệu dừng

Thiết lập một tỷ lệ phần trăm (ví dụ: 6%) của giá mua như là một đường dừng lỗ, và nếu giá giảm xuống đường này, nó sẽ kích hoạt bán lỗ.

Phân tích lợi thế chiến lược

  • Sử dụng chỉ số ngẫu nhiên kép để tránh tín hiệu giả
  • Kết hợp âm thanh lọc qua lại để đảm bảo xu hướng
  • Nhiều tín hiệu được chồng lên nhau để tăng độ chính xác
  • Đường trung bình giúp xác định xu hướng lớn
  • Thiết lập chiến lược kiểm soát rủi ro

Lợi thế 1: Chỉ số ngẫu nhiên kép tránh tín hiệu giả

Một chỉ số ngẫu nhiên có thể tạo ra một số lượng lớn tín hiệu giả. Chiến lược này sử dụng kết hợp hai chỉ số ngẫu nhiên K và D (đường trung bình di chuyển của K) để lọc hiệu quả các tín hiệu giả và đảm bảo độ tin cậy của tín hiệu.

Ưu điểm 2: Chuẩn bị âm thanh khi giao thông quá tải, đảm bảo xu hướng

Thêm điều kiện khối lượng giao dịch làm tiêu chuẩn phán đoán phụ trợ, yêu cầu khối lượng giao dịch cần vượt quá một mức nhất định, do đó lọc các điểm mua và bán phi xu hướng ở mức thấp, giảm nguy cơ bị đặt hàng.

Ưu điểm 3: Nhiều tín hiệu chồng lên nhau, tăng độ chính xác

Chiến lược tổng hợp các tín hiệu mua và bán của các chỉ số ngẫu nhiên, khối lượng giao dịch, và đường trung bình cần được kích hoạt cùng một lúc để tạo ra một tín hiệu giao dịch thực sự. Nhiều chỉ số chồng lên nhau có thể làm tăng độ tin cậy của tín hiệu.

Lợi thế 4: Đường trung bình giúp xác định xu hướng lớn

Thêm các quy tắc phán đoán đường trung bình, chẳng hạn như chỉ xem xét tín hiệu mua khi đường trung bình tăng lên cùng một lúc. Điều này có thể tránh mua ngược hoặc lên đỉnh, đánh giá xu hướng từ chu kỳ thời gian lớn.

Lợi thế 5: Thiết lập chiến lược kiểm soát rủi ro

Chiến lược này bao gồm thiết kế tín hiệu dừng lỗ, nếu giá giảm một tỷ lệ nhất định khi mua. Điều này có thể kiểm soát hiệu quả tổn thất tối đa của một giao dịch.

Phân tích rủi ro

  • Các tham số chính sách cần được thiết lập kỹ lưỡng, thiết lập không đúng cách có thể dẫn đến hiệu suất kém
  • Cài đặt điểm dừng cần tính đến rủi ro nhảy
  • Cần chú ý đến rủi ro tính thanh khoản của các loại giao dịch
  • Cần chú ý đến rủi ro chuỗi của chỉ số nhiều chu kỳ thời gian

Rủi ro 1: Các tham số chiến lược cần được thiết lập kỹ lưỡng

Chiến lược này bao gồm nhiều tham số, chẳng hạn như tham số chỉ số ngẫu nhiên, tham số đường trung bình, tham số số giao hàng. Các tham số này cần được tối ưu hóa cho các giống khác nhau, thiết lập không đúng cách có thể dẫn đến kết quả kém hấp dẫn.

Rủi ro 2: Đặt điểm dừng để tính đến rủi ro nhảy vọt

Khi thiết lập điểm dừng lỗ, cần xem xét khả năng giá sẽ nhảy vọt. Nếu điểm dừng lỗ quá gần với giá mua, nó có thể bị nhảy vọt dẫn đến dừng lỗ không cần thiết.

Rủi ro 3: Cần chú ý đến rủi ro tính thanh khoản của các loại giao dịch

Đối với các giống kém lưu động, quy tắc số lượng giao dịch có thể lọc ra quá nhiều tín hiệu. Tại thời điểm này, cần giảm giới hạn điều kiện số lượng giao dịch.

Rủi ro 4: Rủi ro theo thứ tự của các chỉ số có nhiều chu kỳ thời gian

Có thể xảy ra sự cố không phù hợp giữa các chỉ số chu kỳ khác nhau, điều này có thể ảnh hưởng đến độ chính xác của tín hiệu. Cần xác minh sự phù hợp của tín hiệu điểm.

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

Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:

  1. Tối ưu hóa tham số để tăng tính ổn định

  2. Thêm tham số điều chỉnh động cho phương pháp học máy

  3. Tối ưu hóa chiến lược dừng lỗ để giảm tỷ lệ dừng lỗ

  4. Thêm nhiều điều kiện lọc để giảm giao dịch

  5. Cố gắng duy nhất điều kiện hoặc chiến lược dừng để tăng lợi nhuận

Đường hướng 1: Tối ưu hóa các tham số để cải thiện tính ổn định

Các tham số chính có thể được tối ưu hóa thông qua các phương pháp có hệ thống hơn như thuật toán di truyền, đảm bảo các tham số có thể đạt được hiệu suất ổn định trong các chu kỳ thị trường khác nhau.

Hướng 2: Thêm tham số điều chỉnh động cho phương pháp học máy

Mô hình có thể được đào tạo để đánh giá tình trạng thị trường trong thời gian thực và điều chỉnh các tham số chiến lược để tối ưu hóa các tham số động.

Đường 3: Tối ưu hóa chiến lược dừng lỗ để giảm tỷ lệ dừng lỗ

Có thể nghiên cứu các chiến lược dừng lỗ tốt hơn, giảm thiểu tổn thất không cần thiết và tăng lợi nhuận trong khi vẫn kiểm soát rủi ro.

Tiến độ 4: Thêm nhiều điều kiện lọc để giảm số lần giao dịch

Cần tăng cường các điều kiện lọc để giảm số lần giao dịch, giảm tác động của chi phí giao dịch, làm cho mỗi giao dịch mang lại lợi nhuận cao hơn.

Đường hướng 5: Thử các chiến lược đơn điều kiện hoặc dừng để cải thiện lợi nhuận

Theo đặc điểm của thị trường, có thể thiết kế một chiến lược duy nhất hoặc chiến lược dừng chân di động, đồng thời đảm bảo dừng lỗ, và tối đa hóa lợi nhuận.

Tóm tắt

Chiến lược tổng hợp xem xét nhiều khía cạnh như phán đoán xu hướng, kiểm soát rủi ro, tần suất giao dịch. Ưu điểm cốt lõi là chỉ số ngẫu nhiên kép kết hợp với xu hướng phán đoán chỉ số giao dịch, và cơ chế dừng lỗ kiểm soát rủi ro.

Mã nguồn chiến lược
/*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)