Strategi osilasi pita Fibonacci

Penulis:ChaoZhang, Tanggal: 2023-11-21 13:47:12
Tag:

img

Gambaran umum

Fibonacci Band Oscillation Strategy adalah strategi kuantitatif yang dirancang berdasarkan teori Fibonacci. Strategi ini terutama menggunakan rasio Fibonacci untuk menghitung beberapa band harga untuk membentuk band atas dan bawah.

Logika Strategi

Logika inti dari kode ini adalah untuk menghitung band harga Fibonacci sebagai poin kunci.

  1. Menghitung EMA 14 periode sebagai garis tengah
  2. Hitung garis 4 band atas dan bawah sesuai dengan rasio ATR dan Fibonacci
  3. Menghasilkan sinyal perdagangan ketika harga menembus band bawah atau band atas
  4. Atur stop loss dan take profit untuk melacak osilasi harga untuk keuntungan

Dengan metode berbasis terobosan ini, dapat secara efektif menangkap fluktuasi jangka pendek di pasar dan melakukan perdagangan pulang pergi antara band untuk keuntungan.

Keuntungan

Keuntungan terbesar dari strategi ini adalah bahwa ia memanfaatkan indikator teoritis penting dari rasio Fibonacci untuk menemukan titik harga kunci, sehingga meningkatkan probabilitas keuntungan.

  1. Band Fibonacci yang jelas, mudah untuk menilai titik pecah
  2. Jangkauan pita yang wajar, tidak terlalu terfragmentasi atau terlalu longgar
  3. Beberapa band dapat dipilih untuk perdagangan agresif dan konservatif
  4. Karakteristik osilasi band yang signifikan, efek yang baik untuk strategi perdagangan jangka pendek

Risiko

Karena strategi ini mengejar keuntungan jangka pendek, ada juga beberapa risiko yang perlu dicatat:

  1. Tidak dapat memperoleh keuntungan di bawah tren siklus besar
  2. Risiko stop loss yang tinggi di bawah fluktuasi harga yang keras
  3. Banyak sinyal terobosan membutuhkan pemilihan yang hati-hati
  4. Tidak valid ketika karakteristik osilasi pita hilang

Risiko ini dapat dikendalikan dengan menyesuaikan parameter dengan tepat, memilih band yang tepat, dan metode manajemen modal.

Optimalisasi

Masih ada ruang untuk optimalisasi strategi lebih lanjut:

  1. Menggabungkan dengan indikator tren untuk menghasilkan sinyal hanya dalam arah tren tertentu
  2. Tutup strategi sebelum dan setelah periode waktu tertentu atau peristiwa penting
  3. Mengatur secara dinamis amplitudo stop loss sesuai dengan frekuensi volatilitas pasar
  4. Mengoptimalkan parameter dengan memilih EMA dari siklus yang berbeda sebagai garis acuan

Kesimpulan

Secara umum, Fibonacci Band Oscillation Strategy adalah strategi jangka pendek yang sangat praktis. Ini menggunakan teori Fibonacci untuk menetapkan titik kunci harga. Ketika harga berosilasi di sekitar titik-titik ini, keuntungan yang murah hati dapat diperoleh. Metode berbasis breakout ini cocok untuk pasar dengan tingkat volatilitas dan karakteristik tertentu. Ini dapat digunakan sendiri atau dikombinasikan dengan strategi lain. Dengan penyesuaian parameter dan manajemen modal yang tepat, strategi dapat beroperasi stabil dalam jangka panjang.


/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 00:00:00
period: 1d
basePeriod: 1h
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/
// © drhakankilic

//@version=5
strategy("FIBONACCI BANDS Strategy", shorttitle="FBANDS Strategy", overlay=true)
// === Date === { 
//Backtest dates
fromDay = input.int(defval=1, title='From Day',minval=1,maxval=31)
fromMonth = input.int(defval=2, title='From Month',minval=1,maxval=12)
fromYear = input.int(defval=2022, title='From Year')
thruDay = input.int(defval=1, title='Thru Day',minval=1,maxval=31)
thruMonth = input.int(defval=1, title='Thru Month',minval=1,maxval=12)
thruYear = input.int(defval=2112, title='Thru Year')
showDate = true  // input(defval=true, title="Show Date Range")
start = timestamp(fromYear, fromMonth, fromDay, 00, 00)  // backtest start window
finish = timestamp(thruYear, thruMonth, thruDay, 23, 59)  // backtest finish window
window() =>  // create function "within window of time"
    time >= start and time <= finish ? true : false
// }

// === Long or Short ===  
tradeDirection = input.string(title="Long veya Short", options=["Long", "Short", "Both"], defval="Both",                                       group="Bot")
// Translate input into trading conditions
longOK  = (tradeDirection == "Long") or (tradeDirection == "Both")
shortOK = (tradeDirection == "Short") or (tradeDirection == "Both")
copypaste   = input('{{strategy.order.alert_message}}',         title='alert message to copy/paste',                                    group="Bot")
// }

