AlexInc의 바 v1.2 의미있는 바 필터링에 기초한 브레이크아웃 축적 전략

저자:차오장, 날짜: 2024-01-03 16:30:16
태그:

img

전반적인 설명

이 전략은 K 라인의 의미있는 바를 판단하여 트렌드를 예측하고, 브레이크아웃 신호와 결합한 거래 신호를 생성합니다. 전략은 과도하게 작은 K 라인을 필터링하고 빈번한 작은 변동의 간섭을 피하기 위해 의미있는 바를 분석합니다.

전략 논리

  1. 현재 K-라인의 엔티티 길이 몸값을 판단한다. 만약 그것이 지난 6 K-라인의 평균 몸값의 3배 이상이라면, 그것은 무한 바로 간주된다.

  2. 긴 몸으로 3개의 연속적인 의미있는 바가 있다면, 그것은 긴 신호로 판단됩니다. 짧은 몸으로 3개의 연속적인 바가 있다면, 그것은 짧은 신호로 판단됩니다.

  3. 신호를 판단하는 동안, 가격이 이전 최고 또는 낮은 지점을 돌파하면 추가 거래 신호가 생성됩니다.

  4. SMA를 필터로 사용하세요. 가격이 SMA를 넘을 때만 포지션을 열어요.

  5. 포지션을 취한 후, 가격이 다시 엔트리 포인트 또는 SMA를 돌파하면 포지션을 닫습니다.

이점 분석

  1. 트렌드를 판단하기 위해 '무용한 바'를 사용하면 불필요한 간섭을 필터링하고 더 명확한 신호를 만들 수 있습니다.

  2. 트렌드 신호와 브레이크오웃 신호를 결합하면 신호 품질이 향상되고 잘못된 신호가 감소합니다.

  3. SMA 필터는 높은 가격에 구매하고 낮은 가격에 판매하는 것을 피합니다. 닫기 이하로 구매하고 닫기 이하로 판매하여 신뢰성을 향상시킵니다.

  4. 이윤을 취하고 손해를 멈추는 조건을 설정하는 것은 적시에 위험을 통제하는 것을 촉진합니다.

위험 분석

  1. 이 공격적인 전략은 3개의 바에서 신호를 판단하고 단기 변동을 트렌드 역전으로 잘못 판단할 수 있습니다.

  2. 백테스팅 데이터가 부족합니다. 결과물은 제품과 시간 틀에 따라 다를 수 있습니다.

  3. 1박 2일 위치 제어 없이 1박 2일 보유 위험

최적화 방향

  1. 더 이상 "무익한 바"를 위한 매개 변수를 최적화합니다. 예를 들어, 평가된 바의 수와 "무익한 바"의 정의와 같이요.

  2. 최적의 매개 변수를 찾기 위해 다른 시간 프레임의 영향을 테스트합니다.

  3. ATR 기반의 스톱 로스를 리스크 제어에 추가합니다.

  4. 야간 위치 컨트롤을 추가하는 것을 고려하십시오.

요약

이 전략은 브레이크아웃과 결합한 거래 신호를 생성하기 위해 의미있는 바 필터링과 트렌드 판단을 사용합니다. 보다 명확하고 신뢰할 수있는 신호를 위해 불필요한 작은 변동을 효과적으로 필터링합니다. 그러나 짧은 판단 주기가 있기 때문에 특정 잘못된 판단 위험이 있습니다. 매개 변수 최적화 및 위험 통제를 통해 추가 개선이 가능합니다.


/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-02 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//AlexInc
//2018

// закрытие - вычислить и в течение скольки-то баров его добиваться
// если нет, то по первому противоположному
// по стоп-лоссу в любом случае - стоп вычислить

