Chiến lược cao / thấp bị hỏng

Tác giả:ChaoZhang, Ngày: 2023-12-22 12:59:43
Tags:

img

Tổng quan

Chiến lược Broken High/Low là một chiến lược theo xu hướng theo dõi sự đột phá giá vượt quá mức cao hoặc thấp của ngọn nến trước đó.

Chiến lược logic

Các điều kiện chính cho nhập cảnh và xuất cảnh được xác định bởi chiến lược này là:

  1. Xác định nếu ngọn nến là màu xanh lá cây hoặc màu đỏ để xác định nếu nó là một nến lên hoặc nến xuống
  2. Kiểm tra xem nến hiện tại phá vỡ cao hoặc thấp của nến trước đó
  3. Sử dụng trung bình di chuyển nhanh và chậm để xác định hướng xu hướng
  4. Đi dài khi một nến lên phá vỡ trên cao của một nến xuống trước đó, đi ngắn khi một nến xuống phá vỡ dưới thấp của một nến lên trước đó
  5. Các điều kiện thoát được kích hoạt bằng cách dừng lỗ hoặc dừng theo dõi; cũng có thể thoát ngay lập tức nếu một ngọn nến đảo ngược xuất hiện

Chiến lược này cũng sử dụng các bộ lọc dựa trên nến đảo ngược thứ hai để tránh đột phá sai và đảm bảo độ tin cậy tín hiệu.

Phân tích lợi thế

  • Định hướng chiến lược rõ ràng, dễ hiểu các hoạt động đột phá
  • Đảm bảo đánh giá xu hướng chính xác bằng cách kết hợp hai đường trung bình động
  • Chặn kéo giúp khóa trong lợi nhuận nhiều hơn
  • Các bộ lọc nến đảo ngược giúp tránh đuổi theo đỉnh cao và giết chết đáy thấp

Phân tích rủi ro

  • Việc phá vỡ thất bại có thể gây ra tổn thất từ các hoạt động cực ngắn hạn
  • Rủi ro phá vỡ sai lớn hơn ở các thị trường giới hạn phạm vi
  • Trung bình di chuyển kép có thể bị chậm, dẫn đến lỗi phán đoán

Các biện pháp kiểm soát rủi ro:

  1. Chọn chỉ số hoặc chỉ số chuẩn chính để tránh rủi ro cao của các cổ phiếu riêng lẻ
  2. Tối ưu hóa các thông số trung bình động để cải thiện độ chính xác phán đoán
  3. Mở rộng phạm vi dừng lỗ hợp lý để kiểm soát lỗ giao dịch duy nhất

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

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

  1. Kiểm tra các kết hợp khác nhau của các thông số trung bình động
  2. Xét nghiệm kết hợp các chỉ số kỹ thuật khác để đánh giá kết hợp
  3. Tối ưu hóa các tham số của mức nhập cảnh và dừng lỗ
  4. Thêm các quy tắc lọc định lượng để chọn chất lượng cao cơ bản
  5. Kết hợp các thuật toán học máy để tối ưu hóa tham số thích nghi

Tóm lại

Chiến lược Broken High/Low nói chung là một chiến lược theo xu hướng trưởng thành. Với sự giúp đỡ của các đường trung bình động cho phán đoán phụ trợ, nó có thể nắm bắt một mức độ nhất định của xu hướng. Các cơ chế dừng lỗ và dừng kéo theo cũng giúp khóa lợi nhuận. Thông qua kiểm tra và tối ưu hóa liên tục, các thông số và hiệu suất của chiến lược này có thể trở nên nổi bật hơn.


