모멘텀 브레이크아웃 식별 전략


생성 날짜: 2023-11-02 14:39:22 마지막으로 수정됨: 2023-11-02 14:39:22
복사: 0 클릭수: 554
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

모멘텀 브레이크아웃 식별 전략

개요

이 전략은 빠르게 상승하는 주식을 식별하고 새로운 고치를 돌파 할 때 더 많은 입장을 세우고 고정된 비율의 정지 방법을 사용하여 수익을 얻습니다. 이 전략은 트렌드 추적 전략입니다.

원칙

이 전략은 크게 두 가지 지표에 기반을 두고 있습니다.

  1. 빠른 RSI: 최근 3개의 K선에서의 상승과 하락 변화를 계산하여 가격 동력을 판단한다. 빠른 RSI가 10보다 낮으면 주식이 초하락 상태에 있다고 간주한다.

  2. 주체 필터: 최근 20개의 K선에서 개체의 평균 크기를 계산하고, 가격 개체가 평균 개체보다 2.5배 더 큰 경우, 효과적인 돌파구로 간주한다.

급속한 RSI가 10보다 낮고 실물 필터가 유효할 때, 더 많은 포지션을 열기. 그리고 20%의 고정된 중지 지점을 설정합니다. 가격이 포지션 개시 가격을 초과 할 때*(1+피스트 비율) 이 되면, 평상시 피스트.

이 전략의 장점은 트렌드 초기 단계의 돌파 기회를 잡을 수 있다는 것입니다. 빠른 RSI를 통해 하위 지역을 판단하고, 실물 필터를 사용하여 가짜 돌파를 방지합니다. 고정된 스톱 방식을 사용하여 각 수익을 잠금화하여 지속적인 추세를 잡을 수 있습니다.

우위 분석

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

  1. 빠른 RSI를 사용하여 하위 오버패스 영역을 판단하여 진입 정확도를 향상시킬 수 있습니다.

  2. 주체 필터 메커니즘은 진동으로 인한 가짜 돌파구를 피할 수 있다.

  3. 고정된 비율을 사용해서 지속적으로 수익을 올리고, 동향을 파악할 수 있다.

  4. 전략의 논리는 간단하고 명확하며, 구현을 이해하기 쉽습니다.

  5. 코드가 우아하고 확장성이 강하여 전략적 최적화를 용이하게 합니다.

  6. 재검토 기간 동안, 전략은 안정적인 긍정적인 수익을 얻었고, 승률이 높았다.

위험 분석

이 전략에는 몇 가지 위험도 있습니다.

  1. 이 전략은 단독 손실을 확대할 위험이 있다.

  2. 고정 정지 지점이 잘못 설정되면 조기 정지 또는 정지 지점이 너무 깊어질 수 있습니다.

  3. 상황이 불안정할 때, 연속적으로 작은 손실이 발생할 수 있는 상황.

  4. 금융투자비용을 고려하지 않고 실적시효 수익률이 감소한다.

  5. 전략 파라미터가 최적화되지 않아, 다른 품종은 파라미터를 조정해야 한다.

최적화 방향

이 전략은 다음과 같은 측면에서 최적화될 수 있습니다.

  1. 단독 손실을 통제할 수 있는 손해 방지 장치가 추가되었습니다.

  2. 동적으로 트렌드를 추적할 수 있도록 스톱포인트 지점을 최적화한다.

  3. 진입기준의 정확성을 높이기 위해 진입기준의 정확성을 높이기 위해 진입기준의 정확성을 높이기 위해

  4. 포지션 관리 모듈을 추가하고 포지션 점유율을 최적화합니다.

  5. 품종 변수 최적화 모듈을 추가하여 다양한 품종의 변수를 자동으로 최적화합니다.

  6. 필터링 조건을 추가하여 시장이 너무 불안정할 때 손실을 피하십시오.

  7. 포지션 평균 비용 관리 모듈을 추가하는 것을 고려하십시오.

요약하다