//@version=2
strategy(title = "AlexInc's Bar v1.2", shorttitle = "AlexInc Bar 1.2", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
tryprofitbars = input(6, defval = 6, minval = 1, maxval = 100, title = "Number of candles to take profit anyway")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")

useSMAfilter = input(false, defval = true, title = "Use SMA filter")
SMAlimit = input(10, defval = 10, minval = 1, maxval = 30, title = "SMA filter limit")
bodysizeMlt = input(3, defval = 3, minval = 1, maxval = 10, title = "Body Size Multiplier")
meanfulbardiv = input(3, title = "Meanful Bar size Divider")

showarr = input(false, defval = false, title = "Show Arrows")
fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//SMA #
index = 0
index := barstate.isfirst ==true ? 0 : nz(index[1])+1

buyindex = 0
buyindex := barstate.isfirst ==true ? 0 : buyindex[1]

sellindex = 0
sellindex := barstate.isfirst ==true ? 0 : sellindex[1]

//predictprofit = barstate.isfirst ==true ? 0 : predictprofit[1]

smafilter = sma(close, SMAlimit)

//Body
body = abs(close - open)
range = abs(high - low)
abody = sma(body, 6)

max3 = 0
if body >= body[1] and body >= body[2]
    max3 := body
else
    if body[1] >= body and body[1] >= body[2]
        max3 := body[1]
    else 
        if body[2] >= body and body[2] >= body[1]
            max3 := body[2]

prevmax3 = 0
prevmax3 := nz(max3[1])


bar = close > open ? 1 : close < open ? -1 : 0
firstbullishopen = 0
firstbullishopen := bar == 1 and bar[1] != 1 ? open : nz(firstbullishopen[1])
firstbearishopen = 0
firstbearishopen := bar == -1 and bar[1] != -1 ? open : nz(firstbearishopen[1])

meanfulbar = body > abody / meanfulbardiv

meanfulbearish = 0
meanfulbearish := nz(meanfulbearish[1])

meanfulbullish = 0
meanfulbullish := nz(meanfulbullish[1])

if meanfulbar
    if bar == 1
        meanfulbullish := 1 + meanfulbullish
        meanfulbearish := 0
    else
        if bar == -1
            meanfulbearish := 1 + meanfulbearish
            meanfulbullish := 0


plot(min(low, high)-10, style=circles, color = meanfulbar ? yellow:black, linewidth=3)

//Signals
up1 = (meanfulbearish >= 3) and (close < firstbullishopen or 1) and (strategy.position_size == 0 or close < strategy.position_avg_price) and body > abody / 5 and (useSMAfilter == false or close < smafilter)
if up1 == true
	predictprofit = sma(body, 3)
up2 = sma(bar, 1) == -1 and body > prevmax3 * bodysizeMlt and (strategy.position_size == 0 or close < strategy.position_avg_price) and body > abody / 5 and (useSMAfilter == false or close < smafilter)
if up2 == true
	predictprofit = body * 0.5
plot(min(low, high), style=circles, color = up1?blue:up2?green:gray, linewidth=3)

dn1 = (meanfulbullish >= 3) and (close > firstbearishopen or 1)  and (strategy.position_size == 0 or close > strategy.position_avg_price) and body > abody / 5 and (useSMAfilter==false or close > smafilter)
if dn1 ==true 
	predictprofit = sma(body, 3)
dn2 = sma(bar, 1) == 1 and body > prevmax3 * bodysizeMlt and (strategy.position_size == 0 or close > strategy.position_avg_price) and body > abody / 5 and (useSMAfilter==false or close > smafilter)
if dn2 ==true	
	predictprofit = body * 0.5
plot(max(low, high), style=circles, color = dn1?blue:dn2?green:gray, linewidth=3)


exit = (((strategy.position_size > 0 and bar == 1 ) or (strategy.position_size < 0 and bar == -1)) and body > abody / 2 )
// or index >= buyindex (or sellindex) + tryprofitbars


//Arrows
col = exit ? black : up1 or dn1 ? blue : up2 or dn2 ? red : na
needup = up1 or up2
needdn = dn1 or dn2
needexitup = exit and strategy.position_size < 0
needexitdn = exit and strategy.position_size > 0
plotarrow(showarr and needup ? 1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needdn ? -1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needexitup ? 1 : na, colorup = black, colordown = black, transp = 0)
plotarrow(showarr and needexitdn ? -1 : na, colorup = black, colordown = black, transp = 0)


//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1 or up2
    if strategy.position_size < 0
        strategy.close_all()
		buyindex = index
		sellindex = index
	if strategy.position_size == 0
		buyindex = index
		
        
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot )

if dn1 or dn2
    if strategy.position_size > 0
        strategy.close_all()
		buyindex = index
		sellindex = index
	if strategy.position_size == 0
		sellindex = index
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot )
    
if  exit
    strategy.close_all()

더 많은