MACD-V 및 피보나치 다중 시간 프레임 동적 영업 전략

저자:차오장, 날짜: 2024-04-26 12:00:21
태그:MACDMACD-VATREMAMA

img

전반적인 설명

이 전략은 여러 시간 프레임에서 거래 결정을 내리기 위해 MACD-V (ATR 변동성있는 MACD) 및 피보나치 리트레이싱을 사용합니다. 다른 시간 프레임에서 MACD-V 및 피보나치 수준을 계산하고, 현재 가격과 피보나치 레벨 및 MACD-V의 값에 대한 관계에 따라 포지션을 열거나 닫을 것인지 결정합니다. 전략은 위험을 제어하면서 시장 추세와 리트레이싱을 파악하는 것을 목표로합니다.

전략 원칙

  1. MACD-V 지표를 다른 시간 프레임 (예를 들어, 5 분 및 30 분) 에 계산합니다. MACD-V는 다른 시장 조건에 적응하기 위해 표준 MACD에 ATR 변동성 조정을 도입합니다.
  2. 더 높은 시간 프레임 (예를 들어, 30 분) 에서 지난 특정 기간 (예를 들어, 9 기간) 의 가장 높은 최고와 가장 낮은 최저를 계산하고, 이 범위에 기초하여 피보나치 리트레이싱 수준을 계산합니다.
  3. 현재 종료 가격과 피보나치 레벨 사이의 관계, 그리고 MACD-V의 가치와 방향에 따라 포지션을 열어야하는지 여부를 결정합니다. 예를 들어, 가격이 38.2% 피보나치 수준으로 다시 올라갔고 MACD-V가 -50에서 150 사이의 하락세를 보이고있을 때, 짧은 포지션을 열십시오.
  4. 포지션을 열면 수익을 보호하고 위험을 제어하기 위해 트레일링 스톱을 사용하십시오. 트레일링 스톱의 포지션은 가격 움직임과 전략 매개 변수에 따라 동적으로 조정됩니다.
  5. 만약 가격이 트레일링 스톱 또는 고정 스톱 러스 레벨에 도달한다면, 포지션을 닫습니다.

이점 분석

  1. 이 전략은 시장 추세와 변동에 대한 더 포괄적인 이해를 제공하는 다중 시간 프레임 분석을 사용합니다.
  2. MACD-V 지표는 가격 변동성을 고려하여 트렌드 및 범위 시장에서 효과적입니다.
  3. 피보나치 레벨은 주요 지지 및 저항 영역을 효과적으로 파악하여 거래 결정에 대한 참조를 제공합니다.
  4. 트레일링 스톱은 트렌드가 계속되는 동안 수익성을 계속 할 수 있으며 가격 역전 시 당시에 포지션을 닫아 위험을 제어 할 수 있습니다.
  5. 전략 논리는 명확하고 매개 변수도 조정 가능하며 적응력이 강합니다.

위험 분석

  1. 이 전략은 다양한 시장에서 빈번한 거래를 경험할 수 있으며, 높은 거래 비용을 초래할 수 있습니다.
  2. 트렌드를 판단하기 위해 기술 지표에 의존하는 것은 시장이 잘못된 파업이나 장기적인 변동을 경험할 때 잘못된 판단으로 이어질 수 있습니다.
  3. 고정 스톱 로스 포지션은 극심한 시장 조건에 적시에 반응하지 않을 수 있으며, 이로 인해 상당한 손실이 발생할 수 있습니다.
  4. 부적절한 매개 변수 선택은 전략 성능이 떨어질 수 있습니다.

최적화 방향

  1. 추세 판단의 정확성을 높이기 위해 더 긴 기간 MAs와 같은 더 많은 시간 프레임과 지표를 도입하십시오.
  2. ATR 또는 가격 범위에 따라 위치 크기를 동적으로 조정하는 것과 같은 위치 관리를 최적화하십시오.
  3. 적응력을 높이기 위해 다른 시장 조건에 따라 다른 매개 변수 조합을 설정합니다.
  4. 트레일링 스톱 외에도 트레일링 스톱 손실을 도입하여 하향 위험을 더 잘 제어하십시오.
  5. 가장 좋은 매개 변수 조합을 찾기 위해 매개 변수를 백테스트하고 최적화합니다.

요약

이 전략은 트렌드와 엔트리 타이밍을 결정하기 위해 여러 시간 프레임에 걸쳐 MACD-V 및 피보나치 리트레이스먼트 레벨을 사용하며, 트레일링 스톱을 사용하여 위험과 수익을 동적으로 제어합니다. 전략 논리는 명확하고 적응 가능하지만, 시장 범위에서 빈번한 거래 및 잘못된 판단 위험을 경험할 수 있습니다. 더 많은 지표를 도입하고 위치 관리 및 스톱 손실 논리를 최적화하고 매개 변수를 최적화함으로써 전략의 견고성과 수익성을 더욱 향상시킬 수 있습니다.


/*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)

관련

더 많은