RSI 박스 그리드 전략

저자:차오장, 날짜: 2023-10-30 11:29:30
태그:

img

전반적인 설명

이 전략은 주로 알고리즘 거래를 목적으로 하는 위조 그리드 봇이다. 이 전략은 RSI가 특정 조건을 충족할 때만 업데이트되는 동적, 볼륨 가중화된 그리드를 사용합니다. 이 전략은 또한 일반적인 그리드 봇이 그렇지 않은 반면 (일반적인 그리드 봇은 높은 그리드에 도달하면 판매하지만이 전략은 특정 조건 하에서 낮은 그리드가 위반되면 판매합니다.) 이 전략은 또한 모든 피라미드 주문을 닫습니다.

요약하면, 전략은 RSI가 과잉 구매/ 과잉 판매 수준을 넘어서면 매번 주어진 소스의 부피 가중량 된 최고/최저 값 (설정에서 src) 로 그 그리드를 업데이트합니다. 이 범위에서 5개의 라인으로 구성된 균등하게 거리를 둔 그리드를 생성하고, 현재 소스를 사용하여 가장 가까운 그리드 라인을 결정합니다. 그 다음 소스가 바로 위에 있는 라인을 넘어서면 긴 라인을 입력합니다. 소스가 바로 아래에 있는 라인을 넘어서면 짧은 라인을 입력합니다.

설정에서 쇼트, 소스, RSI 길이, 과잉 구매/ 과잉 판매 수준을 설정할 수 있습니다.

전략 논리

전략의 핵심 논리는 다음과 같습니다.

  1. 트렌드 반전 지점을 결정하기 위해 RSI 지표를 사용하십시오. RSI 라인 크로스오버를 사용하여 과소매/ 과소매 수준을 확인 신호로 사용합니다.

  2. RSI 신호가 발생했을 때, 한 기간 동안 최고/최저 가격을 그리드의 상위/하위 한계로 기록합니다.

  3. 5개의 평평한 격자선으로 범위를 나누고 어떤 선이 가장 가까운지 실시간으로 확인합니다.

  4. 가격이 위의 선을 넘을 때, 롱을 가십시오. 가격이 아래 선을 넘을 때, 롱을 평평화하고 롱을 가십시오.

  5. 터치 대신 브레이크아웃을 사용하면 트렌드 반전을 더 잘 감지할 수 있습니다.

  6. 모든 피라미드 주문을 폐쇄하기 전에

이 전략은 다음과 같습니다.

  1. 입력 설정: 소스, RSI 매개 변수, 긴/단기 등

  2. RSI 계산: RSI를 계산하고 크로스오버 신호를 확인합니다.

  3. 동적 그리드: RSI 신호에 대한 가격 범위를 기록하고 그리드 라인을 계산합니다.

  4. 신호 확인: 긴/단기 신호에 대한 가격 파기 그리드 라인을 탐지합니다.

  5. 주문 관리: 주문을 보내고 닫기 전에 평평합니다.

  6. 차트화: 그리드 라인, 긴/단한 구역 등

그리드를 동적으로 업데이트하고 트렌드 컨텍스트와 브레이크아웃 신호를 위해 RSI를 사용하여이 전략은 트렌드를 효과적으로 추적하고 트렌드 변화가있을 때 역전시킬 수 있습니다. 닫기 전에 평평화하면 하루 종일 위험을 관리합니다.

이점 분석

이 전략의 주요 장점은 다음과 같습니다.

  1. 동적 그리드는 고정된 그리드와 달리 트렌드에 적응합니다.

  2. RSI가 확인되면 격자를 조정해서 소음을 줄여줍니다.

  3. 파격 신호는 촉각보다 반전을 더 잘 감지합니다.

  4. 잠금 전에 평평화 하 여 하루 간 격차 위험을 피 합니다.

  5. RSI는 과잉 구매/판매 검출에 효과적입니다.

  6. 브레이크아웃 모드는 리버션에 비해 초기 트렌드 진입을 제공합니다.

  7. 그리드 간격과 크기를 조정하면 리스크 튜닝이 가능합니다.

  8. 시각 격자 및 긴/단한 구역

  9. 선택적인 쇼트, 다른 상인에게 맞습니다.

  10. 알고 트레이딩에 적합한 간단한 논리입니다.

이 전략은 라이브 트레이딩을 위한 리스크 컨트롤을 통해 자동 트렌드 추적을 할 수 있습니다.

위험 분석

