패턴 인식 핀바르 거래 전략

저자:차오장, 날짜: 2023-09-18 14:14:51
태그:

전반적인 설명

이 전략은 촛불 패턴을 식별하여 가격 패턴 거래를 구현합니다. 가장 가까운 핑바 패턴을 찾고 신호에 따라 길거나 짧게 이동합니다. 거래자는 수익을 취하고 손실을 중지 할 수 있습니다. 트렌드가 발전함에 따라 후속 스톱은 더 많은 이익을 얻을 수 있습니다.

전략 논리

현재 촛불이 핑바 요구 사항을 충족하는지 확인합니다. 아래 절반의 몸, 닫고 낮은 근처에 열려 있습니다. 긴 신호는 반대입니다. 상반기에 몸, 높은 근처에 닫고 / 열려 있습니다. 마지막 신호 촛불을 찾고 몸의 높이를 계산하십시오. 높이를 N 곱한 이익으로 설정하고 높이를 M 곱한 중지 손실 (M < N).

진입 후, 정지 추적을 시작하십시오. 계속 움직이고 수익을 취하고 손실을 멈추는 동안 수익을 얻습니다. 어느 하나에 도달 할 때까지.

이점 분석

  • 가격 패턴은 낮은 주파수 신호를 식별하여 과잉 거래를 피합니다.
  • 이윤/손실 배수 조정 가능한 균형 위험 및 보상
  • 더 많은 수익을 올리는 트레일링 스톱 잠금
  • 거짓 탈출을 필터링 함정을 피하는

위험 분석

  • 패턴 인식 정확도는 절대 100%가 아닙니다.
  • 소형 스톱 손실은 소음으로 인해 멈출 위험이 있습니다.
  • 수익을 취해야 합니다.

위험은 매개 변수 최적화, 지표 추가 등으로 줄일 수 있습니다.

최적화 방향

  • 다른 수익 및 스톱 손실 설정을 테스트
  • 거짓 신호를 필터링하는 표시기를 추가합니다.
  • 패턴 인식 논리를 최적화
  • 제품별 견고성 테스트

결론

이 전략은 좋은 백테스트 결과를 가진 패턴 인식을 통해 기회를 식별합니다. 합리적인 정지는 무역 위험을 제어합니다. 매개 변수 최적화와 같은 추가 정화는 간단하고 실용적인 시스템으로 만들 수 있습니다.


/*backtest
start: 2023-09-10 00:00:00
end: 2023-09-17 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// 
// Pinbar strategy script by samgozman (https://github.com/samgozman)
// 
// Detailed instruction how to use this script: https://github.com/samgozman/pinbar-strategy-tradingview
//
// If you liked the script and want to support me: https://paypal.me/sgozman
// 
// ++++++++++ Warning: The script is provided for educational purposes only. ++++++++++ //

strategy('Pinbar strategy', default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=10000)

profitMultiplier = input.float(2.0, "Profit multiplier", minval=0.1, step=0.1, group="Profit options", tooltip="X times signal candle size from high")
lossMultiplier =  input.float(1.0, "Loss multiplier", minval=0.1, step=0.1, group="Profit options", tooltip="X times signal candle size from low")

isTrailingStop = input.bool(true, "Use trailing stops?", group="Trading options", tooltip="Highly recommended!")
isCloseOnOppositSignal = input.bool(false, "Close trade if opposit signal occures?", group="Trading options", tooltip="Close long on short signal")
isLongEligible = input.bool(true, "Enter long trades?", group="Trading options")
isShortEligible = input.bool(true, "Enter short trades?", group="Trading options")

useDateFilter = input.bool(true, title="Begin Backtest at Start Date", group="Backtest Time Period")
backtestStartDate = input(timestamp("1 Jan 2021"), title="Start Date", group="Backtest Time Period")

// Predefined time trading zone for back testing
inTradeWindow = true

// HELPER FUNCTIONS //

// calculate candle size for N bars back. Use 0 for current
calcCandle(int periods) =>
    math.abs(high[periods] - low[periods])

// if body is below 50% and close/open below 30%
isBearishPinbar(float candle) =>
    lower30 = low + candle * 0.30
    bottomHalf1 = close < hl2
    bottomHalf2 = open < hl2
    lowerRegion1 = close < lower30
    lowerRegion2 = open < lower30
    
    con1 = bottomHalf1 and bottomHalf2
    con2 = lowerRegion1 and lowerRegion2
    con3 = high > high[1]
    
    con1 and con2 and con3

// if body is above 50% and close/open above 30%  
isBullishPinbar(float candle) =>
    upper30 = high - candle * 0.30
    topHalf1 = close > hl2
    topHalf2 = open > hl2
    upperRegion1 = close > upper30
    upperRegion2 = open > upper30
    
    con1 = topHalf1 and topHalf2
    con2 = upperRegion1 and upperRegion2
    con3 = low < low[1]
    
    con1 and con2 and con3
    
barsSinceLastEntry() =>
    strategy.opentrades > 0 ? bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) : na

// Calculate trading signals
currentCandle = calcCandle(0)
longSignal = isBullishPinbar(currentCandle) and inTradeWindow
shortSignal = isBearishPinbar(currentCandle) and inTradeWindow

// ENTER THE TRADE //
if longSignal and isLongEligible
    strategy.entry("buy", strategy.long, when = strategy.position_size == 0)

if shortSignal and isShortEligible 
    strategy.entry("sell", strategy.short, when = strategy.position_size == 0)

// CALCULATE STOPS //
barsSinceEntry = barsSinceLastEntry()
candleFromEntry = calcCandle(barsSinceEntry)
// long
long_take_limit = strategy.position_avg_price + (candleFromEntry*profitMultiplier)
long_target_percent_profit = long_take_limit / strategy.position_avg_price - 1
long_target_percent_loss = (long_target_percent_profit / profitMultiplier) * lossMultiplier
long_stop_limit = low[barsSinceEntry] * (1 - long_target_percent_loss)
//short
short_take_limit = strategy.position_avg_price - (candleFromEntry*profitMultiplier)
short_target_percent_profit = strategy.position_avg_price / short_take_limit - 1
short_target_percent_loss = (short_target_percent_profit / profitMultiplier) * lossMultiplier
short_stop_limit = high[barsSinceEntry] * (1 + short_target_percent_loss)

// EXIT THE TRADE //
if strategy.position_size > 0 or strategy.position_size < 0
    if isTrailingStop
        strategy.exit(id="exit", from_entry="buy", trail_price = long_take_limit, stop=long_stop_limit)
        strategy.exit(id="exit", from_entry="sell", trail_price = short_take_limit, stop=short_stop_limit)
    else
        strategy.exit(id="exit", from_entry="buy", limit = long_take_limit, stop=long_stop_limit)
        strategy.exit(id="exit", from_entry="sell", limit = short_take_limit, stop=short_stop_limit)
    if isCloseOnOppositSignal
        strategy.close("buy", when = shortSignal)
        strategy.close("sell", when = longSignal)

// PLOT SIGNALS //
plotshape(longSignal, style=shape.arrowup, color=color.new(color.green, 0), size=size.large, location=location.belowbar)
plotshape(shortSignal, style=shape.arrowdown, color=color.new(color.red, 0), size=size.large, location=location.abovebar)

더 많은