chart/app/analysis
Chris Amow 51a9636ea7 Stop re-alerting when price crosses a level
Suppression matched on cluster side as well as position, but side is positional:
a level sitting at price is resistance when price is a tick below it and support
a tick later. Every crossing failed the side match and fired as a brand-new
zone — which is exactly when a level is least newsworthy, not most.

Found the honest way. A flat line placed at the live price produced four phone
pushes in two minutes.

Zones are now matched on position alone. Side still determines whether the
message reads BULLISH or BEARISH; it just no longer decides whether you are told
twice. Over the same six replayed sessions at threshold 28 that is 40 alerts
down to 26, and 10 at the configured four-hour cooldown with a worst session
of 5.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 01:51:54 -05:00
..
__init__.py Implement M3 projected daily moving averages 2026-08-09 20:44:11 -05:00
alerts.py Stop re-alerting when price crosses a level 2026-08-10 01:51:54 -05:00
confluence.py Make drawn trendlines able to alert at all 2026-08-10 00:56:21 -05:00
horizontals.py Add prior-day levels and session VWAP; fix alert repetition they exposed 2026-08-10 00:36:21 -05:00
indicators.py Implement M3 projected daily moving averages 2026-08-09 20:44:11 -05:00
levels.py Add prior-day levels and session VWAP; fix alert repetition they exposed 2026-08-10 00:36:21 -05:00
manual_lines.py end trendline here possible 2026-08-09 23:28:23 -05:00
moving_averages.py Implement M3 projected daily moving averages 2026-08-09 20:44:11 -05:00
vwap.py Add prior-day levels and session VWAP; fix alert repetition they exposed 2026-08-10 00:36:21 -05:00