Chiến lược kênh hồi quy động


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

Chiến lược kênh hồi quy động

Tổng quan

Chiến lược quay trở động là một chiến lược giao dịch định lượng sử dụng phương pháp quay trở tuyến tính để phân tích xu hướng giá và kết hợp với dừng động để theo dõi xu hướng. Chiến lược này sử dụng sự quay trở tuyến tính để vẽ kênh giá, đánh giá các tín hiệu của giá vượt qua kênh, phát ra lệnh mua và bán.

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

Chiến lược này bắt đầu bằng cách tính toán đường cong hồi quy tuyến tính của giá để xác định xem giá có phá vỡ đường quay trở lên hoặc xuống không. Khi giá vượt qua đường quay trở lên, nó tạo ra tín hiệu mua; Khi giá rơi xuống đường quay trở lại, nó tạo ra tín hiệu bán.

Sau khi tham gia thị trường, chiến lược sẽ theo dõi trong thời gian thực khi giá phá vỡ đường trung bình dừng lỗ. Nếu đặt hàng nhiều, giá giảm xuống đường trung bình dừng lỗ, sẽ phát hành lệnh bán dừng lỗ; Nếu đặt hàng trống, giá vượt quá đường trung bình dừng lỗ, sẽ phát hành lệnh mua dừng lỗ.

Cần lưu ý rằng nếu giá phá vỡ lại kênh thực hiện hoạt động đảo ngược, chiến lược sẽ ngay lập tức xóa vị trí ban đầu và thay thế cho giao dịch đảo ngược.

Phân tích lợi thế

Chiến lược này kết hợp xu hướng và tư duy giao dịch đảo ngược, có thể tuân theo xu hướng tổng thể của giá cả, đồng thời nắm bắt cơ hội điều chỉnh ngắn hạn. Chiến lược dừng lỗ được cập nhật trong thời gian thực cũng có thể kiểm soát rủi ro một cách hiệu quả và là một phương pháp giao dịch cân bằng hơn.

So với chiến lược đường trung bình di chuyển đơn giản, chiến lược đường quay trở động nhạy cảm hơn với sự thay đổi giá và có thể làm giảm sai lệch giao dịch. Ngoài ra, chiến lược này chỉ được thực hiện khi giá phá vỡ đường dẫn lên và xuống đường, có lợi cho việc tránh giao dịch tích cực không có trật tự.

Phân tích rủi ro

Chiến lược này chủ yếu đối mặt với rủi ro do sự phù hợp không chính xác của đường cong trở lại. Nếu phạm vi đường quay trở lại được thiết lập không đúng cách, quá rộng, sẽ làm tăng khả năng giao dịch không hiệu quả. Nếu đường quay trở lại quá hẹp, bạn sẽ bỏ lỡ cơ hội giao dịch.

Ngoài ra, thiết lập vị trí dừng cũng rất quan trọng. Đặt dừng quá gần, dễ bị kích hoạt bởi biến động giá ngắn hạn; và dừng quá thoải mái không có tác dụng kiểm soát rủi ro. Cần điều chỉnh tham số theo các giống khác nhau.

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

Các tham số tối ưu hóa tự động theo chu kỳ hoặc giống khác nhau có thể được xem xét để làm cho các đường quay trở lại và đường dừng lại phù hợp hơn với xu hướng giá. Ví dụ: các tham số tối ưu có thể được đào tạo kết hợp với thuật toán học máy.

Mặt khác, bạn có thể thử các loại phương pháp quay trở khác nhau, chẳng hạn như quay trở đa phương thức, quay trở có trọng lượng cục bộ, để có hiệu quả phù hợp tốt hơn. Hoặc kết hợp nhiều chỉ số quay trở để xây dựng quy tắc giao dịch, tăng sự ổn định của chiến lược.

Tóm tắt

Chiến lược quay trở động tổng hợp sử dụng phương pháp phân tích xu hướng và đảo ngược để giao dịch, nắm bắt cơ hội điều chỉnh ngắn hạn trong khi tuân thủ xu hướng giá tổng thể. Việc thiết lập các vị trí quay trở và dừng lỗ quan trọng có ảnh hưởng quan trọng đến hiệu quả của chiến lược.

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

//@version=5
strategy("Estratégia de Regressão Linear", shorttitle="Regressão Linear Estratégia", overlay=true, initial_capital = 100, default_qty_value = 10, default_qty_type = strategy.percent_of_equity)

// média móvel exponencial para definição de regressao linear
var SlopeEMASize = input.int(defval = 21, title = "Slope EMA" )
// ema_length = 21
slope_ema = ta.ema(close, SlopeEMASize)

// média móvel exponencial para definição de nivel de stop
var StopEMASize = input.int(defval = 13, title = "Stop EMA" )
stop_ema = ta.ema(close, StopEMASize)

