Chiến lược chốt lời động đa khung thời gian MACD-V và Fibonacci

MACD MACD-V ATR EMA MA
Ngày tạo: 2024-04-26 12:00:21 sửa đổi lần cuối: 2024-06-25 11:28:55
sao chép: 0 Số nhấp chuột: 908
1
tập trung vào
1617
Người theo dõi

Chiến lược chốt lời động đa khung thời gian MACD-V và Fibonacci

Tổng quan

Chiến lược này sử dụng MACD-V (MACD với biến động ATR) và Fibonacci retracement để đưa ra quyết định giao dịch trên nhiều khung thời gian. Nó tính toán mức MACD-V và Fibonacci của các khung thời gian khác nhau, sau đó quyết định mở và phá vị trí dựa trên mối quan hệ của giá hiện tại với mức Fibonacci và giá trị của MACD-V. Chiến lược này nhằm nắm bắt xu hướng và sự điều chỉnh của thị trường, đồng thời kiểm soát rủi ro.

Nguyên tắc chiến lược

  1. Chỉ số MACD-V được tính trong các khung thời gian khác nhau (như 5 phút và 30 phút), MACD-V được đưa ra trên cơ sở MACD để điều chỉnh tỷ lệ biến động ATR để phù hợp với các tình trạng thị trường khác nhau.
  2. Tính trên khung thời gian cấp cao (ví dụ: 30 phút) tính giá cao nhất và giá thấp nhất trong một chu kỳ nhất định (ví dụ: 9 chu kỳ), sau đó dựa trên khoảng này tính mức Fibonacci hồi quy.
  3. Xác định xem điều kiện mở vị trí có được đáp ứng hay không dựa trên mối quan hệ giữa giá đóng cửa hiện tại với mức Fibonacci, và giá trị và hướng thay đổi của MACD-V. Ví dụ: khi giá quay trở lại gần mức Fibonacci 38.2% và MACD-V di chuyển xuống giữa 50 và 150, mở vị trí trống.
  4. Sau khi mở vị trí, sử dụng trailing stop để bảo vệ lợi nhuận và kiểm soát rủi ro. Vị trí của trailing stop được điều chỉnh theo động thái của biến động giá và các tham số chiến lược.
  5. Nếu giá chạm đến mức dừng động hoặc dừng cố định, nó sẽ bị phá vỡ.

Phân tích lợi thế

  1. Chiến lược này sử dụng phân tích nhiều khung thời gian để nắm bắt được xu hướng và biến động của thị trường một cách toàn diện hơn.
  2. Chỉ số MACD-V tính đến biến động giá và có thể hoạt động hiệu quả trong cả thị trường xu hướng và biến động.
  3. Mức Fibonacci có khả năng nắm bắt các vùng hỗ trợ và kháng cự quan trọng của giá, cung cấp thông tin cho các quyết định giao dịch.
  4. Các lệnh dừng di chuyển có thể tạo ra lợi nhuận liên tục khi xu hướng tiếp tục, đồng thời kiểm soát rủi ro khi giá đảo ngược.
  5. Chính sách logic rõ ràng, tham số có thể điều chỉnh, thích ứng mạnh mẽ.

Phân tích rủi ro

  1. Chiến lược: Các giao dịch có thể xảy ra thường xuyên trong một thị trường bất ổn, dẫn đến chi phí giao dịch cao.
  2. Dựa vào xu hướng đánh giá của các chỉ số kỹ thuật, có thể có sai lầm khi thị trường có đột phá giả hoặc biến động liên tục.
  3. Các vị trí dừng cố định có thể không đáp ứng kịp thời với các tình huống cực đoan, dẫn đến tổn thất lớn.
  4. Lựa chọn tham số không đúng có thể dẫn đến hiệu suất chiến lược kém.

Hướng tối ưu hóa

  1. Việc giới thiệu nhiều khung thời gian và các chỉ số, chẳng hạn như MA có chu kỳ dài hơn, để cải thiện độ chính xác trong việc đánh giá xu hướng.
  2. Tối ưu hóa quản lý vị trí, chẳng hạn như thay đổi kích thước vị trí theo ATR hoặc giá cả theo chu kỳ.
  3. Cài đặt các tham số khác nhau cho các tình trạng thị trường khác nhau, nâng cao khả năng thích ứng.
  4. Trên cơ sở dừng di động, giới thiệu dừng di động để kiểm soát tốt hơn rủi ro đi xuống.
  5. Đánh giá lại chiến lược và tối ưu hóa tham số để tìm ra sự kết hợp tham số tốt nhất.

Tóm tắt

Chiến lược này đánh giá xu hướng và thời điểm mở vị trí bằng MACD-V và Fibonacci, sử dụng các điểm dừng di động để kiểm soát rủi ro và lợi nhuận. Lập luận của chiến lược là rõ ràng, thích ứng mạnh mẽ, nhưng có thể có nguy cơ giao dịch thường xuyên và sai lầm trong thị trường bất ổn. Bằng cách giới thiệu nhiều chỉ số, tối ưu hóa quản lý vị trí và logic dừng lỗ, và tối ưu hóa tham số, bạn có thể nâng cao hơn nữa sự ổn định và khả năng sinh lợi của chiến lược.

Cảm ơn.

Chỉ số MACD-v được sử dụng trong chiến lược này được ghi nhận bởi Alex Spiroglou. Để biết thêm chi tiết, bạn có thể xem tác phẩm của ông:MACD-v.

Mã nguồn chiến lược
/*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)