up
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user