Fibonacci Retracement Strategi Stop Loss Dinamis

Penulis:ChaoZhang, Tanggal: 2024-02-06 14:33:06
Tag:

img

Gambaran umum

Strategi ini memanfaatkan tingkat retracement Fibonacci untuk secara otomatis mengatur stop loss dan mengambil harga profit untuk manajemen posisi.

Logika Strategi

Inti dari strategi ini bergantung pada indikator retracement Fibonacci untuk menentukan tingkat dukungan dan resistensi utama. Ini melacak puncak dan terendah baru-baru ini untuk memetakan 10 zona harga Fibonacci. Berdasarkan konfigurasi, salah satu tingkat Fibonacci dipilih sebagai pemicu masuk. Ketika harga pecah di atas tingkat itu, pesanan panjang akan ditempatkan berdasarkan leverage yang dikonfigurasi. Pada saat yang sama, harga mengambil keuntungan ditetapkan pada persentase tertentu di atas harga masuk.

Setelah masuk, strategi terus melacak tingkat Fibonacci yang diperbarui. Jika tingkat Fib yang lebih rendah muncul, yang menunjukkan potensi pembalikan, strategi akan membatalkan pesanan yang ada dan menempatkan kembali pesanan dengan harga yang lebih rendah sebagai mekanisme stop loss. Ketika harga akhirnya melanggar di atas harga take profit, posisi akan ditutup untuk keuntungan.

Keuntungan

Keuntungan terbesar dari strategi ini adalah kemampuan untuk menyesuaikan stop loss secara dinamis dan mengambil harga keuntungan untuk pasar tren.

  1. Menangkap keuntungan yang lebih besar dalam kondisi tren dengan trailing berhenti berdasarkan harga masuk.

  2. Mengurangi kerugian dalam konsolidasi dengan berhenti di tingkat Fib yang lebih rendah.

  3. Memungkinkan piramida dengan menambahkan ke posisi ketika harga turun persentase tertentu dari harga masuk terakhir.

  4. Mudah dioperasikan dengan pemesanan otomatis setelah dikonfigurasi dengan benar.

Risiko

Masih ada beberapa risiko yang harus diketahui:

  1. Cenderung untuk berhenti berulang kali selama pasar samping, meningkatkan biaya.

  2. Tidak ada mekanisme stop loss yang tetap, risiko penarikan besar.

  3. Piramida yang tak tertutup bisa memperburuk kerugian.

Solusi yang sesuai:

  1. Hentikan perdagangan ketika harga berosilasi dalam kisaran.

  2. Memantau pasar secara manual dan menutup posisi jika perlu.

  3. Tetapkan batas atas perintah piramida.

Peluang Peningkatan

Masih banyak ruang untuk optimasi:

  1. Tambahkan indikator tambahan seperti EMA, MACD untuk konfirmasi entri tambahan untuk menghindari pecah palsu.

  2. Mengintegrasikan mekanisme stop loss tetap/trailing untuk membatasi kerugian dalam kondisi ekstrem.

  3. Memperbaiki logika piramida berdasarkan rezim pasar untuk mencegah leverage yang berlebihan.

  4. Menggunakan model pembelajaran mesin seperti LSTM untuk memprediksi harga dan mengidentifikasi masuk/keluar yang lebih baik.

Kesimpulan

Secara singkat, strategi ini cocok untuk skenario trend memudar. Dengan terus menyesuaikan berhenti memungkinkan mengendarai tren secara efektif. Optimasi yang tepat dan guardrail diperlukan menangani kondisi pasar yang lebih rumit.


