Chiến lược giao dịch ngắn hạn dựa trên chỉ số Stochastic với Stop Loss đàn hồi

Tác giả:ChaoZhang, Ngày: 2023-09-28 10:45:41
Tags:

Tổng quan

Chiến lược này sử dụng chỉ số dao động Stochastic để xác định các điều kiện thị trường mua quá mức và bán quá mức cho giao dịch ngắn hạn.

Chiến lược logic

Logic đầu vào

Chỉ số dao động Stochastic bao gồm đường %K và đường %D. Khi đường %K vượt qua trên đường %D, một tín hiệu mua chéo vàng được tạo ra. Khi đường %K vượt qua dưới đường %D, một tín hiệu bán chéo chết được kích hoạt. Chiến lược này chỉ đơn giản theo các chéo trên chỉ số Stochastic để xác định các mục nhập.

Cụ thể, khi có dấu chéo vàng trên chỉ số Stochastic, nếu giá trị %K nhỏ hơn 80 (không quá mua), một vị trí dài sẽ được thực hiện.

GoLong=crossover(k,d) and k<80
GoShort=crossunder(k,d) and k>20

Ngừng suy nghĩ về mất mát

Chiến lược này sử dụng phương pháp dừng lỗ đàn hồi, thiết lập giá dừng dựa trên các điểm pivot trước đây, như được hiển thị dưới đây:

piv_high = pivothigh(high,1,1)
piv_low = pivotlow(low,1,1)

stoploss_long=valuewhen(piv_low,piv_low,0)
stoploss_short=valuewhen(piv_high,piv_high,0) 

Các pivot đại diện cho các mức hỗ trợ và kháng cự quan trọng. Nếu giá vượt qua mức pivot, vị trí sẽ được đóng và giá dừng lỗ sẽ theo dõi các điểm pivot thay đổi.

Ngoài ra, giá dừng cũng xem xét giá cao nhất và thấp nhất của giai đoạn hiện tại để tối ưu hóa hơn nữa:

if GoLong
    stoploss_long := low<pl ? low : pl
if GoShort
    stoploss_short := high>ph ? high : ph

Ưu điểm

  1. Sử dụng Stochastic để tránh theo đuổi đỉnh và đáy;

  2. Stop loss đàn hồi theo sau những thay đổi của thị trường và tối ưu hóa giá dừng;

  3. Dừng lỗ dựa trên điểm pivot breakout hiệu quả hơn;

  4. Tối ưu hóa giá dừng bằng cách sử dụng giá cao nhất và thấp nhất hiện tại làm cho dừng chính xác hơn.

Rủi ro và giải pháp

  1. Rủi ro tín hiệu sai từ Stochastic

    • Giải pháp: Xác nhận tín hiệu với các chỉ báo khác để tránh tín hiệu sai
  2. Rủi ro dừng lỗ bị ảnh hưởng và tăng lỗ

    • Giải pháp: Giảm khoảng cách dừng, hoặc sử dụng các phương pháp như Chandelier Exit
  3. Rủi ro về tần suất giao dịch và hoa hồng cao

    • Giải pháp: Nới lỏng các quy tắc nhập cảnh để giảm số lượng giao dịch

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

  1. Tối ưu hóa stop loss, sử dụng các phương pháp như Chandelier Exit, trailing stop, stop loss dao động vv

  2. Tối ưu hóa các quy tắc nhập cảnh với các chỉ số khác để tránh các tín hiệu sai Stochastic

  3. Tối ưu hóa việc thu lợi nhuận, sử dụng mục tiêu lợi nhuận sau, mục tiêu lợi nhuận dao động vv để tăng lợi nhuận

  4. Thêm kích thước vị trí, chẳng hạn như số lượng cố định cho mỗi giao dịch, tỷ lệ rủi ro cố định vv để kiểm soát rủi ro cho mỗi giao dịch

  5. Tối ưu hóa các thông số như K, D thời gian, làm mịn vv dựa trên thị trường khác nhau

Tóm lại

