이 전략은 동력 지표와 촛불 엔티티 필터링을 결합한 개인화된 거래 전략이다. 이 전략은 세 가지 기술 지표 - 스토카스틱 모멘텀 인덱스, 빠른 RSI 및 촛불 엔티티 필터링 - 를 종합적으로 사용하여 초고와 초판 조건을 고려하면서 동력 돌파구 기반 전략을 구현합니다.
이 전략은 거래 신호 판단을 위해 다음 세 가지 지표를 사용합니다.
스토카스틱 모멘텀 인덱스 (SMI): 촛불 엔티티 사이의 간격과 폐쇄 가격의 상대적 위치를 결합하여 가격 모멘텀의 강도 또는 약도를 판단합니다. SMI가 경계선을 넘을 때 구매 신호를 생성하고 경계선을 넘을 때 판매 신호를 생성합니다.
빠른 RSI (7일 라인): 가격의 과잉 구매 및 과잉 판매 조건을 판단합니다. 20 이하의 RSI는 과잉 판매로 구매 신호를 생성하고 80 이상은 과잉 구매로 판매 신호를 생성합니다.
촛불 엔티티 필터: 지난 10 일 동안 평균 촛불 엔티티 크기를 계산합니다. 유효하지 않은 신호를 피하기 위해 오늘날의 촛불 엔티티가 그 평균의 1/3을 초과 할 때만 신호를 활성화하십시오.
전략은 먼저 SMI와 RSI의 신호를 판단합니다. 표시자 신호 요구 사항이 충족되면 촛불 엔티티 필터를 결합하여 해당 신호가 유효한지 확인하고 유효한 경우 거래 신호를 생성합니다.
이 전략은 다음과 같은 장점을 가지고 있습니다.
판단은 여러 지표의 조합으로 더 정확하고 신뢰할 수 있습니다.
촛불 엔티티 필터를 추가하면 유효하지 않은 신호를 피할 수 있습니다.
과잉 구매/ 과잉 판매 조건을 결합함으로써 트렌드 반전 시점에 신호를 더 쉽게 파악할 수 있습니다.
두 방향의 긴/단거 거래로 수익 기회 증가
부분 포지션 거래는 과도한 일회적 손실을 피합니다.
이 전략은 또한 몇 가지 위험을 안고 있습니다.
지표는 손실로 이어지는 잘못된 신호를 생성 할 수 있습니다. 매개 변수 최적화는 잘못된 신호를 줄일 수 있습니다.
부분 포지션 거래는 각 방향으로의 트렌드 기회를 완전히 활용할 수 없습니다. 거래 포지션 크기를 증폭시킴으로써 더 높은 수익을 얻을 수 있습니다.
주요 지표로서 SMI는 매개 변수 설정에 민감합니다. 잘못된 구성은 거래 기회를 놓칠 수 있습니다.
두 방향의 전략으로 자주 거래하면 거래 비용이 증가합니다.
이 전략은 다음 측면에서 더 이상 최적화 될 수 있습니다.
SMI와 RSI를 위한 매개 변수를 최적화하여 최적의 매개 변수 조합을 찾습니다.
트렌드 도중 더 높은 수익률을 달성하기 위해 포지션 크기와 포지션 관리 메커니즘을 강화합니다.
한 번에 손실 위험을 줄이기 위해 스톱 로스 전략을 추가합니다.
신호 신뢰성을 판단하고 잘못된 신호를 줄이기 위해 더 많은 지표를 결합하십시오.
효율적인 계약을 채택하여 거래 비용을 줄이세요.
이 전략은 SMI, 빠른 RSI 및 촛불 엔티티 필터링 지표를 종합적으로 활용하여 추진력을 기반으로 한 과잉 구매 / 과잉 판매 인식 개인화 된 거래 전략을 구현합니다. 정확한 판단, 유효한 신호의 식별, 과잉 구매 / 과잉 판매 조건과 양방향 거래의 조합과 같은 장점이 있지만 매개 변수 민감성, 트렌드를 완전히 자본화 할 수 없다는 것과 빈번한 거래와 같은 위험도 있습니다. 매개 변수를 지속적으로 최적화하여 포지션 사이징 및 스톱 로스 관리를 증가시키고 잘못된 신호를 줄이면서 전략은 더 나은 거래 성과를 얻을 수 있습니다.
/*backtest start: 2023-10-23 00:00:00 end: 2023-11-22 00:00:00 period: 6h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=2 strategy(title = "Noro's Stochastic Strategy v1.2", shorttitle = "Stochastic str 1.2", overlay = false, 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") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %") usesmi = input(true, defval = true, title = "Use SMI Strategy") usersi = input(true, defval = true, title = "Use RSI Strategy") usebod = input(true, defval = true, title = "Use Body-Filter") a = input(5, "SMI Percent K Length") b = input(3, "SMI Percent D Length") limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit") fromyear = input(2017, defval = 2017, 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") //Fast RSI fastup = rma(max(change(close), 0), 7) fastdown = rma(-min(change(close), 0), 7) fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown)) //Stochastic Momentum Index ll = lowest (low, a) hh = highest (high, a) diff = hh - ll rdiff = close - (hh+ll)/2 avgrel = ema(ema(rdiff,b),b) avgdiff = ema(ema(diff,b),b) SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0 SMIsignal = ema(SMI,b) //Lines plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index") plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line") plot(limit, color = black, title = "Over Bought") plot(-1 * limit, color = black, title = "Over Sold") plot(0, color = blue, title = "Zero Line") //Body Filter nbody = abs(close - open) abody = sma(nbody, 10) body = nbody > abody / 3 or usebod == false //Signals up1 = SMI < -1 * limit and close < open and body and usesmi dn1 = SMI > limit and close > open and body and usesmi up2 = fastrsi < 20 and close < open and body and usersi dn2 = fastrsi > 80 and close > open and body and usersi exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body //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() strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if dn1 or dn2 if strategy.position_size > 0 strategy.close_all() strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if time > timestamp(toyear, tomonth, today, 23, 59) or exit strategy.close_all()