ADD: added first version

This commit is contained in:
hwinkel
2026-01-14 22:44:12 +01:00
commit 2b892123e1
18 changed files with 580 additions and 0 deletions

82
internal/alpaca/client.go Normal file
View File

@@ -0,0 +1,82 @@
package alpaca
import (
"time"
"alpaca-bot/internal/config"
"alpaca-bot/internal/model"
"github.com/alpacahq/alpaca-trade-api-go/v3/alpaca"
"github.com/alpacahq/alpaca-trade-api-go/v3/marketdata"
"github.com/shopspring/decimal"
)
type Client struct {
alpacaClient *alpaca.Client
mdClient *marketdata.Client
}
// Create new Alpaca client
func NewClient(cfg config.AlpacaConfig) *Client {
c := alpaca.NewClient(alpaca.ClientOpts{
APIKey: cfg.ApiKey,
APISecret: cfg.ApiSecret,
BaseURL: cfg.TradeURL,
})
md := marketdata.NewClient(marketdata.ClientOpts{
APIKey: cfg.ApiKey,
APISecret: cfg.ApiSecret,
})
return &Client{
alpacaClient: c,
mdClient: md,
}
}
// Fetch historical bars
func (c *Client) GetHistoricalBars(symbol string, timeframe string, start, end time.Time) ([]model.Bar, error) {
req := marketdata.GetBarsRequest{
TimeFrame: marketdata.OneHour, // e.g. "1Day", "1Min"
Start: start,
End: end,
}
resp, err := c.mdClient.GetBars(symbol, req)
if err != nil {
return nil, err
}
bars := []model.Bar{}
for _, b := range resp {
bars = append(bars, model.Bar{
Symbol: symbol,
Time: b.Timestamp,
Open: b.Open,
High: b.High,
Low: b.Low,
Close: b.Close,
// Volume: b.Volume,
})
}
return bars, nil
}
// Example: submit an order
func (c *Client) SubmitOrder(symbol string, qty *decimal.Decimal, side alpaca.Side, orderType alpaca.OrderType, timeInForce alpaca.TimeInForce) (*alpaca.Order, error) {
orderReq := alpaca.PlaceOrderRequest{
Symbol: symbol,
Qty: qty,
Side: side,
Type: orderType,
TimeInForce: timeInForce,
}
order, err := c.alpacaClient.PlaceOrder(orderReq)
if err != nil {
return nil, err
}
return order, nil
}