이 전략은 전반적으로 매우 간결하고 우아한 트렌드 추적 전략이다. 그것은 빠른 RSI 판단 오버패스를 이용하고, 실물 필터링을 사용하여 효과적인 브레이크를 결정하고, 고정된 스톱포인트 지점을 사용하여 안정적인 수익을 얻는다. 일부 최적화 할 수있는 공간이 있지만, 이 전략은 반응敏捷, 상황이 빠르게 변화하는 시나리오를 포착하는 데 적합하며, 매우 실용적인 거래 전략이다. 지속적인 최적화를 통해, 강력한 신뢰할 수있는 긴 선 포지션 전략이 될 수 있다고 믿습니다.

전략 소스 코드
/*backtest
start: 2022-10-26 00:00:00
end: 2023-11-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// this is based on https://www.tradingview.com/v/PbQW4mRn/
strategy(title = "ONLY LONG V4 v1", overlay = true, initial_capital = 1000, pyramiding = 1000,
   calc_on_order_fills = false, calc_on_every_tick = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 50, commission_value = 0.075)

//study(title = "ONLY LONG V4 v1", overlay = true)

//Fast RSI
src = close
fastup = rma(max(change(src), 0), 3)
fastdown = rma(-min(change(src), 0), 3)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Body Filter
body = abs(close - open)
abody = sma(body, 20)

mac = sma(close, 20)
len = abs(close - mac)
sma = sma(len, 100)
max = max(open, close)
min = min(open, close)
up = close < open and len > sma * 2 and min < min[1] and fastrsi < 10 and body > abody * 2.5

// Strategy
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

var bool longCondition = na

longCondition := up == 1 ? 1 : na

// Get the price of the last opened long

var float last_open_longCondition = na

last_open_longCondition := longCondition ? close : nz(last_open_longCondition[1])

// Get the bar time of the last opened long

var int last_longCondition = 0

last_longCondition := longCondition ? time : nz(last_longCondition[1])

// Take profit
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

tp = input(20, "TAKE PROFIT %", type = input.float, minval = 0, step = 0.5)

long_tp = crossover(high, (1+(tp/100))*last_open_longCondition) and not longCondition

// Get the time of the last tp close

var int last_long_tp = na

last_long_tp := long_tp ? time : nz(last_long_tp[1])

Final_Long_tp = long_tp and last_longCondition > nz(last_long_tp[1])

// Count your long conditions

var int sectionLongs = 0

sectionLongs := nz(sectionLongs[1])

var int sectionTPs = 0

sectionTPs := nz(sectionTPs[1])

// Longs Counter

if longCondition
    sectionLongs := sectionLongs + 1
    sectionTPs := 0

if Final_Long_tp
    sectionLongs := 0
    sectionTPs := sectionTPs + 1
    
// Signals
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

// Long

// label.new(
//    x = longCondition[1] ? time : na, 
//    y = na, 
//    text = 'LONG'+tostring(sectionLongs), 
//    color=color.lime, 
//    textcolor=color.black,  
//    style = label.style_labelup, 
//    xloc = xloc.bar_time, 
//    yloc = yloc.belowbar,
//    size = size.tiny)
   
// Tp

// label.new(
//    x = Final_Long_tp ? time : na, 
//    y = na, 
//    text = 'PROFIT '+tostring(tp)+'%', 
//    color=color.orange, 
//    textcolor=color.black,  
//    style = label.style_labeldown, 
//    xloc = xloc.bar_time, 
//    yloc = yloc.abovebar,
//    size = size.tiny) 

ltp = iff(Final_Long_tp, (last_open_longCondition*(1+(tp/100))), na), plot(ltp, style=plot.style_cross, linewidth=3, color = color.white, editable = false)

// Backtesting
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

testStartYear = input(2019, "BACKTEST START YEAR", minval = 1, maxval = 2222) 
testStartMonth = input(01, "BACKTEST START MONTH", minval = 1, maxval = 12)
testStartDay = input(01, "BACKTEST START DAY", minval = 1, maxval = 31)
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

strategy.entry("long", strategy.long, when = longCondition and (time >= testPeriodStart))
strategy.exit("TP", "long", limit = (last_open_longCondition*(1+(tp/100))))

// Alerts
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

alertcondition(longCondition[1], title="Long Alert", message = "LONG")
alertcondition(Final_Long_tp, title="Long TP Alert", message = "LONG TP")