MACD-V와 피보나치 다중 시간대 동적 이익 실현 전략

MACD MACD-V ATR EMA MA
생성 날짜: 2024-04-26 12:00:21 마지막으로 수정됨: 2024-06-25 11:28:55
복사: 0 클릭수: 908
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

MACD-V와 피보나치 다중 시간대 동적 이익 실현 전략

개요

이 전략은 MACD-V ((ATR의 변동성을 가진 MACD) 와 피보나치 리드어를 사용하여 여러 시간 프레임에서 거래 결정을 내립니다. 그것은 다른 시간 프레임의 MACD-V와 피보나치 수준을 계산하고, 현재 가격과 피보나치 레벨의 관계와 MACD-V의 값에 따라 포지션을 개시하고 포지션을 결정합니다. 이 전략은 시장의 추세와 리드어를 포착하는 동시에 위험을 제어하는 것을 목표로합니다.

전략 원칙

  1. 다른 시간 프레임 (예를 들어 5분과 30분) 을 계산하는 MACD-V 지표, 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. 트렌드 판단의 정확성을 높이기 위해 더 많은 시간 프레임과 더 긴 MA와 같은 지표를 도입하십시오.
  2. 포지션 관리를 최적화, 예를 들어 ATR 또는 가격 범위에 따라 포지션 크기를 동적으로 조정한다.
  3. 다양한 시장 상황에 맞게 다양한 파라미터 조합을 설정하여 적응력을 높여줍니다.
  4. 모바일 스톱을 기반으로 모바일 스톱을 도입하여 하향 위험을 더 잘 제어합니다.
  5. 전략에 대한 피드백과 변수 최적화를 통해 최적의 변수 조합을 찾습니다.

요약하다

이 전략은 다중 시간 프레임의 MACD-V 및 피보나치 리커드 레벨을 통해 트렌드 및 포지션 개시 시기를 판단하고, 이동 스톱을 사용하여 위험과 수익을 동적으로 제어한다. 전략의 논리는 명확하고, 적응력이 강하지만, 불안정한 시장에서 자주 거래되고 잘못된 판단의 위험이 발생할 수 있다. 더 많은 지표를 도입하고, 포지션 관리 및 스톱 로직을 최적화하고, 변수 최적화를 수행함으로써 전략의 안정성과 수익성을 더욱 향상시킬 수 있다.

감사합니다.

이 전략에 사용된 MACD-v 지표는 알렉스 스피로글루 (Alex Spiroglou) 의 작품에 기인한다.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)