Strategi ambil untung dinamik berbilang jangka masa MACD-V dan Fibonacci

MACD MACD-V ATR EMA MA
Tarikh penciptaan: 2024-04-26 12:00:21 Akhirnya diubah suai: 2024-06-25 11:28:55
Salin: 0 Bilangan klik: 908
1
fokus pada
1617
Pengikut

Strategi ambil untung dinamik berbilang jangka masa MACD-V dan Fibonacci

Gambaran keseluruhan

Strategi ini menggunakan MACD-V (MACD dengan turun naik ATR) dan Fibonacci retracement untuk membuat keputusan perdagangan pada pelbagai jangka masa. Ia mengira tahap MACD-V dan Fibonacci pada pelbagai jangka masa, kemudian memutuskan untuk membuka dan menutup kedudukan berdasarkan hubungan harga semasa dengan tahap Fibonacci dan nilai MACD-V. Strategi ini bertujuan untuk menangkap trend dan retracement pasaran, sambil mengawal risiko.

Prinsip Strategi

  1. Indikator MACD-V yang dikira pada jangka masa yang berbeza (seperti 5 minit dan 30 minit), MACD-V memperkenalkan penyesuaian kadar turun naik ATR berdasarkan MACD untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.
  2. Mengira harga tertinggi dan terendah untuk tempoh masa tertentu yang lalu (seperti 9 kitaran) pada bingkai masa peringkat tinggi (seperti 30 minit), dan kemudian mengira tahap Fibonacci regresi berdasarkan jarak ini.
  3. Berdasarkan hubungan harga penutupan semasa dengan tahap Fibonacci, dan nilai dan arah perubahan MACD-V, untuk menilai sama ada syarat pembukaan kedudukan telah dipenuhi. Sebagai contoh, apabila harga kembali ke 38.2% di sekitar tahap Fibonacci dan MACD-V bergerak ke bawah antara 50 dan 150, membuka posisi kosong.
  4. Selepas membuka kedudukan, gunakan hentian bergerak untuk melindungi keuntungan dan mengawal risiko. Kedudukan hentian bergerak disesuaikan secara dinamik dengan pergerakan harga dan parameter strategi.
  5. Jika harga menyentuh tahap stop loss bergerak atau stop loss tetap, maka ia akan ditutup.

Analisis kelebihan

  1. Strategi ini menggunakan analisis pelbagai kerangka masa untuk mendapatkan gambaran yang lebih menyeluruh mengenai trend dan turun naik pasaran.
  2. Indeks MACD-V mengambil kira turun naik harga dan berfungsi dengan baik dalam pasaran yang sedang tren dan bergolak.
  3. Tahap Fibonacci sangat baik untuk menangkap kawasan sokongan dan rintangan utama dalam harga dan memberi rujukan kepada keputusan perdagangan.
  4. Hentian bergerak boleh terus membuat keuntungan semasa trend berterusan, dan pada masa yang sama menutup kedudukan apabila harga berbalik, mengawal risiko.
  5. Strategi logik yang jelas, parameter boleh disesuaikan, beradaptasi kuat.

Analisis risiko

  1. Strategi: Dalam pasaran yang bergolak, dagangan yang kerap boleh menyebabkan kos dagangan yang tinggi.
  2. Bergantung kepada trend penilaian indikator teknikal, kesalahan penilaian mungkin berlaku apabila pasaran mengalami penembusan palsu atau pergerakan berterusan.
  3. Kedudukan Hentian Tetap mungkin tidak dapat menangani keadaan yang melampau dalam masa yang tepat, menyebabkan kerugian yang lebih besar.
  4. Pilihan parameter yang tidak betul boleh menyebabkan prestasi strategi yang buruk.

Arah pengoptimuman

  1. Memperkenalkan lebih banyak kerangka masa dan penunjuk, seperti MA yang lebih lama, untuk meningkatkan ketepatan penilaian trend.
  2. Pengurusan kedudukan yang dioptimumkan, seperti saiz kedudukan yang disesuaikan secara dinamik mengikut ATR atau julat harga.
  3. Untuk keadaan pasaran yang berbeza, setkan kombinasi parameter yang berbeza untuk meningkatkan kesesuaian.
  4. Berdasarkan penghentian bergerak, penghentian bergerak diperkenalkan untuk mengawal risiko penurunan dengan lebih baik.
  5. Ujian semula dan optimumkan parameter untuk mencari kombinasi parameter yang terbaik.

ringkaskan

