StratCraftStratCraftPortuguês

RSI Seguro (RSI_SAFE)

API StratForge C++23 verificada, cálculo e inicialização.

Route: /indicators/rsi_safe/

A divisão segura trata a perda média nula; não deteta divergências preço/RSI. Com os valores de segurança predefinidos, a saída usa a escala RSI 0–100, não uma percentagem de retorno.

change = close[t] - close[t - lookback]

gain = max(change, 0); loss = max(-change, 0)

average[t] = (average[t - 1] * (period - 1) + value[t]) / period

RS = average_gain / average_loss; RSI = 100 - 100 / (1 + RS)

Parâmetros

  • period = 14
  • movav = stratforge::RsiMovAv::Smoothed (Simple, Exponential)
  • safehigh = 100.0
  • safelow = 50.0
  • lookback = 1

RSI_Safe: safediv = true; RSI: safediv = false. upperband / lowerband: 70 / 30 — Limiares do gráfico, não argumentos do construtor.

Exemplo numérico

Para period = 3, lookback = 1 e fechos [10, 11, 10, 11, 13], as variações são [1, -1, 1, 2]. Ganho médio inicial 2/3 e perda 1/3: RSI = 66.666667 na quarta barra. Na quinta: ganho suavizado 10/9, perda 2/9, RSI = 83.333333. As três primeiras barras dão NaN. Inicialização: period + lookback, 15 barras por predefinição.

Por predefinição: subida sem perdas = 100, descida sem ganhos = 0, série constante (0/0) = 50. Só após a inicialização. safehigh/safelow são valores RSI para denominador nulo, não ajustes epsilon do denominador.

Usar preços finitos e period/lookback positivos. Esta versão normaliza zero para 1, não valida valores de segurança personalizados nem garante resultados úteis para preços não finitos. Os exemplos não são sinais de negociação nem provas de retorno.

C++23 API — StratForge

#include <stratforge/indicators/rsi.hpp>
#include <cassert>
#include <cmath>
#include <iomanip>
#include <iostream>

int main() {
    stratforge::Line<double> close, rising, falling, flat;
    stratforge::RSI_Safe rsi(close, 3);
    stratforge::RSI_Safe up(rising, 3), down(falling, 3), neutral(flat, 3);
    assert(rsi.minimum_period() == 4);
    std::cout << std::fixed << std::setprecision(6);
    for (double price : {10.0, 11.0, 10.0, 11.0, 13.0}) {
        close.forward(price);
        rsi.next();
        if (close.size() < 4) assert(std::isnan(rsi[0]));
        else std::cout << rsi[0] << " ";
    }
    assert(std::abs(rsi.line()[-1] - 66.666666667) < 1e-9);
    assert(std::abs(rsi[0] - 83.333333333) < 1e-9);
    for (int i = 0; i < 4; ++i) {
        rising.forward(10.0 + i);
        falling.forward(10.0 - i);
        flat.forward(10.0);
        up.next();
        down.next();
        neutral.next();
    }
    assert(up[0] == 100.0 && down[0] == 0.0 && neutral[0] == 50.0);
    std::cout << up[0] << " " << down[0] << " " << neutral[0] << "\n";
}

Reproduzir

StratForge d25404dcf2c3842ba304ddc60ac19cfec1f8aa37 (2026-08-28); GCC 14, C++23; scalar build, no xsimd dependency.

git clone https://github.com/StratCraftsAI/StratForge.git StratForge
git -C StratForge checkout --detach d25404dcf2c3842ba304ddc60ac19cfec1f8aa37
g++-14 -std=c++23 -O2 -Wall -Wextra -pedantic -IStratForge/include example.cpp -o example
./example

example.cpp: C++23 API. stdout:

66.666667 83.333333 100.000000 0.000000 50.000000

Fontes