Titik Pivot dan Fibonacci Retracement Berasaskan Trend Automatik Mengikut Strategi

Penulis:ChaoZhang, Tarikh: 2024-01-05 11:34:17
Tag:

img

Ringkasan

Strategi ini secara automatik mengenal pasti corak ABC dalam harga saham berdasarkan titik pivot dan nisbah retracement Fibonacci, dan menghasilkan isyarat panjang / pendek. Ia menggunakan titik pivot untuk menentukan gelombang harga dan mengira nisbah retracement Fibonacci antara gelombang ABC. Jika nisbah memenuhi kriteria tertentu, isyarat perdagangan dihasilkan.

Logika Strategi

  1. Mengira titik tertinggi dan terendah saham
  2. Menghakimi jika harga telah jatuh dari titik tinggi sebelumnya atau meningkat dari titik rendah sebelumnya
  3. Mengira nisbah retracement Fibonacci antara gelombang semasa dan gelombang sebelumnya
  4. Jika nisbah retracement kedua-dua gelombang ke atas dan ke bawah adalah dalam julat yang betul, menentukan corak ABC yang berpotensi
  5. Selepas pengesahan corak ABC, tetapkan stop loss di Titik C untuk panjang, dan Titik A untuk pendek.

Analisis Kelebihan

  1. Titik pusingan mengenal pasti tahap sokongan / rintangan utama untuk meningkatkan ketepatan isyarat
  2. Fibonacci retracements menangkap titik perubahan trend dengan mengenal pasti corak ABC
  3. Peraturan keuntungan / kerugian yang jelas mengelakkan kerugian besar

Analisis Risiko

  1. Titik pusingan dan retracement Fibonacci tidak dapat memastikan pengenalan sempurna setiap titik perubahan trend. Penilaian yang salah mungkin berlaku.
  2. Titik C dan Titik A berhenti boleh ditembusi, membawa kepada kerugian yang lebih besar
  3. Parameter seperti julat nisbah retracement Fibonacci memerlukan pengoptimuman lanjut

Arahan pengoptimuman

  1. Menggabungkan lebih banyak penunjuk teknikal untuk membantu pengesahan corak ABC, meningkatkan ketepatan isyarat
  2. Mengoptimumkan julat nisbah retracement Fibonacci untuk memenuhi keadaan pasaran yang lebih banyak
  3. Menggunakan kaedah pembelajaran mesin untuk melatih model pengenalan corak ABC

Kesimpulan

Strategi ini mengenal pasti corak ABC untuk menjana isyarat panjang / pendek pada titik perubahan trend, berdasarkan pengesahan titik pusingan tahap sokongan / rintangan utama, dan pengiraan nisbah retracement Fibonacci. Logiknya mudah dan bersih, dengan peraturan keuntungan / kerugian yang munasabah yang mengawal risiko dengan berkesan. Walau bagaimanapun, beberapa risiko penilaian yang salah tetap ada, yang memerlukan pengoptimuman dan penambahbaikan lanjut untuk memenuhi keadaan pasaran yang lebih banyak.


/*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)


Lebih lanjut