A sentiment filter for the bot you already run.
Free, MIT-licensed example strategies for Freqtrade and Jesse. They do not generate entries. They take the entries your strategy already produces, filter them, size them by confidence, and stand aside on the events you never want to be long into.
Read this before you wire it in
Pooled across everything we have measured there is no headline edge. Direction over 24 hours sits at a coin flip. Strip out market beta and the residual information is indistinguishable from zero. We publish all of it, including the intervals that sit below 50%.
That is why these are overlays. An hourly news signal can honestly support filtering and sizing a strategy that already works. It cannot support generating entries, and a strategy file claiming otherwise would be contradicted by our own research page.
Three ways the strategies use it
Entry filter
Your strategy proposes the trade. The signal only decides whether to let it through. Entries are skipped while the symbol reads bearish, and for 24 hours after a hack, a regulatory event or a delisting.
Confidence-scaled sizing
The stake scales with the bucket's confidence, from half size at zero to full size at one, and only on the bullish side. Low agreement across sources means a smaller position, not a different trade.
Fails open, on purpose
If the signal is unreachable the trade goes through. An overlay that halts your bot when a third-party API has a bad minute is a worse failure than the one it prevents. One line flips it to fail-closed, and the code says which.
Freqtrade
ShingouSentiment hangs the overlay off three hooks: bot_loop_start refreshes once per hour bucket, confirm_trade_entry is the filter and the kill-switch, custom_stake_amount is the sizing. The EMA cross underneath is a stand-in. The hooks are the part to copy into your own strategy.
export SHINGOU_API_KEY=sk_...
cp ShingouSentiment.py user_data/strategies/
freqtrade trade --strategy ShingouSentiment --dry-runA ten-pair hourly bot costs about 264 requests a day, which is a quarter of the free quota. It maps BTC/USDT to BTC-USD itself, so any USDT, USD or USDC quote of a supported asset works.
Jesse
Same three pieces, as ShingouFilter on the 1h timeframe. About 48 requests a day per route.
export SHINGOU_API_KEY=sk_...
mkdir -p strategies/ShingouFilter
cp ShingouFilter.py strategies/ShingouFilter/__init__.py
# then route it on the 1h timeframe and run live or paperDo not backtest these strategies. Backtest the history.
Both examples fetch the live signal once per hour bucket, because that is what a running bot does. Replay either one through a backtester and you apply today's sentiment to last month's candles, which is lookahead bias with extra steps. It would also flatter the result, which is the direction that fools people.
For research, pull the point-in-time series instead and join it to your candles by bucket. Every bucket is stamped as-of and backfilled ones carry a reconstructed flag, so the join cannot see a score that did not exist yet.
r = requests.get(
"https://api.shingou.io/v1/history/sentiment",
params={"symbol": "BTC-USD", "from": "2026-06-01T00:00:00Z",
"to": "2026-06-30T00:00:00Z", "interval": "1h"},
headers={"Authorization": f"Bearer {KEY}", "User-Agent": "shingou-jesse/0.1.0"},
)The one thing we ask
Both strategies send a self-identifying User-Agent. It is not authentication and it never affects your quota. It is the only way we can tell which integration a request came from, which is what decides whether a platform gets built next.
User-Agent: shingou-freqtrade/0.1.0Writing your own client? Use the same shape, shingou-<platform>/<version>, and it shows up as its own channel.
What the free key covers
1,000 requests a day, live on BTC, ETH and SOL, 24 hours behind on the rest of the universe. One sentiment call covers every pair at once, then one events call per symbol, so an hourly bot on the majors uses about 96 requests a day. The free tier runs a live strategy on those three indefinitely. What it does not cover is a backtest: history depth is the paid axis, and the plans table holds every number.
These are examples to build on, not strategies to run as they are. By using the API you agree to the Terms of Service.