Chiến lược này đi vào dựa trên Stochastic overbought / oversold và quản lý rủi ro với stop loss đàn hồi. Nó có lợi thế tránh theo đuổi đà, dừng hiệu quả, nhưng cũng có một số rủi ro tín hiệu sai. Những cải tiến trong tương lai có thể được thực hiện trên các mục nhập, dừng, ra, quản lý rủi ro vv.


/*backtest
start: 2023-08-28 00:00:00
end: 2023-09-27 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

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

//@version=4
//strategy(title="TradingView Alerts to MT4 MT5 example with cancelling pending orders", commission_type=strategy.commission.cash_per_order, commission_value=0.00003, overlay=true, default_qty_value=100000, initial_capital=1000)

// This script was created for educational purposes only.
// It is showing how to create pending orders and cancel them
// Together with syntax to send these events through TradingView alerts system
// All the way to brokers for execution

TakeProfitLevel=input(400)

// **** Entries logic **** {
periodK = 13 //input(13, title="K", minval=1)
periodD = 3 //input(3, title="D", minval=1)
smoothK = 4 //input(4, title="Smooth", minval=1)
k = sma(stoch(close, high, low, periodK), smoothK)
d = sma(k, periodD)
// plot(k, title="%K", color=color.blue)
// plot(d, title="%D", color=color.orange)
// h0 = hline(80)
// h1 = hline(20)
// fill(h0, h1, color=color.purple, transp=75)

GoLong=crossover(k,d) and k<80
GoShort=crossunder(k,d) and k>20
// } End of entries logic

// **** Pivot-points and stop-loss logic **** {
piv_high = pivothigh(high,1,1)
piv_low = pivotlow(low,1,1)
var float stoploss_long=low
var float stoploss_short=high

pl=valuewhen(piv_low,piv_low,0)
ph=valuewhen(piv_high,piv_high,0)

if GoLong 
    stoploss_long := low<pl ? low : pl
if GoShort 
    stoploss_short := high>ph ? high : ph
plot(stoploss_long, color=color.lime, title="stoploss_long")
plot(stoploss_short, color=color.red, title="stoploss_short")
// } End of Pivot-points and stop-loss logic

CancelLong=crossunder(low,stoploss_long) and strategy.position_size[1]<=0 and strategy.position_size<=0
CancelShort=crossover(high,stoploss_short) and strategy.position_size[1]>=0 and strategy.position_size>=0
entry_distance=input(10, title="Entry distance for stop orders")

plotshape(CancelLong ? stoploss_long[1]-10*syminfo.mintick : na, location=location.absolute, style=shape.labelup, color=color.gray, textcolor=color.white, text="cancel\nlong", size=size.tiny)
plotshape(CancelShort ? stoploss_short[1]+10*syminfo.mintick : na, location=location.absolute, style=shape.labeldown, color=color.gray, textcolor=color.white, text="cancel\nshort", size=size.tiny)

strategy.entry("Long", strategy.long, when=GoLong, stop=close+entry_distance*syminfo.mintick)
strategy.exit("XLong", from_entry="Long", stop=stoploss_long, profit=TakeProfitLevel)
strategy.cancel("Long", when = CancelLong)
strategy.entry("Short", strategy.short, when=GoShort, stop=close-entry_distance*syminfo.mintick)
strategy.exit("XShort", from_entry="Short", stop=stoploss_short, profit=TakeProfitLevel)
strategy.cancel("Short", when = CancelShort)

if GoLong
    alertsyntax_golong='long offset=' + tostring(entry_distance) + ' slprice=' + tostring(stoploss_long) + ' tp=' + tostring(TakeProfitLevel)
    alert(message=alertsyntax_golong, freq=alert.freq_once_per_bar_close)
if GoShort
    alertsyntax_goshort='short offset=' + tostring(-entry_distance) + ' slprice=' + tostring(stoploss_short) + ' tp=' + tostring(TakeProfitLevel)
    alert(message=alertsyntax_goshort, freq=alert.freq_once_per_bar_close)
if CancelLong
    alertsyntax_cancellong='cancel long'
    alert(message=alertsyntax_cancellong, freq=alert.freq_once_per_bar_close)
if CancelShort
    alertsyntax_cancelshort='cancel short'
    alert(message=alertsyntax_cancelshort, freq=alert.freq_once_per_bar_close)
    


Thêm nữa