이 전략은 고전적인 단기 거래 아이디어에 기반을 두고 있다. 즉, 연속적인 상승성 촛불에 따라 단기, 연속적인 하락성 촛불에 따라 길게 이동한다. 구체적으로, 이 전략은 촛불의 몸높이와 색상을 감지하여 동일한 색상의 촛불의 발생을 결정하고, 그 다음 반전이 일어나는지 여부를 결정하기 위해 RVI 지표를 사용합니다. 전반적으로, 이것은 촛불 패턴과 RVI 지표를 결합하여 단기 반전 거래를 구현하는 전략이다. 이는 비정상적인 단기 가격 행동이 발생했을 때 반전 기회를 포착하는 것을 목표로 한다.
이 전략의 핵심 논리는 다음과 같습니다.
촛불 몸 높이가 최소 임계치를 초과하는지 확인하여 부지런한 상승/하락 움직임을 필터링합니다.
이전 두 개의 촛불이 같은 색깔인지 확인해 보세요. 이는 잠재적인 단기적 반전을 나타낼 수 있습니다.
현재 촛불이 이전 두 개와 다른 색상을 가지고 있다면 거래 신호가 생성됩니다. 즉 두 개의 불리 촛불과 한 번 상승 후 긴 거리로 이동하고 두 개의 불리 촛불과 한 번 하락 후 짧은 거리로 이동합니다.
트레이드에 진입한 후, RVI 라인과 신호 라인의 교차가 출구 포지션을 결정하는 데 사용됩니다. RVI 지표는 단기 반전을 식별 할 수 있습니다.
요약하자면, 이 전략은 촛불 패턴과 RVI 지표를 결합하여 단기 평균 반전 시스템을 만들고, 비정상적인 단기 가격 행동에서 수익성 있는 반전을 포착합니다.
이 전략의 주요 장점은 다음과 같습니다.
단기 가격 변칙을 포착합니다. 같은 색의 촛불은 종종 반전 준비가 된 변칙을 나타냅니다.
RVI 지표는 반전 결정에 도움을 주며, 보다 안정적인 신호를 위해 촛불 패턴을 보완합니다.
단기 거래의 상대적으로 높은 거래 빈도. 같은 색의 촛불이 연속적으로 자주 발생하여 풍부한 거래 기회를 제공합니다.
일정한 거래 크기와 스톱 손실/이익 취득으로 인한 통제 가능한 위험
단순하고 명확한 논리, 즉, 실시간 거래에 이해하기 쉽고 구현하기 쉬운 논리.
주의해야 할 몇 가지 위험 요소:
신호가 실패할 수 있는 강한 트렌드 중에 단기적 반전이 보장되지 않습니다.
RVI는 특별한 시장 조건에서 잘못된 신호를 생성할 수 있습니다.
적당한 스톱 로스 설정은 큰 손실로 이어질 수 있습니다.
연속 촛불 기준은 너무 딱딱합니다. N 기간 내에 동일한 색의 촛불의 필요한 비율로 최적화하는 것을 고려하십시오.
고정 트레이드 크기는 전체 포지션 리스크를 제어 할 수 없습니다.
전략을 더 최적화 할 수있는 몇 가지 방법:
일정한 기간보다는 통계를 사용하여 연속 촛불 논리를 최적화하십시오.
가장 좋은 조합을 찾기 위해 RVI 매개 변수를 최적화하세요.
시장의 변동성에 따라 후속 스톱 손실을 추가합니다.
계정 사용에 따라 위치 크기를 추가합니다.
채널과 트렌드 같은 더 많은 필터를 추가하여 시스템 안정성을 향상시킵니다.
다른 제품에 대한 매개 변수 조정
역사적인 데이터에 대한 기계 학습으로 매개 변수를 동적으로 최적화합니다.
요약하자면, 이것은 촛불 패턴과 RVI를 기반으로 한 전형적인 단기 평균 회귀 전략입니다. 이 전략은 장점이 있지만 위험도 있습니다. 매개 변수 및 견고성에 대한 추가 최적화는 안정성과 수익성을 향상시킬 수 있습니다. 그러나 어떤 전략도 손실을 완전히 제거하지 않습니다. 거래자는 위험 관리에 규율을 유지해야합니다.
/*backtest start: 2022-10-07 00:00:00 end: 2023-10-07 00:00:00 period: 3d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //This is part of a series of strategies developed automatically by a online software. I cannot share the site url, which is not related to me in any way, because it is against the TV reules. // //This strategy was optimized for GBPUSD, timeframe 1D, fixed lots 0.1, initial balance 1000€ //LOGIC: //- LONG ENTRY when previous candle is bear //- LONG EXIT: RVI > signal line //- SHORT ENTRY when previous candle is bull //- SHORT EXIT: RVI < signal line // //NOTE: I considered the open of actual candle instead of close otherwise there will be a back shift of 1 candle in pine script // //Take profit = no //Stop loss = no // strategy("Expert studio strategy 1 - GBPUSD", overlay=false, precision=6, initial_capital=1000,calc_on_every_tick=true, pyramiding=0, default_qty_type=strategy.fixed, default_qty_value=10000, currency=currency.EUR) //INPUTS src = input(close, "source") min_body_height = input(42, "Minimum body height", type=input.float) //bars_back=input(2, "Consecutive bars of same color") rvi_period = input(55, "RVI period") //CALCULATIONS_____________________________ //candle color body_height = abs(open - close) / syminfo.mintick body_color = open > close ? color.red : color.green //da migliorare for i=0 to bars_back-1 //RVI -------- thanks to hecate p = rvi_period CO = close - open HL = high - low value1 = (CO + 2 * CO[1] + 2 * CO[2] + CO[3]) / 6 value2 = (HL + 2 * HL[1] + 2 * HL[2] + HL[3]) / 6 num = sum(value1, p) denom = sum(value2, p) RVI = denom != 0 ? num / denom : 0 RVIsig = (RVI + 2 * RVI[1] + 2 * RVI[2] + RVI[3]) / 6 plot(RVI, color=color.green, style=plot.style_line, linewidth=1) plot(RVIsig, color=color.red, style=plot.style_line, linewidth=1) //---------------------------------- longCondition = body_height[1] >= min_body_height and body_color[1] == color.red and body_height[0] >= min_body_height and body_color[0] == color.red and RVIsig > RVI exitLong = RVI > RVIsig shortCondition = body_height[1] >= min_body_height and body_color[1] == color.green and body_height[0] >= min_body_height and body_color[0] == color.green and RVIsig < RVI exitShort = RVI < RVIsig if longCondition and strategy.opentrades == 0 strategy.entry("Long", strategy.long) strategy.close("Long", when=exitLong) if shortCondition and strategy.opentrades == 0 strategy.entry("Short", strategy.short) strategy.close("Short", when=exitShort) // === Backtesting Dates === thanks to Trost testPeriodSwitch = input(false, "Custom Backtesting Dates") testStartYear = input(2011, "Backtest Start Year") testStartMonth = input(10, "Backtest Start Month") testStartDay = input(7, "Backtest Start Day") testStartHour = input(0, "Backtest Start Hour") testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, testStartHour, 0) testStopYear = input(2018, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testStopHour = input(23, "Backtest Stop Hour") testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, testStopHour, 0) testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false testPeriod_1 = testPeriod() isPeriod = testPeriodSwitch == true ? testPeriod_1 : true // === /END if not isPeriod strategy.cancel_all() strategy.close_all()