또한 몇 가지 잠재적 인 위험이 있습니다.

  1. 윙사 시장은 스톱 손실을 유발할 수 있습니다. 스톱을 넓히거나 거래를 중단할 수 있습니다.

  2. 밤새의 틈은 큰 틈을 남길 수 있습니다. 위치 크기를 줄일 수 있습니다.

  3. 잘못된 매개 변수 조정은 거래 또는 신호 오류를 증가시킬 수 있습니다. 신중한 최적화가 필요합니다.

  4. 높은 수수료는 그리드 거래의 수익을 침식시킬 수 있습니다. 거래 크기를 줄이거나 낮은 수수료 교환을 사용해야합니다.

  5. 침투 신호는 약간 뒤쳐질 수 있습니다. 합리적인 침투 경계가 필요합니다.

  6. 안정적인 상승 추세에서 저조한 성과를 낼 수 있습니다. 다른 지표와 결합하는 것을 고려하십시오.

  7. 더 큰 포지션 크기와 피라미딩을 위해 충분한 자본이 필요합니다. 그렇지 않으면 결과는 좋지 않을 것입니다. 자본에 기반한 크기를 조정하십시오.

완화:

  1. 거래 빈도와 오버 트레이딩을 줄이기 위해 매개 변수를 최적화합니다.

  2. 트렌드 인디케이터와 결합하고, 트레이딩 기간을 피하세요.

  3. 거래 크기와 거래당 위험을 줄이세요.

  4. 시간 대비 안정성의 가장 좋은 균형을 위해 다른 브레이크아웃 문턱을 테스트합니다.

  5. 더 많은 진입 조건을 추가하고, 덫에 걸리지 않기 위해 명확한 트렌드를 입력하세요.

  6. 파라미터 안정성을 평가하기 위해 더 긴 기간 동안 역 테스트.

  7. 시장 적응력을 위한 기계 학습 기반 동적 매개 변수 최적화를 탐구합니다.

  8. 포지션 리스크를 헤지하기 위해 옵션 전략과 결합하는 것을 고려하십시오.

  9. 전략의 효과를 유지하기 위해 최근 시장 상황에 따라 매개 변수를 조정합니다.

  10. 빠른 테스트를 지원하기 위해 시각 최적화 플랫폼을 구축합니다.

매개 변수 최적화, 신호 개, 그리고 더 많은 시장 정보로, 위험은 정말 신뢰할 수 있는 algo 전략을 만들기 위해 줄일 수 있습니다.

더 나은 기회

이 전략은 다음과 같이 더욱 강화될 수 있습니다.

  1. RSI 매개 변수를 최적화하고, 최고의 조합을 위해 RSI 기간을 테스트합니다.

  2. 최적의 리스크/보상 효과를 위해 다른 그리드 간격을 테스트합니다.

  3. 필터 신호에 다른 지표를 추가합니다. 예를 들어 MACD, KD 등 정확성을 향상시키기 위해.

  4. 시장의 변동성에 기반한 적응식 스톱 개발

  5. 진입 조건이 높아지면서, 함정을 피하기 위해 명백한 경향만 입력하세요.

  6. 파라미터 안정성을 평가하기 위해 더 긴 기간 동안 백테스팅.

  7. 기계 학습 기반의 동적 최적화를 탐구합니다.

  8. 옵션 전략을 포함해서 위험을 감수합니다.

  9. 최근 시장 조건에 따라 매개 변수를 조정하여 효율성을 유지합니다.

  10. 빠른 테스트를 위한 시각 최적화 플랫폼을 구축합니다.

자동 최적화, 전략 콤보, 더 많은 시장 정보 등으로 더 나은 안정성과 수익을 얻을 수 있습니다.

요약

요약하자면, RSI 박스 그리드 전략은 트렌드 반전 확인을 식별하고, 동적 가격 범위 그리드, 거래 브레이크오웃을 설정하고, 내일 평평화하기 위해 RSI를 사용합니다. 알고 거래 전략을 따라 유연한 트렌드를 형성합니다. 고정 그리드와 비교하면 시장 변화에 더 잘 적응합니다.

이 전략은 트렌드 컨텍스트, 동적 그리드, 브레이크아웃 트레이딩 및 전체 인트라데이 평평화를 포함한 장점을 가지고 있습니다. 이것은 리스크 제어로 트렌드를 효과적으로 추적 할 수 있습니다. 그러나 윙사 스톱 손실, 오버나이트 격차와 같은 위험이 존재하며 최적화, 신호 및 리스크 관리가 필요합니다.