/*backtest
start: 2022-12-15 00:00:00
end: 2023-12-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Broken High/Low Strategy", overlay=true, initial_capital = 5000, default_qty_value = 25, pyramiding = 10, default_qty_type= strategy.percent_of_equity)

useEMAForStop = input.bool(false, 'Use trail stop EMA', group = 'Exit strategy')
trailStopMALength = input(8, 'Trail stop EMA length', group = 'Exit strategy')

fastMALength = input(5 , 'Fast MA length', group = 'Trend strength')
fastEMAEnabled = input.bool(false, 'Fast EMA enabled (default is SMA)', group = 'Trend strength')

slowMALength = input(10, 'Slow MA length', group = 'Trend strength')
slowEMAEnabled = input.bool(false, 'Slow EMA enabled (default is SMA)', group = 'Trend strength')

ignoreSlowMA = input.bool(false, 'Use fast MA for trend ignoring slow MA', group = 'Trend strength')

useOpposingBarAsExit = input.bool(false, 'Using opposing bar as exit', group = 'Exit strategy')
secondEntryEnabled = input.bool(false, 'Second bar that eliminates opposing bar for entry', group = 'Trend strength')

longsEnabled = input.bool(true, 'Enable longs', group = 'Trade settings')
shortsEnabled = input.bool(true, 'Enable shorts', group = 'Trade settings')

fastMA = fastEMAEnabled ? ta.ema(close, fastMALength) : ta.sma(close, fastMALength)
slowMA = slowEMAEnabled ? ta.ema(close, slowMALength) : ta.sma(close, slowMALength)

FromMonth=input.int(defval=1,title="FromMonth",minval=1,maxval=12, group = 'Time filters')
FromDay=input.int(defval=1,title="FromDay",minval=1,maxval=31, group = 'Time filters')
FromYear=input.int(defval=1990,title="FromYear",minval=1900, group = 'Time filters')
ToMonth=input.int(defval=1,title="ToMonth",minval=1,maxval=12, group = 'Time filters')
ToDay=input.int(defval=1,title="ToDay",minval=1,maxval=31, group = 'Time filters')
ToYear=input.int(defval=9999,title="ToYear",minval=2017, group = 'Time filters')
start=timestamp(FromYear,FromMonth,FromDay,00,00)
finish=timestamp(ToYear,ToMonth,ToDay,23,59)
window()=>time>=start and time<=finish?true:false
afterStartDate = time >= start and time<=finish?true:false
closeTradesEOD = input.bool(false, 'Close trades end of day', group = 'Time filters')

trailStopMA = ta.ema(close, trailStopMALength)

isGreenCandle = close > open
isRedCandle = close < open
isBrokenHigh = close > open[1]
isPriorCandleRed = close[1] < open[1]
isPriorPriorCandleRed = close[2] < open[2]
isPriorPriorCandleGreen = close[2] > open[2]
isPriorCandleGreen = close[1] > open[1]
isBrokenLow = close < open[1]

isPriorRedCandleBroken = isGreenCandle and isPriorCandleRed and isBrokenHigh
isPriorGreenCandleBroken = isRedCandle and isPriorCandleGreen and isBrokenLow

isPriorPriorRedCandleBroken = secondEntryEnabled and not isPriorRedCandleBroken and isGreenCandle and isPriorPriorCandleRed ? close > open[2] : false
isPriorPriorGreenCandleBroken = secondEntryEnabled and not isPriorGreenCandleBroken and isRedCandle and isPriorPriorCandleGreen ? close < open[2] : false

longOpenCondition = (isPriorRedCandleBroken or isPriorPriorRedCandleBroken) and afterStartDate and (ignoreSlowMA ? close > fastMA : fastMA > slowMA) and longsEnabled
longCloseCondition = useOpposingBarAsExit ? isRedCandle : ta.crossunder(close, fastMA)
longCloseCondition := useEMAForStop ? ta.crossunder(close, trailStopMA) : longCloseCondition

shortOpenCondition = (isPriorGreenCandleBroken or isPriorPriorGreenCandleBroken) and afterStartDate and (ignoreSlowMA ? close < fastMA : fastMA < slowMA) and shortsEnabled
shortCloseCondition = useOpposingBarAsExit ? isGreenCandle : ta.crossover(close, fastMA)
shortCloseCondition := useEMAForStop ? ta.crossover(close, trailStopMA) : shortCloseCondition

if (longOpenCondition)
    strategy.entry("Long Entry", strategy.long)

if (longCloseCondition)
    strategy.close('Long Entry', 'Long Exit')

if (shortOpenCondition)
    strategy.entry("Short Entry", strategy.long)

if (shortCloseCondition)
    strategy.close('Short Entry', 'Short Exit')

if (closeTradesEOD and hour >= 14 and minute >= 30)
    strategy.close_all("EOD")

plot(useEMAForStop ? trailStopMA : na, linewidth = 2, color = color.red)
plot(fastMA)
plot(ignoreSlowMA ? na : slowMA, linewidth = 4)

Thêm nữa