Güvenli RSI (RSI_SAFE)

Doğrulanmış StratForge C++23 API, hesaplama ve ısınma davranışı.

Route: /indicators/rsi_safe/

Güvenli bölme, ortalama kaybın sıfır olmasını işler; fiyat/RSI uyumsuzluğunu algılamaz. Varsayılan güvenlik değerleriyle çıktı 0–100 RSI ölçeğindedir, getiri yüzdesi değildir.

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)

Parametreler

  • 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 — Grafik eşikleri, kurucu argümanları değildir.

Hesaplama örneği

period = 3, lookback = 1 ve kapanışlar [10, 11, 10, 11, 13] için değişimler [1, -1, 1, 2]. Başlangıç ortalama kazanç 2/3, kayıp 1/3: dördüncü barda RSI = 66.666667. Beşinci barda yumuşatılmış kazanç 10/9, kayıp 2/9, RSI = 83.333333. İlk üç bar NaN verir. Isınma: period + lookback, varsayılan 15 bar.

Varsayılan değerlerle: kayıpsız yükseliş = 100, kazançsız düşüş = 0, sabit seri (0/0) = 50. Yalnızca ısınmadan sonra geçerlidir. safehigh/safelow, sıfır payda için RSI sonuçlarıdır; paydaya eklenen epsilon değildir.

Sonlu fiyatlar ve pozitif period/lookback kullanın. Bu sürüm sıfırı 1 yapar; özel güvenlik değerlerini doğrulamaz ve sonlu olmayan fiyatlar için anlamlı sonuç garantilemez. Örnekler işlem sinyali veya getiri kanıtı değildir.

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

Yeniden üretim

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

Kaynaklar