This commit is contained in:
2026-04-20 22:51:41 +02:00
parent 89fc0119f3
commit 81eec53978
27 changed files with 1067 additions and 399 deletions
+44 -5
View File
@@ -49,6 +49,33 @@ func (p *Poller) Stop() {
close(p.done)
}
// SyncTicker récupère les insider trades et les events 8-K pour un ticker spécifique.
func (p *Poller) SyncTicker(sym string) error {
trades, err := p.client.RecentInsiderBuys(sym)
if err != nil {
return err
}
for _, t := range trades {
p.insertTrade(t)
}
events, _ := p.client.Recent8KEvents(sym)
for _, e := range events {
p.insertEvent(e)
}
return nil
}
// HasRecentCEOChange retourne true si un 8-K Item 5.02 a été déposé dans les N derniers jours.
func (p *Poller) HasRecentCEOChange(ticker string, days int) bool {
cutoff := time.Now().AddDate(0, 0, -days).Format("2006-01-02")
var count int
p.db.QueryRow(`
SELECT COUNT(*) FROM company_events
WHERE ticker=? AND event_type='ceo_change' AND filing_date >= ?
`, ticker, cutoff).Scan(&count)
return count > 0
}
func (p *Poller) Sync() error {
tickers, err := p.watchlistTickers()
if err != nil {
@@ -65,13 +92,17 @@ func (p *Poller) Sync() error {
trades, err := p.client.RecentInsiderBuys(sym)
if err != nil {
log.Printf("edgar: %s: %v", sym, err)
continue
}
for _, t := range trades {
if p.insertTrade(t) {
total++
} else {
for _, t := range trades {
if p.insertTrade(t) {
total++
}
}
}
events, _ := p.client.Recent8KEvents(sym)
for _, e := range events {
p.insertEvent(e)
}
time.Sleep(500 * time.Millisecond) // respecter le rate limit EDGAR
}
@@ -100,6 +131,14 @@ func (p *Poller) watchlistTickers() ([]string, error) {
return tickers, nil
}
func (p *Poller) insertEvent(e CompanyEvent) {
p.db.Exec(`
INSERT OR IGNORE INTO company_events
(ticker, event_type, title, accession_no, filing_date, filing_url)
VALUES (?, ?, ?, ?, ?, ?)
`, e.Ticker, e.EventType, e.Title, e.AccessionNo, e.FilingDate, e.FilingURL)
}
func (p *Poller) insertTrade(t InsiderTrade) bool {
res, err := p.db.Exec(`
INSERT OR IGNORE INTO insider_trades