Điểm trục và Fibonacci Retracement dựa trên xu hướng tự động theo chiến lược

Tác giả:ChaoZhang, Ngày: 2024-01-05 11:34:17
Tags:

img

Tổng quan

Chiến lược này tự động xác định các mô hình ABC trong giá cổ phiếu dựa trên các điểm trục và tỷ lệ khôi phục Fibonacci, và tạo ra các tín hiệu dài / ngắn. Nó sử dụng các điểm trục để xác định sóng giá và tính tỷ lệ khôi phục Fibonacci giữa các sóng ABC. Nếu tỷ lệ đáp ứng một số tiêu chí nhất định, các tín hiệu giao dịch được tạo ra.

Chiến lược logic

  1. Tính toán điểm cao và thấp của cổ phiếu
  2. Xác định xem giá đã giảm từ mức cao trước đó hoặc tăng từ mức thấp trước đó
  3. Tính toán tỷ lệ khôi phục Fibonacci giữa sóng hiện tại và sóng trước
  4. Nếu tỷ lệ rút lại của cả hai sóng lên và xuống trong phạm vi thích hợp, xác định một mô hình ABC tiềm năng
  5. Sau khi xác nhận mô hình ABC, đặt dừng lỗ tại điểm C cho dài, và điểm A cho ngắn.

Phân tích lợi thế

  1. Các điểm pivot xác định các mức hỗ trợ / kháng cự chính để cải thiện độ chính xác tín hiệu
  2. Fibonacci retracements nắm bắt các điểm chuyển hướng xu hướng bằng cách xác định các mô hình ABC
  3. Các quy tắc lợi nhuận/mất rõ ràng tránh mất mát lớn

Phân tích rủi ro

  1. Các điểm pivot và Fibonacci không thể đảm bảo xác định hoàn hảo mọi điểm chuyển hướng xu hướng.
  2. Điểm C và điểm A dừng lại có thể được phá vỡ, dẫn đến tổn thất lớn hơn
  3. Các thông số như phạm vi tỷ lệ khôi phục Fibonacci cần tối ưu hóa thêm

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

  1. Kết hợp nhiều chỉ số kỹ thuật hơn để hỗ trợ xác nhận mẫu ABC, cải thiện độ chính xác tín hiệu
  2. Tối ưu hóa phạm vi tỷ lệ Fibonacci để phù hợp với nhiều điều kiện thị trường hơn
  3. Sử dụng các phương pháp học máy để đào tạo các mô hình nhận dạng mẫu ABC

Kết luận

Chiến lược này xác định các mô hình ABC để tạo ra tín hiệu dài / ngắn tại các điểm chuyển đổi xu hướng, dựa trên xác nhận điểm pivot của các mức hỗ trợ / kháng cự chính và tính toán tỷ lệ khôi phục Fibonacci.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-19 23:59:59
period: 1m
basePeriod: 1m
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/
// © kerok3g

//@version=5
strategy("ABCD Strategy", shorttitle="ABCDS", overlay=true, commission_value=0.04)
calcdev(fprice, lprice, fbars, lbars) =>
    rise = lprice - fprice
    run = lbars - fbars
    avg = rise/run
    ((bar_index - lbars) * avg) + lprice

len = input(5)

ph = ta.pivothigh(len, len)
pl = ta.pivotlow(len, len)

var bool ishigh = false
ishigh := ishigh[1]

var float currph = 0.0
var int currphb = 0
currph := nz(currph)
currphb := nz(currphb)

var float oldph = 0.0
var int oldphb = 0
oldph := nz(oldph)
oldphb := nz(oldphb)

var float currpl = 0.0
var int currplb = 0
currpl := nz(currpl)
currplb := nz(currplb)

var float oldpl = 0.0
var int oldplb = 0
oldpl := nz(oldpl)
oldplb := nz(oldplb)

if (not na(ph))
    ishigh := true
    oldph := currph
    oldphb := currphb
    currph := ph
    currphb := bar_index[len]
else
    if (not na(pl))
        ishigh := false
        oldpl := currpl
        oldplb := currplb
        currpl := pl
        currplb := bar_index[len]

endHighPoint = calcdev(oldph, currph, oldphb, currphb)
endLowPoint = calcdev(oldpl, currpl, oldplb, currplb)

plotshape(ph, style=shape.triangledown, color=color.red, location=location.abovebar, offset=-len)
plotshape(pl, style=shape.triangleup, color=color.green, location=location.belowbar, offset=-len)

// var line lnhigher = na
// var line lnlower = na
// lnhigher := line.new(oldphb, oldph, bar_index, endHighPoint)
// lnlower := line.new(oldplb, oldpl, bar_index, endLowPoint)
// line.delete(lnhigher[1])
// line.delete(lnlower[1])

formlong = oldphb < oldplb and oldpl < currphb and currphb < currplb
longratio1 = (currph - oldpl) / (oldph - oldpl)
longratio2 = (currph - currpl) / (currph - oldpl)

formshort = oldplb < oldphb and oldphb < currplb and currplb < currphb
shortratio1 = (oldph - currpl) / (oldph - oldpl)
shortratio2 = (currph - currpl) / (oldph - currpl)

// prevent multiple entry for one pattern
var int signalid = 0
signalid := nz(signalid[1])

longCond = formlong and 
           longratio1 < 0.7 and 
           longratio1 > 0.5 and 
           longratio2 > 1.1 and 
           longratio2 < 1.35 and 
           close < oldph and 
           close > currpl and 
           signalid != oldplb
if (longCond)
    signalid := oldplb
    longsl = currpl - ta.tr
    longtp = ((close - longsl) * 1.5) + close
    strategy.entry("Long", strategy.long)
    strategy.exit("Exit Long", "Long", limit=math.min(longtp, oldph), stop=longsl)

shortCond = formshort and 
             shortratio1 < 0.7 and 
             shortratio1 > 0.5 and 
             shortratio2 > 1.1 and 
             shortratio2 < 1.35 and 
             close > oldpl and 
             close < currph and 
             signalid != oldphb

if (shortCond)
    signalid := oldphb
    shortsl = currph + ta.tr
    shorttp = close - ((shortsl - close) * 1.5)
    strategy.entry("Short", strategy.short)
    strategy.exit("Exit Short", "Short", limit=math.max(shorttp, oldpl), stop=shortsl)


Thêm nữa