더블 인클루전과 트렌드 전략


생성 날짜: 2024-01-30 15:11:48 마지막으로 수정됨: 2024-01-30 15:11:48
복사: 1 클릭수: 705
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

더블 인클루전과 트렌드 전략

개요

이중 내재형과 트렌드 전략은 이중 내재형과 이동 평균을 사용하여 트렌드를 판단하는 양적 거래 전략이다. 이 전략은 이중 내재형과 결합하여 높은 확률의 거래 신호를 제공하면서 이동 평균을 사용하여 시장 추세를 판단하고 트렌드 방향으로 더 많은 공백을 한다.

전략 원칙

  1. Hull 이동 평균을 추세를 판단하는 지표로 계산한다.
  2. 두 번째 내재형이 나타났을 때, 이것은 더 높은 확률의 거래 신호라고 생각한다. 내재형은 앞의 두 K선에서 가장 높은 가격이며, 가장 낮은 가격은 모두 제3의 K선에 포함된 형태이다.
  3. 종결 가격이 이동 평균선 위에 있고 다중 하위 함수를 형성하면, 내포형 고점 근처에 구매 중지 명령을 설정한다. 종결 가격이 이동 평균선 아래에 있고 공백 하위 함수를 형성하면, 내포형 저점 근처에 판매 중지 명령을 설정한다.
  4. 정지표가 트리플되면, 미리 설정된 정지폭과 정지비율에 따라 정지 및 정지표를 설정한다.

우위 분석

  1. 내포형은 높은 확률의 역전 신호를 제공한다. 이중 내포형의 출현은 단기간에 가격 역전을 예고할 수 있다.
  2. 이동 평균과 결합하여 큰 추세 방향으로 작동하여 수익률을 높일 수 있습니다.
  3. 트렌드 기간 동안 브레이크 포인트 근처의 단독 창고 건설을 중지하여 더 나은 입점 시간을 얻을 수 있다.

위험 분석

  1. 위기 상황에서 내재형으로 제공되는 거래 신호는 손실이 자주 발생할 수 있습니다.
  2. 이동 평균은 트렌드를 판단하는 지표로도 잘못된 신호를 보낼 수 있으며, 역동적인 거래 손실을 초래할 수 있다.
  3. 스톱포인트의 설정이 너무 작아서 가격의 작은 슬라이드에서 스톱포인트가 트리거될 수 있다.

최적화 방향

  1. 트렌드를 판단하는 지표로 다양한 변수의 이동 평균을 테스트할 수 있다.
  2. 다른 지표와 함께 흔들리는 상황을 필터링하여 명확한 추세가 없는 경우에 맹목적인 거래를 피할 수 있습니다.
  3. 이동 평균 주기, 스톱 손실 배수, 스톱 스톱 비율 등과 같은 더 나은 파라미터 조합을 빅 데이터 분석을 통해 얻을 수 있다.
  4. 거래 시간 및 품종의 필터링 조건을 추가하여 다른 시간 주기 및 다른 품종의 특성에 맞게 할 수 있습니다.

요약하다

이중 내재와 트렌드 전략은 이중 내재 형식을 사용하여 높은 확률의 거래 신호를 제공하며, 이동 평균이 큰 트렌드의 방향을 판단하는 데 도움을 주며, 트렌드 방향에서 더 많은 공백을 하는 것이 안정적인 돌파구 유형의 전략입니다. 매개 변수 최적화 및 규칙 최적화를 통해 이 전략은 시장에 대한 적응성이 더 좋아지고, 높은 수익률을 얻을 수 있습니다.

전략 소스 코드
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Kaspricci

//@version=5
strategy(
     title = "Double Inside Bar & Trend Strategy - Kaspricci", 
     shorttitle = "Double Inside Bar & Trend", 
     overlay=true, 
     initial_capital = 100000, 
     currency = currency.USD, 
     default_qty_type = strategy.percent_of_equity, 
     default_qty_value = 100, 
     calc_on_every_tick = true, 
     close_entries_rule = "ANY")

// ================================================ Entry Inputs ======================================================================
headlineEntry   = "Entry Seettings"

maSource        = input.source(defval = close,             group = headlineEntry, title = "MA Source")
maType          = input.string(defval = "HMA",             group = headlineEntry, title = "MA Type", options = ["EMA", "HMA", "SMA", "SWMA", "VWMA", "WMA"])
maLength        = input.int(   defval = 45,    minval = 1, group = headlineEntry, title = "HMA Length")

float ma = switch maType 
    "EMA"  => ta.ema(maSource,  maLength)
    "HMA"  => ta.hma(maSource,  maLength)
    "SMA"  => ta.sma(maSource,  maLength)
    "SWMA" => ta.swma(maSource)
    "VWMA" => ta.vwma(maSource, maLength)
    "WMA"  => ta.wma(maSource,  maLength)

plot(ma, "Trend MA", color.purple)

// ================================================ Trade Inputs ======================================================================
headlineTrade   = "Trade Seettings"

