Documentação

Technical Indicators

client.indicators provides technical indicators on top of client.marketdata. It uses TA-Lib automatically when installed and falls back to native SDK implementations for common indicators and book metrics.

Install with TA-Lib support:

pip install "investflex-py[indicators-talib]"

The base SDK still works without TA-Lib.

Snapshot examples

from investflex import AsyncInvestflexClient

async with AsyncInvestflexClient.from_env() as client:
    rsi = await client.indicators.rsi("PETR4", period=14, source="1m")
    print(rsi.value, rsi.ready, rsi.engine)
import { InvestflexClient } from "@investflex/sdk";

const client = InvestflexClient.fromEnv();

const rsi = await client.indicators.rsi("PETR4", { period: 14, source: "1m" });
console.log(rsi.value, rsi.ready, rsi.engine);
async with AsyncInvestflexClient.from_env() as client:
    macd = await client.indicators.macd("PETR4", source="1m")
    print(macd.value["macd"], macd.value["signal"], macd.value["histogram"])
const macd = await client.indicators.macd("PETR4", { source: "1m" });
const parts = macd.value as {
  macd: number | null;
  signal: number | null;
  histogram: number | null;
};
console.log(parts.macd, parts.signal, parts.histogram);
async with AsyncInvestflexClient.from_env() as client:
    imbalance = await client.indicators.book_imbalance("PETR4", levels=3)
    print(imbalance.value)
const imbalance = await client.indicators.bookImbalance("PETR4", { levels: 3 });
console.log(imbalance.value);

Sources

Source Backing data
"trades" client.marketdata.trades(...)
"book" client.marketdata.last_book(...)
"1m", "5m", "15m", "1h", "D" client.marketdata.candles(...)
"session" Trade history, for accumulators such as VWAP

Helpers

  • sma(symbol, period=20, source="1m")
  • ema(symbol, period=20, source="1m")
  • rsi(symbol, period=14, source="1m")
  • macd(symbol, fast=12, slow=26, signal=9, source="1m")
  • bbands(symbol, period=20, stddev=2.0, source="1m")
  • atr(symbol, period=14, source="1m")
  • vwap(symbol, source="trades")
  • spread(symbol)
  • microprice(symbol)
  • book_imbalance(symbol, levels=3)

Every helper returns an IndicatorValue:

class IndicatorValue:
    symbol: str
    indicator: str
    value: float | dict[str, float | None] | None
    ready: bool
    warmup_remaining: int
    source: str
    engine: str
    timestamp: datetime
interface IndicatorValue {
  symbol: string;
  indicator: string;
  value: number | Record<string, number | null> | null;
  ready: boolean;
  warmupRemaining: number;
  source: string;
  engine: string;
  timestamp: Date;
}

Use ready before triggering execution. A value may be unavailable while the indicator is warming up.

Candles

The SDK exposes the Investflex candle service through client.marketdata.candles(...):

async with AsyncInvestflexClient.from_env() as client:
    candles = await client.marketdata.candles(
        "WINFUT",
        timeframe="15m",
        start="2026-01-16 20:10:11",
        end="2026-02-04 20:10:11",
        limit=200,
    )
    print(candles[-1].close)
const candles = await client.marketdata.candles("WINFUT", {
  timeframe: "15m",
  start: "2026-01-16 20:10:11",
  end: "2026-02-04 20:10:11",
  limit: 200,
});
console.log(candles.at(-1)?.close);

For live candles:

from investflex.models.marketdata import Candle
from investflex.services.marketdata import MarketDataService

async with AsyncInvestflexClient.from_env() as client:
    async with client.marketdata.stream() as stream:
        await stream.subscribe_candles("WINV24", timeframe="15m")
        async for evt in MarketDataService.parse(stream):
            if isinstance(evt, Candle):
                print(evt.symbol, evt.timeframe, evt.close)
import { MarketDataService, type Candle } from "@investflex/sdk";

const stream = await client.marketdata.stream().open();
await stream.subscribeCandles("WINV24", { timeframe: "15m" });
for await (const evt of MarketDataService.parse(stream)) {
  const candle = evt as Partial<Candle>;
  if (candle.timeframe) console.log(candle.symbol, candle.timeframe, candle.close);
}
await stream.close();