리소스 로딩... 로딩...

내일 패턴 인식과 함께 SMA 기반의 지능형 트레일링 스톱 전략

저자:차오장, 날짜: 2025-01-17 16:04:09
태그:SMAMA18ATR

 SMA-Based Intelligent Trailing Stop Strategy with Intraday Pattern Recognition

전반적인 설명

이 전략은 18일 간 간편 이동 평균 (SMA18) 을 기반으로 하며, 내일 패턴 인식과 지능형 트레일링 스톱 메커니즘을 결합한다. 이 전략은 주로 내일 높은 및 낮은 포지션과 함께 SMA18과의 가격 관계를 관찰하여 최적의 시간에 긴 엔트리를 실행한다. 유연한 스톱 로스 접근 방식을 사용하여 고정 스톱 로스 포인트와 2일 낮은 트레일링 스톱 옵션을 모두 제공합니다.

전략 원칙

핵심 논리는 몇 가지 핵심 요소를 포함합니다. 1. 18일 이동평균에 대한 가격 지위에 기초한 입상 조건, 브레이크오웃 또는 라인 이상의 입상 옵션 2. 입력 정확성을 향상시키기 위해 특히 내부 바 패턴에 중점을 둔 내일 촛불 패턴 분석 3. 주일 특성에 기초한 선택적 거래 4. 채울 확률을 향상시키기 위해 최저에서 작은 상향 오프셋을 가진 제한 주문을 사용하여 입시 가격 설정 5. 이중 스톱 로스 메커니즘: 입상 가격에 기반한 고정 스톱 또는 2 일 최저에 기반한 트레일링 스톱

전략적 장점

  1. 보다 신뢰할 수 있는 입시 신호를 위해 기술 지표와 가격 패턴을 결합합니다.
  2. 시장별 최적화를 위한 유연한 거래 시간 선택 메커니즘
  3. 이윤을 보호하고 적절한 가격 움직임을 허용하는 지능형 스톱 로스 시스템
  4. 다른 시장 환경에 대한 매우 조정 가능한 매개 변수
  5. 실내 바 패턴 필터링을 통해 효과적인 거짓 신호 감소

전략 위험

  1. 고정 스톱은 변동성 시장에서 조기 출퇴를 유발할 수 있습니다.
  2. 후속 정지는 빠른 반전 동안 최소한의 이익을 잠금 할 수 있습니다.
  3. konsoli­dation 중에 빈번한 내부 바가 오버 트레이딩으로 이어질 수 있습니다. 완화 조치:
  • 시장 변동성에 기초한 동적 스톱 로스 조정
  • 추세 확인 지표의 추가
  • 낮은 품질의 거래를 필터링하기 위한 최소 수익 목표의 구현

최적화 방향

  1. 동적 스톱 로스 조정을 위해 변동성 지표 (ATR 같은) 를 포함합니다.
  2. 신호 신뢰성을 향상시키기 위해 볼륨 분석 차원을 추가
  3. 역사적인 성능에 기반한 더 똑똑한 날짜 선택 알고리즘을 개발
  4. 약한 트렌드에 거래하는 것을 피하기 위해 트렌드 강도 필터를 구현하십시오.
  5. 개선 된 패턴 식별을 위해 내부 바 인식 알고리즘을 향상

요약

이 전략은 여러 분석 차원을 결합하여 포괄적인 거래 시스템을 구축합니다. 그것의 핵심 강점은 유연한 매개 변수 설정과 지능적인 스톱 로스 메커니즘에 있으며, 다양한 시장 환경에 적응 할 수 있습니다. 지속적인 최적화 및 개선으로 전략은 다양한 시장 조건에서 안정적인 성능을 유지하는 것을 약속합니다.


/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-16 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © zweiprozent

strategy('Buy Low over 18 SMA Strategy', overlay=true, default_qty_value=1)
xing = input(false, title='crossing 18 sma?')
sib = input(false, title='trade inside Bars?')
shortinside = input(false, title='trade inside range bars?')
offset = input(title='offset', defval=0.001)
belowlow = input(title='stop below low minus', defval=0.001)
alsobelow = input(false, title='Trade only above 18 sma?')
tradeabove = input(false, title='Trade with stop above order?')
trailingtwo = input(false, title='exit with two days low trailing?')


insideBar() =>  //and high <= high[1] and low >= low[1] ? 1 : 0
    open <= close[1] and close >= open[1] and close <= close[1] or open >= close[1] and open <= open[1] and close <= open[1] and close >= close[1] ? 1 : 0

inside() =>
    high <= high[1] and low >= low[1] ? 1 : 0