stopLossType    = input.string(defval = "ATR",                         group = headlineTrade,                 title = "Stop Loss Type",            options = ["ATR", "FIX"])
atrLength       = input.int(   defval = 50,   minval = 1,              group = headlineTrade, inline = "ATR", title = "   ATR: Length                 ")
atrFactor       = input.float( defval =  2.5, minval = 0, step = 0.05, group = headlineTrade, inline = "ATR", title = "Factor       ",             tooltip = "multiplier for ATR value")
takeProfitRatio = input.float( defval =  2.0, minval = 0, step = 0.05, group = headlineTrade,                 title = "            TP Ration",     tooltip = "Multiplier for Take Profit calculation")
fixStopLoss     = input.float( defval = 10.0, minval = 0, step = 0.5,  group = headlineTrade, inline = "FIX", title = "   FIX: Stop Loss             ") * 10 // need this in ticks
fixTakeProfit   = input.float( defval = 20.0, minval = 0, step = 0.5,  group = headlineTrade, inline = "FIX", title = "Take Profit",               tooltip = "in pips") * 10 // need this in ticks
useRiskMagmt    = input.bool(  defval = true,                          group = headlineTrade, inline = "RM",  title = "")
riskPercent     = input.float( defval = 1.0,  minval = 0., step = 0.5, group = headlineTrade, inline = "RM",  title = "Risk in %                ", tooltip = "This will overwrite quantity from startegy settings and calculate the trade size based on stop loss and risk percent") / 100

// ================================================ Filter Inputs =====================================================================
headlineFilter  = "Filter Setings"

// date filter
filterDates     = input.bool(defval = false,                                 group = headlineFilter, title = "Filter trades by dates")
startDateTime   = input(defval = timestamp("2022-01-01T00:00:00+0000"), group = headlineFilter, title = "       Start Date & Time")
endDateTime     = input(defval = timestamp("2099-12-31T23:59:00+0000"), group = headlineFilter, title = "       End Date & Time  ")

dateFilter      = not filterDates or (time >= startDateTime and time <= endDateTime)

// session filter
filterSession   = input.bool(title = "Filter trades by session", defval = false, group = headlineFilter)
session         = input(title = "       Session", defval = "0045-2245", group = headlineFilter)

sessionFilter   = not filterSession or time(timeframe.period, session, timezone = "CET")

// ================================================ Trade Entries and Exits =====================================================================

// calculate stop loss
stopLoss        = switch stopLossType
    "ATR" => nz(math.round(ta.atr(atrLength) * atrFactor / syminfo.mintick, 0), 0)
    "FIX" => fixStopLoss

// calculate take profit
takeProfit      = switch stopLossType
    "ATR" => math.round(stopLoss * takeProfitRatio, 0)
    "FIX" => fixTakeProfit


doubleInsideBar = high[2] > high[1] and high[2] > high[0] and low[2] < low[1] and low[2] < low[0]

// highlight mother candel and inside bar candles
bgcolor(doubleInsideBar ? color.rgb(33, 149, 243, 80) : na)
bgcolor(doubleInsideBar ? color.rgb(33, 149, 243, 80) : na, offset = -1)
bgcolor(doubleInsideBar ? color.rgb(33, 149, 243, 80) : na, offset = -2)

var float buyStopPrice  = na
var float sellStopPrice = na

if (strategy.opentrades == 0 and doubleInsideBar and barstate.isconfirmed)
    buyStopPrice  := high[0] // high of recent candle (second inside bar)
    sellStopPrice := low[0] // low of recent candle (second inside bar)

    tradeID = str.tostring(strategy.closedtrades + strategy.opentrades + 1)

    quantity = useRiskMagmt ? math.round(strategy.equity * riskPercent / stopLoss, 2) / syminfo.mintick : na

    commentTemplate = "{0} QTY: {1,number,#.##} SL: {2} TP: {3}"

    if (close > ma)
        longComment = str.format(commentTemplate, tradeID + "L", quantity, stopLoss / 10, takeProfit / 10)
        strategy.entry(tradeID + "L", strategy.long, qty = quantity, stop = buyStopPrice, comment = longComment)
        strategy.exit(tradeID + "SL", tradeID + "L", profit = takeProfit, loss = stopLoss, comment_loss = "SL", comment_profit = "TP")

    if (close < ma)
        shortComment = str.format(commentTemplate, tradeID + "S", quantity, stopLoss / 10, takeProfit / 10)
        strategy.entry(tradeID + "S", strategy.short, qty = quantity, stop = sellStopPrice, comment = shortComment)
        strategy.exit(tradeID + "SL", tradeID + "S", profit = takeProfit, loss = stopLoss, comment_loss = "SL", comment_profit = "TP")

// as soon as the first pending order has been entered the remaing pending order shall be cancelled 
if strategy.opentrades > 0
    currentTradeID = str.tostring(strategy.closedtrades + strategy.opentrades)
    strategy.cancel(currentTradeID + "S")
    strategy.cancel(currentTradeID + "L")