RSI Sécurisé (RSI_SAFE)

API StratForge C++23 vérifiée, calcul et période initiale.

Route: /indicators/rsi_safe/

La division sécurisée traite une perte moyenne nulle ; elle ne détecte pas les divergences prix/RSI. Avec les valeurs de sécurité par défaut, la sortie utilise une échelle RSI de 0–100, pas un pourcentage de rendement.

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)

Paramètres

  • 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 — Seuils graphiques, pas des arguments du constructeur.

Exemple de calcul

Pour period = 3, lookback = 1 et les clôtures [10, 11, 10, 11, 13], les variations sont [1, -1, 1, 2]. Gain moyen initial 2/3 et perte moyenne 1/3 : RSI = 66.666667 à la quatrième barre. À la cinquième : gain lissé 10/9, perte 2/9, RSI = 83.333333. Les trois premières barres donnent NaN. Initialisation : period + lookback, soit 15 barres par défaut.

Par défaut : hausse sans perte = 100, baisse sans gain = 0, série constante (0/0) = 50. Ces cas ne concernent que les barres après initialisation. safehigh/safelow définissent les résultats RSI en cas de dénominateur nul, pas des epsilon ajoutés au dénominateur.

Utiliser des prix finis et des period/lookback positifs. Cette version remplace zéro par 1, sans valider les valeurs de sécurité personnalisées ni garantir un résultat pertinent pour des prix non finis. Les exemples ne sont ni des signaux de trading ni des preuves de rendement.

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";
}

Reproduire

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

Sources