Strategi ini menilai trend dan masa untuk membuka kedudukan melalui MACD-V dan Fibonacci retracement level dalam pelbagai bingkai masa, dan menggunakan stop-loss bergerak untuk mengawal risiko dan keuntungan secara dinamik. Logik strategi jelas, beradaptasi, tetapi risiko perdagangan dan kesalahan mungkin berlaku dalam pasaran yang bergolak. Dengan memperkenalkan lebih banyak petunjuk, mengoptimumkan pengurusan kedudukan dan logik stop-loss, dan melakukan pengoptimuman parameter, strategi ini dapat meningkatkan lagi kestabilan dan keuntungan.

Terima kasih.

Indeks MACD-v yang digunakan dalam strategi ini adalah hasil kerja Alex Spiroglou. Untuk maklumat lanjut, anda boleh rujuk karya beliau:MACD-v.

Kod sumber strategi
/*backtest
start: 2024-03-26 00:00:00
end: 2024-04-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © catikur

//@version=5
strategy("Advanced MACD-V and Fibonacci Strategy with EMA Trailing TP", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value=1000, margin_long=1./10*50, margin_short=1./10*50, slippage=0, commission_type=strategy.commission.percent, commission_value=0.05)

// Parametreler
fast_len = input.int(12, title="Fast Length", minval=1, group="MACD-V Settings")
slow_len = input.int(26, title="Slow Length", minval=1, group="MACD-V Settings")
signal_len = input.int(9, title="Signal Smoothing", minval=1, group="MACD-V Settings")
atr_len = input.int(26, title="ATR Length", minval=1, group="MACD-V Settings")
source = input.source(close, title="Source", group="MACD-V Settings")

//ema_length = input.int(20, title="EMA Length for Trailing TP", group="Trailing TP Settings")
trailing_profit = input.float(1000, title="Trailing Profit", minval=0.01, maxval=1000000, step=0.01, group="Trailing TP Settings")
trailing_offset = input.float(30000, title="Trailing Offset", minval=0.01, maxval=1000000, step=0.01, group="Trailing TP Settings")
trailing_factor = input.float(0.01, title="Trailing Factor", minval=0.01, maxval=1000000, step=0.01, group="Trailing TP Settings")
fix_loss = input.float(20000, title="Fix Loss", minval=0.01, maxval=1000000, step=0.01, group="Trailing TP Settings")

fib_lookback = input.int(9, title="Fibonacci Lookback Periods", minval=1, group="Fibonacci Settings")

macd_tf = input.timeframe("5", title="MACD Timeframe", group="Timeframe Settings")
fib_tf = input.timeframe("30", title="Fibonacci Timeframe", group="Timeframe Settings")
//ema_tf = input.timeframe("30", title="EMA Timeframe for Trailing TP", group="Timeframe Settings")




// MACD-V Hesaplama
atr = ta.atr(atr_len)
ema_slow = ta.ema(source, slow_len)
ema_fast = ta.ema(source, fast_len)

atr_tf = request.security(syminfo.tickerid, macd_tf , atr)
ema_slow_tf = request.security(syminfo.tickerid, macd_tf , ema_slow)
ema_fast_tf = request.security(syminfo.tickerid, macd_tf , ema_fast)

macd = ( ema_fast_tf - ema_slow_tf ) / atr_tf * 100
signal = ta.ema(macd, signal_len)
hist = macd - signal
hist_prev = hist[1]

// log.info("MACD {0} ", macd)
// log.info("Signal {0} ", signal)
// log.info("Histogram {0} ", hist)
// log.info("Previous Histogram {0} ", hist_prev)

// EMA for Trailing TP
//ema_trailing_tf = ta.ema(close, ema_length)

//ema_trailing = request.security(syminfo.tickerid, ema_tf, ema_trailing_tf)

//log.info("EMA Trailing {0} ", ema_trailing)

// Fibonacci Seviyeleri

high_val_tf = ta.highest(high, fib_lookback)
low_val_tf = ta.lowest(low, fib_lookback)

h1 = request.security(syminfo.tickerid, fib_tf, high_val_tf)
l1 = request.security(syminfo.tickerid, fib_tf, low_val_tf)

fark = h1 - l1

//Low ile fark
hl236 = l1 + fark * 0.236
hl382 = l1 + fark * 0.382
hl500 = l1 + fark * 0.5
hl618 = l1 + fark * 0.618
hl786 = l1 + fark * 0.786
//High ile fark
lh236 = h1 - fark * 0.236
lh382 = h1 - fark * 0.382
lh500 = h1 - fark * 0.5
lh618 = h1 - fark * 0.618
lh786 = h1 - fark * 0.786

hbars_tf = -ta.highestbars(high, fib_lookback)
lbars_tf = -ta.lowestbars(low, fib_lookback)

hbars = request.security(syminfo.tickerid, fib_tf , hbars_tf)
lbars = request.security(syminfo.tickerid, fib_tf , lbars_tf)

fib_236 = hbars > lbars ? hl236 : lh236
fib_382 = hbars > lbars ? hl382 : lh382
fib_500 = hbars > lbars ? hl500 : lh500
fib_618 = hbars > lbars ? hl618 : lh618
fib_786 = hbars > lbars ? hl786 : lh786

// log.info("Fibo 382 {0} ", fib_382)
// log.info("Fibo 618 {0} ", fib_618)

// Keep track of the strategy's highest and lowest net profit
var highestNetProfit = 0.0
var lowestNetProfit  = 0.0

var bool sell_retracing = false
var bool sell_reversing = false
var bool buy_rebound = false
var bool buy_rallying = false

// Satış Koşulları
sell_retracing := (signal > -20) and (macd > -50 and macd < 150) and (macd < signal) and (hist < hist_prev) and (close < fib_382)
sell_reversing := (macd > -150 and macd < -50) and (macd < signal) and (hist < hist_prev) and (close < fib_618)

// log.info("Retracing var mi: {0} ", sell_retracing)
// log.info("Reversing var mi: {0} ", sell_reversing)

// Alım Koşulları
buy_rebound := (signal < 20) and (macd > -150 and macd < 50) and (macd > signal) and (hist > hist_prev) and ((fib_618 < close) or ((fib_618 > close ) and (close > fib_382)))
buy_rallying := (macd > 50 and macd < 150) and (macd > signal) and (hist > hist_prev) and (close > fib_618)

// log.info("Rallying var mi: {0} ", buy_rallying)
// log.info("Rebound var mi: {0} ", buy_rebound)

// Emirleri Yerleştirme
if (sell_retracing == true and strategy.opentrades == 0 )
    strategy.entry("sell_retracing", strategy.short)

if (sell_reversing == true and strategy.opentrades == 0 )
    strategy.entry("sell_reversing", strategy.short)

if (buy_rebound == true and strategy.opentrades == 0 )
    strategy.entry("buy_rebound", strategy.long)

if (buy_rallying == true and strategy.opentrades == 0 )
    strategy.entry("buy_rallying", strategy.long)


// log.info("open order: {0} ", strategy.opentrades )


highestNetProfit := math.max(highestNetProfit, strategy.netprofit)
lowestNetProfit  := math.min(lowestNetProfit, strategy.netprofit)




// Plot the net profit, as well as its highest and lowest value
//plot(strategy.netprofit, style=plot.style_area, title="Net profit",
//     color=strategy.netprofit > 0 ? color.green : color.red)

//plot(highestNetProfit, color=color.green, title="Highest net profit")
//plot(lowestNetProfit, color=color.red, title="Lowest net profit")

// Trailing Take Profit
//long_trailing_stop = ema_trailing * trailing_factor
//short_trailing_stop = ema_trailing / trailing_factor

//log.info("long trailing stop {0} ", long_trailing_stop)
//log.info("short trailing stop {0} ", short_trailing_stop)
//log.info("avg price {0} ", strategy.position_avg_price)
//trail_price1 = strategy.position_avg_price * (1 + trailing_factor)
//trail_price2 = strategy.position_avg_price * (1 - trailing_factor)
// log.info("position_size {0} ", strategy.position_size)

// Trailing Take Profit
var float long_trailing_stop = 0.0
var float short_trailing_stop = 0.0

//if (strategy.position_size > 0)
 //   long_trailing_stop := math.max(long_trailing_stop, close * (1 + trailing_factor))  // Yeni bir maksimum değer belirlendiğinde güncelle
//if (strategy.position_size < 0)
 //  short_trailing_stop := math.min(short_trailing_stop, close * (1 - trailing_factor))  // Yeni bir minimum değer belirlendiğinde güncelle

//log.info("long trailing {0} ", long_trailing_stop)
// log.info("trailing factor{0} ", trailing_factor)
//log.info("short trailing {0} ", short_trailing_stop)

if (strategy.position_size != 0 )
    strategy.exit("Exit Long", from_entry="buy_rebound", trail_points = trailing_profit, trail_offset = trailing_offset, loss = fix_loss)
    strategy.exit("Exit Long", from_entry="buy_rallying", trail_points = trailing_profit, trail_offset = trailing_offset, loss = fix_loss)
    strategy.exit("Exit Short", from_entry="sell_retracing", trail_points = trailing_profit, trail_offset = trailing_offset, loss = fix_loss)
    strategy.exit("Exit Short", from_entry="sell_reversing", trail_points = trailing_profit, trail_offset = trailing_offset, loss = fix_loss)