enterIndex = 0.0
enterIndex := enterIndex[1]

inPosition = not na(strategy.position_size) and strategy.position_size > 0
if inPosition and na(enterIndex)
    enterIndex := bar_index
    enterIndex



//if strategy.position_size <= 0 

//    strategy.exit("Long", stop=low[0]-stop_loss,comment="stop loss")


//if not na(enterIndex) and bar_index - enterIndex + 0 >= 0 

//    strategy.exit("Long", stop=low[0]-belowlow,comment="exit")

//    enterIndex := na

T_Low = request.security(syminfo.tickerid, 'D', low[0])
D_High = request.security(syminfo.tickerid, 'D', high[1])
D_Low = request.security(syminfo.tickerid, 'D', low[1])
D_Close = request.security(syminfo.tickerid, 'D', close[1])
D_Open = request.security(syminfo.tickerid, 'D', open[1])

W_High2 = request.security(syminfo.tickerid, 'W', high[1])
W_High = request.security(syminfo.tickerid, 'W', high[0])
W_Low = request.security(syminfo.tickerid, 'W', low[0])
W_Low2 = request.security(syminfo.tickerid, 'W', low[1])
W_Close = request.security(syminfo.tickerid, 'W', close[1])
W_Open = request.security(syminfo.tickerid, 'W', open[1])

//longStopPrice  = strategy.position_avg_price * (1 - stopl)
// Go Long - if prev day low is broken and stop loss prev day low
entryprice = ta.sma(close, 18)

//(high[0]<=high[1]or close[0]<open[0]) and low[0]>vwma(close,30) and time>timestamp(2020,12,0,0,0)

showMon = input(true, title='trade tuesdays?')
showTue = input(true, title='trade wednesdayy?')
showWed = input(true, title='trade thursday?')
showThu = input(true, title='trade friday?')
showFri = input(true, title='trade saturday?')
showSat = input(true, title='trade sunday?')
showSun = input(true, title='trade monday?')

isMon() =>
    dayofweek(time('D')) == dayofweek.monday and showMon
isTue() =>
    dayofweek(time('D')) == dayofweek.tuesday and showTue
isWed() =>
    dayofweek(time('D')) == dayofweek.wednesday and showWed
isThu() =>
    dayofweek(time('D')) == dayofweek.thursday and showThu
isFri() =>
    dayofweek(time('D')) == dayofweek.friday and showFri
isSat() =>
    dayofweek(time('D')) == dayofweek.saturday and showSat
isSun() =>
    dayofweek(time('D')) == dayofweek.sunday and showSun


clprior = close[0]
entryline = ta.sma(close, 18)[1]
//(isMon() or isTue()or isTue()or  isWed() 
noathigh = high < high[1] or high[2] < high[3] or high[1] < high[2] or low[1] < ta.sma(close, 18)[0] and close > ta.sma(close, 18)[0]

if noathigh and time > timestamp(2020, 12, 0, 0, 0) and (alsobelow == false or high >= ta.sma(close, 18)[0]) and (isMon() or isTue() or isWed() or isThu() or isFri() or isSat() or isSun()) and (high >= high[1] or sib or low <= low[1])  //((sib == false and inside()==true) or inside()==false) and (insideBar()==true or shortinside==false)
    if tradeabove == false
        strategy.entry('Long', strategy.long, limit=low + offset * syminfo.mintick, comment='long')
    if tradeabove == true and (xing == false or clprior < entryline)  // and high<high[1] 
        strategy.entry('Long', strategy.long, stop=high + offset * syminfo.mintick, comment='long')


//if time>timestamp(2020,12,0,0,0) and isSat()  
//    strategy.entry("Long", strategy.long, limit=0, comment="long")


//strategy.exit("Long", stop=low-400*syminfo.mintick)

//strategy.exit("Long", stop=strategy.position_avg_price-10*syminfo.mintick,comment="exit")
//strategy.exit("Long", stop=low[1]-belowlow*syminfo.mintick, comment="stop")

if strategy.position_avg_price > 0 and trailingtwo == false and close > strategy.position_avg_price
    strategy.exit('Long', stop=strategy.position_avg_price, comment='stop')

if strategy.position_avg_price > 0 and trailingtwo == false and (low > strategy.position_avg_price or close < strategy.position_avg_price)
    strategy.exit('Long', stop=low[0] - belowlow * syminfo.mintick, comment='stop')

if strategy.position_avg_price > 0 and trailingtwo
    strategy.exit('Long', stop=ta.lowest(low, 2)[0] - belowlow * syminfo.mintick, comment='stop')




관련

더 많은