지표들의 전략 결합 돌파구 트렌드 추적

저자:차오장날짜: 2024-02-20 11:38:22
태그:

img

전반적인 설명

이 전략은 지표 조합 돌파구 트렌드 추적 전략 (Strategy of Indicators Combination Breakthrough Trend Tracking) 이라고 불린다. 시장 트렌드 방향을 파악하고 트렌드 추적 작업을 수행하기 위해 다양한 지표를 결합한다. 주요 구성 요소는 다음과 같다.

  1. 시장의 주요 트렌드를 판단하기 위해 웨이브 트렌드 지표를 사용하는 것
  2. RSI 및 MFI 지표로 일부 잘못된 신호를 필터링
  3. EMA 지표로 특정 운영 방향을 결정
  4. 트렌드를 따라가는 것을 보장하기 위해 획기적인 추적 방법을 사용하여 시장에 진출

전략 원칙

이 전략은 주로 주요 트렌드의 방향과 힘을 판단하고, 장기 및 짧은 양방향 거래를 설정합니다. 구체적인 운영 원칙은 다음과 같습니다.

긴 신호:

  1. 가격은 200일 EMA 이상으로 상승세를 나타냅니다.
  2. 가격은 약 50 일간의 EMA로 후퇴합니다.
  3. 파동 트렌드가 상승 트렌드로 역전되고 구매 신호가 나타납니다.
  4. RSI와 MFI 모두 과잉 매입
  5. 3개의 연속 K 라인이 50일 EMA를 뚫고 올라가는 것을 나타냅니다.

짧은 신호: 긴 신호의 반대

이윤 취득 및 스톱 손실: 두 가지 옵션: 최저 가격/최고 가격 스톱 손실, ATR 스톱 손실

이점 분석

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 주요 트렌드를 결정하고 거짓 파장을 피하기 위해 여러 지표를 통합합니다.
  2. 운영 방향을 결정하기 위해 EMA를 채택하고, 추세를 쉽게 추적합니다.
  3. 트래일링 스톱 로스 메소드는 지속적인 수익을 달성합니다.
  4. 길고 짧게 갈 수 있고, 어느 방향으로든 시장을 따라갈 수 있습니다.

위험 분석

이 전략은 또한 몇 가지 위험을 안고 있습니다.

  1. 지표에서 잘못된 신호가 나올 확률
  2. 스톱 로스 포인트가 너무 작아서 스톱 로스 위험이 증가합니다.
  3. 높은 거래 빈도는 거래 수수료로 인한 숨겨진 손실로 이어집니다.

위의 위험을 줄이기 위해 최적화는 다음과 같은 측면에서 수행 할 수 있습니다.

  1. 잘못된 신호를 필터하기 위해 표시기 매개 변수를 조정
  2. 적절하게 스톱 손실 지점을 풀고
  3. 거래 빈도를 줄이기 위해 지표 매개 변수를 최적화합니다.

최적화 방향

코드 수준에서 이 전략의 주요 최적화 방향은 다음과 같습니다.

  1. 파동 트렌드, RSI 및 MFI의 매개 변수를 조정하여 최적의 매개 변수 조합을 찾습니다.
  2. 다른 EMA 사이클 매개 변수의 성능 테스트
  3. 최적의 구성을 얻기 위해 수익 취득 및 스톱 손실의 위험/이익 비율 요인을 조정

매개 변수 조정과 테스트를 통해 전략은 수익을 극대화하면서 마감과 위험을 줄일 수 있습니다.

결론

이 전략은 주요 트렌드 방향을 결정하기 위해 여러 지표를 통합하고, EMA 지표를 특정 운영 신호로 사용하고, 수익을 잠금하기 위해 트레일링 스톱 로스를 사용합니다. 매개 변수 최적화를 통해 비교적 좋은 안정적인 이익을 얻을 수 있습니다. 그러나 특정 시스템 위험도 주목해야하며, 지표의 효과와 시장 환경의 변화는 지속적으로 모니터링되어야합니다.