// === FIBONACCI BANDS === {
EMAperiod = input.int(14, title='EMAperiod', minval=1, maxval=500, group="Fibonacci")
ATRperiod = input.int(14, title='ATRperiod', minval=1, maxval=500, group="Fibonacci")
EMA = ta.ema(close, EMAperiod)
TR1 = math.max(high - low, math.abs(high - close[1]))
TR = math.max(TR1, math.abs(low - close[1]))
ATR = ta.sma(TR, ATRperiod)
F2 = input(defval=1.618, title='Fibonacci Ratio 2', group="Fibonacci")
F3 = input(defval=2.618, title='Fibonacci Ratio 3', group="Fibonacci")
F4 = input(defval=4.236, title='Fibonacci Ratio 4', group="Fibonacci")
R1 = ATR
R2 = ATR * F2
R3 = ATR * F3
R4 = ATR * F4
FIBOTOP4 = EMA + R4
FIBOTOP3 = EMA + R3
FIBOTOP2 = EMA + R2
FIBOTOP1 = EMA + R1
FIBOBOT1 = EMA - R1
FIBOBOT2 = EMA - R2
FIBOBOT3 = EMA - R3
FIBOBOT4 = EMA - R4
plot(FIBOTOP4[1], title='FIBOTOP4', linewidth=1, color=color.new(color.orange, 0))
plot(FIBOTOP3[1], title='FIBOTOP3', linewidth=1, color=color.new(color.aqua, 20))
plot(FIBOTOP2[1], title='FIBOTOP2', linewidth=1, color=color.new(color.gray, 40))
plot(FIBOTOP1[1], title='FIBOTOP1', linewidth=1, color=color.new(color.purple, 40))

plot(FIBOBOT1[1], title='FIBOBOT1', linewidth=1, color=color.new(color.green, 40))
plot(FIBOBOT2[1], title='FIBOBOT2', linewidth=1, color=color.new(color.yellow, 40))
plot(FIBOBOT3[1], title='FIBOBOT3', linewidth=1, color=color.new(color.blue, 20))
plot(FIBOBOT4[1], title='FIBOBOT4', linewidth=1, color=color.new(color.aqua, 0))
// plot(EMA[1], style=plot.style_cross, title='EMA', color=color.new(color.red, 0))

prefm = input.string(title="Fibo", options=["close>FIBOTOP4(orange)", "close>FIBOTOP3(aqua)","close>FIBOTOP2(gray)","close>FIBOTOP1(purple)", "Disable"] , defval="close>FIBOTOP1(purple)", group="Long")
_prefm = false 
if (prefm == "close>FIBOTOP4(orange)" )
    _prefm := close>FIBOTOP4[1]
    
if (prefm == "close>FIBOTOP3(aqua)" )
    _prefm := close>FIBOTOP3[1]

if (prefm == "close>FIBOTOP2(gray)" )
    _prefm := close>FIBOTOP2[1]
    
if (prefm == "close>FIBOTOP1(purple)" )
    _prefm := close>FIBOTOP2[1]
 
 
if (prefm == "Disable" )
    _prefm := low<low[1] or low>low[1]  
    
prefmS = input.string(title="Fibo", options=["close<FIBOBOT1(green)", "close<FIBOBOT2(yellow)", "close<FIBOBOT3(blue)", "close<FIBOBOT4(aqua)", "Disable"] , defval="close<FIBOBOT1(green)", group="Short")
_prefmS = false 
if (prefmS == "close<FIBOBOT1(green)" )
    _prefmS := close<FIBOBOT1[1]
  
if (prefmS == "close<FIBOBOT2(yellow)" )
    _prefmS := close<FIBOBOT2[1]

if (prefmS == "close<FIBOBOT3(blue)" )
    _prefmS := close<FIBOBOT3[1]
  
if (prefmS == "close<FIBOBOT4(aqua)" )
    _prefmS := close<FIBOBOT4[1]

if (prefmS == "Disable" )
    _prefmS := low<low[1] or low>low[1]  

// }

long2= _prefm 

short2= _prefmS
//

// === Bot Codes === { 
enterlong = input("Long Code", title='Long İlk Alım', group="Long Code")
entershort= input("Short Code", title='Short İlk Alım', group="Short Code")
exitlong = input("Long Exit Code", title='Long Exit', group="Long Code")
exitshort= input("Short Exit Code", title='Short Exit', group="Short Code")
// }

////////////////////////////////////////////////////////////////////////////////////////////TPSL
// Inputs
sl_inp = input.float(4, title='Stop %', step=0.1, group="Long") / 100
tp_inp = input.float(1.5, title='TP %', step=0.1, group="Long") / 100

sl_inp2 = input.float(4, title='Stop %', step=0.1, group="Short") / 100
tp_inp2 = input.float(1.5, title='TP %', step=0.1, group="Short") / 100

longtp = strategy.position_avg_price * (1 + tp_inp) 
longstop=  strategy.position_avg_price * (1 - sl_inp)

shortstop=  strategy.position_avg_price * (1 + sl_inp2)
shorttp = strategy.position_avg_price * (1 - tp_inp2) 
////////////////////////////////////////////////////////////////////////////////////////////
if window() and strategy.position_size==0 and longOK
    strategy.entry("Long", strategy.long, when= long2, alert_message=enterlong, comment="Long")
    
if strategy.position_size>0
    strategy.exit("Long", stop= longstop, limit=longtp, alert_message=exitlong, comment="TPSL")
////////////////////////////////////////////////////////////////////////////////////////////SHORT
if window() and strategy.position_size==0 and shortOK 
    strategy.entry("Short", strategy.short, when= short2, alert_message=entershort, comment="Short")
    
if strategy.position_size<0
    strategy.exit("Short", stop= shortstop, limit= shorttp, alert_message=exitshort, comment="TPSL")
 


Lebih banyak