Pivot Point dan Fibonacci Retracement Berbasis Tren Otomatis Mengikuti Strategi

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

img

Gambaran umum

Strategi ini secara otomatis mengidentifikasi pola ABC dalam harga saham berdasarkan titik pivot dan rasio retracement Fibonacci, dan menghasilkan sinyal panjang/pendek.

Logika Strategi

  1. Menghitung titik tinggi dan rendah pivot saham
  2. Menghakimi apakah harga telah turun dari titik tinggi sebelumnya atau naik dari titik rendah sebelumnya
  3. Hitung rasio retracement Fibonacci antara gelombang saat ini dan gelombang sebelumnya
  4. Jika rasio retracement dari kedua gelombang ke atas dan ke bawah berada dalam kisaran yang tepat, menentukan pola ABC potensial
  5. Setelah konfirmasi pola ABC, atur stop loss di Point C untuk panjang, dan Point A untuk pendek.

Analisis Keuntungan

  1. Titik pivot mengidentifikasi tingkat pendukung/resistensi utama untuk meningkatkan akurasi sinyal
  2. Retracement Fibonacci menangkap titik balik tren dengan mengidentifikasi pola ABC
  3. Aturan laba rugi yang jelas menghindari kerugian besar

Analisis Risiko

  1. Titik pivot dan retracement Fibonacci tidak dapat memastikan identifikasi sempurna dari setiap titik balik tren.
  2. Titik C dan Titik A berhenti dapat dipecahkan, menyebabkan kerugian yang lebih besar
  3. Parameter seperti rentang rasio retracement Fibonacci membutuhkan optimasi lebih lanjut

Arahan Optimasi

  1. Masukkan lebih banyak indikator teknis untuk membantu konfirmasi pola ABC, meningkatkan akurasi sinyal
  2. Mengoptimalkan rentang rasio retracement Fibonacci agar sesuai dengan kondisi pasar
  3. Menggunakan metode pembelajaran mesin untuk melatih model pengenalan pola ABC

Kesimpulan

Strategi ini mengidentifikasi pola ABC untuk menghasilkan sinyal panjang/pendek pada titik balik tren, berdasarkan konfirmasi titik pivot dari level support/resistance utama, dan perhitungan rasio retracement Fibonacci. Logika sederhana dan bersih, dengan aturan profit/loss yang masuk akal yang secara efektif mengendalikan risiko. Namun, beberapa risiko penilaian yang salah tetap ada, yang membutuhkan optimasi dan perbaikan lebih lanjut untuk memenuhi kondisi pasar 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 banyak