/*backtest
start: 2023-02-13 00:00:00
end: 2024-02-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//Lowest Low/ Highest High & ATR Stop Loss/ Take Profit
//Optimized for the 30 minutes chart

strategy(title="TradePro's Trading Idea Cipher B+ Divergence EMA Pullback Strategy", shorttitle="WT MFI RSI EMA PB STRAT", overlay = true, pyramiding = 0, max_bars_back=5000, calc_on_order_fills = false, commission_type =  strategy.commission.percent, commission_value = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=5000, currency=currency.USD)

// { Time Range
FromMonth=input(defval=1,title="FromMonth",minval=1,maxval=12)
FromDay=input(defval=1,title="FromDay",minval=1,maxval=31)
FromYear=input(defval=2020,title="FromYear",minval=2016)
ToMonth=input(defval=1,title="ToMonth",minval=1,maxval=12)
ToDay=input(defval=1,title="ToDay",minval=1,maxval=31)
ToYear=input(defval=9999,title="ToYear",minval=2017)
start=timestamp(FromYear,FromMonth,FromDay,00,00)
finish=timestamp(ToYear,ToMonth,ToDay,23,59)
window()=>true

// See if this bar's time happened on/after start date
afterStartDate = time >= start and time<=finish?true:false

zeroline = 0

// } Time Range

// { Wavetrend, RSI, MFI

// WaveTrend
cl = input(12, "Channel Length")
al = input(12, "Average Length")
overbought = input(53, title = 'WT Overbought Level 1', type = input.integer)
oversold = input(-53, title = 'WT Oversold Level 1', type = input.integer)
ap = hlc3 
esa = ema(ap, cl)
d = ema(abs(ap - esa), cl)
ci = (ap - esa) / (0.015 * d)
tci = ema(ci, al)
 
wt1 = tci
wt2 = sma(wt1,4)

wtOs = wt2 <= oversold
wtOb = wt2 >= overbought
wtX = cross(wt1, wt2)
wtUp = wt2 - wt1 <= 0
wtDown = wt2 - wt1 >= 0
buySignal = wtX and wtOs and wtUp
sellSignal = wtX and wtOb and wtDown

// RSI & MFI

rsiMFIPosY = input(2, title = 'MFI Area Y Pos', type = input.float)
rsiMFIperiod = input(80,title = 'MFI Period', type = input.integer)
rsiMFIMultiplier = input(200, title = 'MFI Area multiplier', type = input.float)
f_rsimfi(_period, _multiplier, _tf) => security(syminfo.tickerid, _tf, sma(((close - open) / (high - low)) * _multiplier, _period) - rsiMFIPosY)
rsiMFI = f_rsimfi(rsiMFIperiod, rsiMFIMultiplier, timeframe.period)

// } Wavetrend, RSI, MFI

// { EMA
emasrc = close
res = input(title="EMA Timeframe", type=input.resolution, defval="30")
len1 = input(title="EMA1 Length", type=input.integer, defval=200)
col1 = color.yellow

len2 = input(title="EMA2 Length", type=input.integer, defval=50)
col2 = color.blue

// Calculate EMA
ema1 = ema(emasrc, len1)
emaSmooth1 = security(syminfo.tickerid, res, ema1, barmerge.gaps_off, barmerge.lookahead_off)

ema2 = ema(emasrc, len2)
emaSmooth2 = security(syminfo.tickerid, res, ema2, barmerge.gaps_off, barmerge.lookahead_off)

// Draw EMA
plot(emaSmooth1, title="EMA1", linewidth=1, color=col1)
plot(emaSmooth2, title="EMA2", linewidth=1, color=col2)

// } EMA

// { Long Entry

enablelong = input(true, title="Enable long?")

//Long Signal
upcondition = close > emaSmooth1
wavetrendlong = wt1 and wt2 < zeroline
mfilong = rsiMFI > 0
emapblong1 = (close > emaSmooth2) and (close[1] < emaSmooth2[1])
emapblong2 = ((close[2] > emaSmooth2[2]) and (close[3] > emaSmooth2[3]) and (close[4] > emaSmooth2[4])) or ((close[5] > emaSmooth2[5]) and (close[6] > emaSmooth2[6]) and (close[7] > emaSmooth2[7])) or ((close[8] > emaSmooth2[8]) and (close[9] > emaSmooth2[9]) and (close[10] > emaSmooth2[10]))

longcondition = upcondition and wavetrendlong and buySignal and mfilong and emapblong1 and emapblong2

//strategy buy long
if (longcondition) and (afterStartDate) and strategy.opentrades < 1 and (enablelong == true)
    strategy.entry("long", strategy.long)

plotshape(longcondition, style=shape.arrowup,
                 location=location.abovebar, color=color.green)

// } Long Entry

// { Short Entry

enableshort = input(true, title="Enable short?")

//Short Signal
downcondition = close < emaSmooth1
wavetrendshort = wt1 and wt2 > zeroline
mfishort = rsiMFI < 0
emapbshort1 = (close < emaSmooth2) and (close[1] > emaSmooth2[1])
emapbshort2 = ((close[2] < emaSmooth2[2]) and (close[3] < emaSmooth2[3]) and (close[4] < emaSmooth2[4])) or ((close[5] < emaSmooth2[5]) and (close[6] < emaSmooth2[6]) and (close[7] < emaSmooth2[7])) or ((close[8] < emaSmooth2[8]) and (close[9] < emaSmooth2[9]) and (close[10] < emaSmooth2[10]))

shortcondition = downcondition and wavetrendshort and sellSignal and mfishort and emapbshort1 and emapbshort2

//strategy buy short
if (shortcondition) and (afterStartDate) and strategy.opentrades < 1 and (enableshort == true)
    strategy.entry("short", strategy.short)

plotshape(shortcondition, style=shape.arrowdown,
                 location=location.belowbar, color=color.red)

// } Short Entry

// { Exit Conditions
bought = strategy.position_size[1] < strategy.position_size
sold = strategy.position_size[1] > strategy.position_size
barsbought = barssince(bought)
barssold = barssince(sold)
slbuffer = input(title="SL Buffer", type=input.float, step=0.1, defval=0)

// } Exit Conditions

// { Lowest Low/ Highes High Exit Condition
enablelowhigh = input(false, title="Enable lowest low/ highest high exit?")

//Lowest Low LONG
profitfactorlong = input(title="ProfitfactorLong", type=input.float, step=0.1, defval=2)
loLen = input(title="Lowest Low Lookback", type=input.integer,
  defval=50, minval=2)
stop_level_long = lowest(low, loLen)[1]

if enablelowhigh == true and strategy.position_size>0
    profit_level_long = strategy.position_avg_price + ((strategy.position_avg_price - stop_level_long[barsbought])*profitfactorlong) + slbuffer
    strategy.exit(id="TP/ SL", stop=stop_level_long[barsbought] - slbuffer, limit=profit_level_long)

//Lowest Low SHORT
profitfactorshort = input(title="ProfitfactorShort", type=input.float, step=0.1, defval=2)
highLen = input(title="highest high lookback", type=input.integer,
  defval=50, minval=2)
stop_level_short = highest(high, highLen)[1]

if enablelowhigh == true and strategy.position_size<0
    profit_level_short = strategy.position_avg_price - ((stop_level_short[barssold] - strategy.position_avg_price)*profitfactorshort) - slbuffer
    strategy.exit(id="TP/ SL", stop=stop_level_short[barssold] + slbuffer, limit=profit_level_short)

// } Lowest Low/ Highes High Exit Condition

// { ATR Take Profit/ Stop Loss
enableatr = input(true, title="Enable ATR exit?")
atrprofitfactorlong = input(title="ATR Profitfactor Long", type=input.float, step=0.1, defval=6)
atrstopfactorlong = input(title="ATR Stopfactor Long", type=input.float, step=0.1, defval=5)
atrprofitfactorshort = input(title="ATR Profitfactor Short", type=input.float, step=0.1, defval=3)
atrstopfactorshort = input(title="ATR Stopfactor Short", type=input.float, step=0.1, defval=5)

//ATR
lengthATR = input(title="ATR Length", defval=11, minval=1)
atr = atr(lengthATR)

//LONG EXIT
if (afterStartDate) and ((enableatr == true) and (strategy.opentrades > 0))
    barsbought1 = barssince(bought)
    profit_level = strategy.position_avg_price + (atr*atrprofitfactorlong)
    stop_level = strategy.position_avg_price - (atr*atrstopfactorlong)
    strategy.exit("Take Profit/ Stop Loss", "long", stop=stop_level[barsbought1], limit=profit_level[barsbought1])

//SHORT EXIT
if (afterStartDate) and ((enableatr == true) and (strategy.opentrades > 0))
    barssold1 = barssince(sold)
    profit_level = strategy.position_avg_price - (atr*atrprofitfactorshort)
    stop_level = strategy.position_avg_price + (atr*atrstopfactorshort)
    strategy.exit("Take Profit/ Stop Loss", "short", stop=stop_level[barssold1], limit=profit_level[barssold1])

// } ATR Take Profit/ Stop Loss

더 많은