많은 향상 기회가 있습니다. 더 많은 지표, ML 최적화, 시각 백테스팅 등을 통합함으로써 더 강력한 고 수익성 알고 트레이딩 전략이 될 수 있습니다. 전반적으로 양 트레이딩을 위해 신뢰할 수 있고 구현하기 쉬운 트렌드 추적 알고리즘 프레임워크를 제공합니다.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © wbburgin

//@version=5
// strategy("RSI Box Strategy (pseudo-Grid Bot)", overlay=true, initial_capital = 10000, 
//  default_qty_type = strategy.percent_of_equity, default_qty_value = 1, pyramiding = 33, commission_value=0.10)

src = input.source(close,"Source")
rsiLength = input.int(14,"RSI Length")
oblvl = input.int(70,"Overbought Level")
oslvl = input.int(30,"Oversold Level")
useShorts = input.bool(false,"Use Shorts",inline="B")
showGrid = input.bool(false,"Show Grid",inline="B")

rsi = ta.rsi(src,rsiLength)

rsi_crossdn = ta.crossunder(rsi,oblvl)
rsi_crossup = ta.crossover(rsi,oslvl)

highest = ta.vwma(ta.highest(src,rsiLength),rsiLength)
lowest = ta.vwma(ta.lowest(src,rsiLength), rsiLength)

gridTop = ta.valuewhen(rsi_crossdn,highest,0)
gridBottom = ta.valuewhen(rsi_crossup,lowest,0)
gridMiddle = math.avg(gridTop,gridBottom)
gridMidTop = math.avg(gridMiddle,gridTop)
gridMidBottom = math.avg(gridMiddle,gridBottom)

diff1 = math.abs(src - gridTop)
diff2 = math.abs(src - gridBottom)
diff3 = math.abs(src - gridMiddle)
diff4 = math.abs(src - gridMidTop)
diff5 = math.abs(src - gridMidBottom)

minDiff = math.min(diff1, diff2, diff3, diff4, diff5)

// Determine which line is the closest
float closestLine = na
if minDiff == diff1
    closestLine := gridTop
else if minDiff == diff2
    closestLine := gridBottom
else if minDiff == diff3
    closestLine := gridMiddle
else if minDiff == diff4
    closestLine := gridMidTop
else if minDiff == diff5
    closestLine := gridMidBottom

buyCrosses = ta.crossover(src,gridTop) or ta.crossover(src,gridBottom) or ta.crossover(src,gridMiddle) or ta.crossover(src,gridMidTop) or ta.crossover(src,gridMidBottom)
sellCrosses= ta.crossunder(src,gridTop) or ta.crossunder(src,gridBottom) or ta.crossunder(src,gridMiddle) or ta.crossunder(src,gridMidTop) or ta.crossunder(src,gridMidBottom)

condition_bull = buyCrosses
condition_bear = sellCrosses

var float bull_status_line = na
var float bear_status_line = na
var float bull_buy_line = na
var float bear_sell_line = na

if condition_bull
    bull_status_line := closestLine
if condition_bear
    bear_status_line := closestLine

if bull_status_line == gridBottom
    bull_buy_line := gridMidBottom
if bull_status_line == gridMidBottom
    bull_buy_line := gridMiddle
if bull_status_line == gridMiddle
    bull_buy_line := gridMidTop
if bull_status_line == gridMidTop
    bull_buy_line := gridTop

if bear_status_line == gridTop
    bear_sell_line := gridMidTop
if bear_status_line == gridMidTop
    bear_sell_line := gridMiddle
if bear_status_line == gridMiddle
    bear_sell_line := gridMidBottom
if bear_status_line == gridMidBottom
    bear_sell_line := gridBottom

l = ta.crossover(src,bull_buy_line)
s = ta.crossunder(src,bear_sell_line)

if l
    strategy.entry("Long",strategy.long)
if s
    strategy.close("Long")
    if useShorts
        strategy.entry("Short",strategy.short)

// Plotting
in_buy = ta.barssince(l) < ta.barssince(s)
u=plot(bull_buy_line,color=na,title="Buy Plot")
d=plot(bear_sell_line,color=na,title="Sell Plot")

plot(not showGrid?na:gridBottom,color=color.new(color.white,75),title="Grid Line -2")
plot(not showGrid?na:gridMidBottom,color=color.new(color.white,75),title="Grid Line -1")
plot(not showGrid?na:gridMiddle,color=color.new(color.white,75),title="Grid Line 0")
plot(not showGrid?na:gridMidTop,color=color.new(color.white,75),title="Grid Line 1")
plot(not showGrid?na:gridTop,color=color.new(color.white,75),title="Grid Line 2")


fill(u,d,color=in_buy ? color.new(color.lime,75) : color.new(color.red,75))

더 많은