/*backtest
start: 2024-01-06 00:00:00
end: 2024-02-05 00:00:00
period: 1h
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/
// © CryptoRox

//@version=4
//Paste the line below in your alerts to run the built-in commands.
//{{strategy.order.alert_message}}
strategy(title="Fibs limit only", shorttitle="Strategy", overlay=true, precision=8, pyramiding=1000, commission_type=strategy.commission.percent, commission_value=0.04)

//Settings 
testing = input(false, "Live")
//Use epochconverter or something similar to get the current timestamp.
starttime = input(1600976975, "Start Timestamp") * 1000
//Wait XX seconds from that timestamp before the strategy starts looking for an entry.
seconds = input(60, "Start Delay") * 1000
testPeriod = true


leverage = input(1, "Leverage")
tp = input(1.0, "Take Profit %") / leverage
dca = input(-1.0, "DCA when < %") / leverage *-1
fibEntry = input("1", "Entry Level", options=["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"])

//Strategy Calls
equity = strategy.equity
avg = strategy.position_avg_price
symbol = syminfo.tickerid
openTrades = strategy.opentrades
closedTrades = strategy.closedtrades
size = strategy.position_size

//Fibs
lentt = input(60, "Pivot Length")
h = highest(lentt)
h1 = dev(h, lentt) ? na : h
hpivot = fixnan(h1)
l = lowest(lentt)
l1 = dev(l, lentt) ? na : l
lpivot = fixnan(l1)
z = 400
p_offset= 2
transp = 60
a=(lowest(z)+highest(z))/2
b=lowest(z)
c=highest(z)

fib0 = (((hpivot - lpivot)) + lpivot)
fib1 = (((hpivot - lpivot)*.21) + lpivot)
fib2 = (((hpivot - lpivot)*.3) + lpivot)
fib3 = (((hpivot - lpivot)*.5) + lpivot)
fib4 = (((hpivot - lpivot)*.62) + lpivot)
fib5 = (((hpivot - lpivot)*.7) + lpivot)
fib6 = (((hpivot - lpivot)* 1.00) + lpivot)
fib7 = (((hpivot - lpivot)* 1.27) + lpivot)
fib8 = (((hpivot - lpivot)* 2) + lpivot)
fib9 = (((hpivot - lpivot)* -.27) + lpivot)
fib10 = (((hpivot - lpivot)* -1) + lpivot)

notna = nz(fib10[60])
entry = 0.0
if fibEntry == "1"
    entry := fib10
if fibEntry == "2"
    entry := fib9
if fibEntry == "3"
    entry := fib0
if fibEntry == "4"
    entry := fib1
if fibEntry == "5"
    entry := fib2
if fibEntry == "6"
    entry := fib3
if fibEntry == "7"
    entry := fib4
if fibEntry == "8"
    entry := fib5
if fibEntry == "9"
    entry := fib6
if fibEntry == "10"
    entry := fib7
profit = avg+avg*(tp/100)
pause = 0
pause := nz(pause[1])
paused = time < pause

fill = 0.0
fill := nz(fill[1])
count = 0.0
count := nz(fill[1])

filled = count > 0 ? entry > fill-fill/100*dca : 0
signal = testPeriod and notna and not paused and not filled ? 1 : 0

neworder = crossover(signal, signal[1])
moveorder = entry != entry[1] and signal and not neworder ? true : false
cancelorder = crossunder(signal, signal[1]) and not paused
filledorder = crossunder(low[1], entry[1]) and signal[1]

last_profit = 0.0
last_profit := nz(last_profit[1])

if neworder and signal
    strategy.order("New", 1, 0.0001, alert_message='New Order|e=binancefuturestestnet s=btcusdt b=long q=0.0011 fp=' + tostring(entry)) 
if moveorder
    strategy.order("Move", 1, 0.0001, alert_message='Move Order|e=binancefuturestestnet s=btcusdt b=long c=order|e=binancefuturestestnet s=btcusdt b=long q=0.0011 fp=' + tostring(entry))
if filledorder and size < 1
    fill := entry
    count := count+1 
    pause := time + 60000
    p = close+close*(tp/100)
    strategy.entry("Filled", 1, 1,  alert_message='Long Filled|e=binancefuturestestnet s=btcusdt b=short c=order|delay=1|e=binancefuturestestnet s=btcusdt b=long c=position q=100% ro=1 fp=' + tostring(p))
if filledorder and size >= 1
    fill := entry
    count := count+1 
    pause := time + 60000
    strategy.entry("Filled", 1, 1,  alert_message='Long Filled|e=binancefuturestestnet s=btcusdt b=short c=order|delay=1|e=binancefuturestestnet s=btcusdt b=long c=position q=100% ro=1 fp=' + tostring(profit))

if cancelorder and not filledorder
    pause := time + 60000
    strategy.order("Cancel", 1, 0.0001,  alert_message='Cancel Order|e=binancefuturestestnet s=btcusdt b=long c=order')

if filledorder
    last_profit := profit

closeit = crossover(high, profit) and size >= 1
if closeit
    strategy.entry("Close ALL", 0, 0, alert_message='Profit')
    count := 0
    fill := 0.0
    last_profit := 0.0
    
//Plots
bottom = signal ? color.green : filled ? color.red : color.white
plot(entry, "Entry", bottom)

Lebih banyak