Fibonacci Retracement Strategi Stop Loss Dinamik

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

img

Ringkasan

Strategi ini menggunakan tahap retracement Fibonacci untuk menetapkan stop loss secara automatik dan mengambil harga keuntungan untuk pengurusan kedudukan.

Logika Strategi

Inti strategi ini bergantung kepada penunjuk retracement Fibonacci untuk menentukan tahap sokongan dan rintangan utama. Ia mengesan tertinggi dan terendah baru-baru ini untuk merangka 10 zon harga Fibonacci. Berdasarkan konfigurasi, salah satu daripada tahap Fibonacci dipilih sebagai pencetus kemasukan. Apabila harga melanggar di atas tahap itu, pesanan panjang akan diletakkan berdasarkan leverage yang dikonfigurasi. Pada masa yang sama, harga mengambil keuntungan ditetapkan pada peratusan tertentu di atas harga kemasukan.

Selepas masuk, strategi terus mengesan tahap Fibonacci yang dikemas kini. Jika tahap Fib yang lebih rendah muncul, yang menunjukkan potensi pembalikan, strategi akan membatalkan pesanan yang ada dan meletakkan semula pesanan pada harga yang lebih rendah sebagai mekanisme stop loss. Apabila harga akhirnya memecahkan di atas harga mengambil keuntungan, kedudukan akan ditutup untuk keuntungan.

Kelebihan

Kelebihan terbesar strategi ini adalah keupayaan untuk menyesuaikan stop loss secara dinamik dan mengambil harga keuntungan untuk pasaran trend.

  1. Menangkap keuntungan yang lebih besar dalam keadaan trend dengan berhenti mengikut harga kemasukan.

  2. Mengurangkan kerugian dalam penyatuan dengan berhenti di tahap Fib yang lebih rendah.

  3. Membolehkan piramid dengan menambah kedudukan apabila harga turun peratusan tertentu dari harga kemasukan terakhir.

  4. Mudah untuk beroperasi dengan penempatan pesanan automatik sekali dikonfigurasi dengan betul.

Risiko

Masih ada beberapa risiko yang perlu diketahui:

  1. Cenderung untuk berhenti berulang kali semasa pasaran sampingan, meningkatkan yuran.

  2. Tiada mekanisme stop loss tetap, risiko pengeluaran yang besar.

  3. Piramida yang tidak tertutup mungkin memburukkan lagi kerugian.

Penyelesaian yang sepadan:

  1. Hentikan perdagangan apabila harga berayun dalam julat.

  2. Memantau pasaran secara manual dan menutup kedudukan jika perlu.

  3. Tetapkan had pada perintah piramida.

Peluang Peningkatan

Masih banyak ruang untuk pengoptimuman:

  1. Tambah penunjuk tambahan seperti EMA, MACD untuk pengesahan kemasukan tambahan untuk mengelakkan pecah palsu.

  2. Menggabungkan mekanisme stop loss tetap/terakhir untuk mengehadkan kerugian dalam keadaan yang melampau.

  3. Memperbaiki logik piramida berdasarkan rejim pasaran untuk mengelakkan leverage berlebihan.

  4. Menggunakan model pembelajaran mesin seperti LSTM untuk meramalkan harga dan mengenal pasti kemasukan / keluar yang lebih baik.

Kesimpulan

Ringkasnya, strategi ini sesuai untuk senario trend-fading. Dengan sentiasa menyesuaikan berhenti ia membolehkan menunggang trend dengan berkesan. pengoptimuman yang betul dan rel pengawal diperlukan untuk mengendalikan keadaan pasaran 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 lanjut