// Variáveis para controle de posição
var float long_stop_level = na
var float long_entry_level = na
var bool long_signal = false
var bool long_order_open = false
var int long_order_id = 0


var float short_stop_level = na
var float short_entry_level = na
var bool short_signal = false
var bool short_order_open = false
var int short_order_id = 0

// Regressão linear para uso como sinal de entrada 
var SlopeLenght = input.int(defval = 21, title = "Slope Lenght" )
entry_signal = ta.linreg(slope_ema, SlopeLenght, 0)

//Variaveis com a indicação do pivot da regressao
long_entry_signal = ta.crossover(entry_signal, entry_signal[1])
short_entry_signal = ta.crossunder(entry_signal, entry_signal[1])

// Condição de entrada (reversão da regressão)
if long_entry_signal
    long_signal := true
    short_signal := false
    long_entry_level := high
    long_stop_level := low

if short_entry_signal
    short_signal := true
    long_signal := false
    short_entry_level := low
    short_stop_level := high


// Indica quando o preço cruzou o nível de stop 
price_cross_stop_ema_up = ta.crossover(close, stop_ema)
price_cross_stop_ema_down = ta.crossunder(close, stop_ema)

// Mover o stop quando o preço cruzar a nível stop e operação long ativa
if long_signal and long_order_open and price_cross_stop_ema_down
    if low > long_entry_level
        long_stop_level := high

// Mover o stop quando o preço cruzar a nível stop e operação short ativa
if short_signal and short_order_open and price_cross_stop_ema_up
    if high < short_stop_level
        short_stop_level := low

// Sair da posição se houver nova reversão da regressão
if long_order_open or short_order_open
    if long_entry_signal //and short_order_open
        strategy.close(str.tostring(short_order_id), comment ="Inversão Sinal("+str.tostring(short_order_id)+")")
        short_order_open:= false
    if short_entry_signal //and long_order_open
        strategy.close(str.tostring(long_order_id), comment = "Inversão Sinal("+str.tostring(long_order_id)+")")
        long_order_open:=false

// Sinais de compra e venda com base no stop
if long_signal and close > long_entry_level and not long_order_open
    if strategy.opentrades != 0
        strategy.cancel_all()

    long_order_id+=1
    // strategy.order(str.tostring(long_order_id), strategy.long, comment="Open Long("+str.tostring(long_order_id)+")", limit = long_entry_level) 
    strategy.entry(str.tostring(long_order_id), strategy.long, comment="Open Long("+str.tostring(long_order_id)+")", limit = long_entry_level)
    long_order_open := true
    // log.info("Open Long:"+str.tostring(long_order_id))

if short_signal and close < short_entry_level and not short_order_open
    if strategy.opentrades != 0
        strategy.cancel_all()

    short_order_id+=1
    // strategy.order(str.tostring(short_order_id), strategy.short, comment="Open Short("+str.tostring(short_order_id)+")", limit = short_entry_level)
    strategy.entry(str.tostring(short_order_id), strategy.short, comment="Open Short("+str.tostring(short_order_id)+")", limit = short_entry_level)
    short_order_open := true
    // log.info("Open Short:"+str.tostring(short_order_id))

// Sinais de compra e venda com base no stop
if long_signal and close < long_stop_level and long_order_open
    strategy.close(str.tostring(long_order_id), comment = "Stop Atingido("+str.tostring(long_order_id)+")", immediately = true)
    long_order_open := false

if short_signal and close > short_stop_level and short_order_open
    strategy.close(str.tostring(short_order_id),comment = "Stop Atingido("+str.tostring(short_order_id)+")", immediately = true)
    short_order_open := false

// Plotagem da regressão e do stop

plot(stop_ema, title="Stop Signal", color=color.red)
plot(entry_signal,"Entry Signal", linewidth = 5, color = color.rgb(155, 0, 140))

plotshape(long_order_open?long_stop_level:na, title = "Long Stop Level", color = color.green, location = location.absolute)
plotshape(long_order_open?long_entry_level:na, title="Long Entry Value",location=location.absolute, color = color.green, style = shape.circle)
plotshape(series=long_entry_signal, title="Long Signal", location=location.abovebar, color=color.green, style=shape.triangleup, size=size.small, text = "Long Signal")

plotshape(short_order_open?short_stop_level:na, title = "Short Stop Level", color = color.red, location = location.absolute)
plotshape(short_order_open?short_entry_level:na, title="Short Entry Value",location=location.absolute, color = color.red, style = shape.circle)

plotshape(series=short_entry_signal, title="Short Signal", location=location.belowbar, color=color.red, style=shape.triangledown, size=size.small, text="Short Signal")