This repository has been archived by the owner on Nov 25, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbalance.go
80 lines (66 loc) · 1.64 KB
/
balance.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package shresiesbot
import (
"context"
"strconv"
"github.com/deividfortuna/sharesies"
)
type holdPrice struct {
Value float64
Quantity float64
}
func (b *SharesiesBot) balance(ctx context.Context, holds []Hold) error {
p, err := b.client.Authenticate(ctx, &sharesies.Credentials{
Username: b.config.Sharesies.Username,
Password: b.config.Sharesies.Password,
})
if err != nil {
return err
}
portfolioHolds := map[string]holdPrice{}
portfolioValue := 0.00
for _, h := range holds {
for _, v := range p.Portfolio {
if h.Id == v.FundID {
value, err := strconv.ParseFloat(v.Value, 64)
quantity, err := strconv.ParseFloat(v.Shares, 64)
if err != nil {
return err
}
portfolioHolds[v.FundID] = holdPrice{Value: value, Quantity: quantity}
portfolioValue = portfolioValue + value
}
}
}
var bOrders []BuyOrder
var sOrders []SellOrder
for _, h := range holds {
v := (h.Weight * portfolioValue) / 100
if v > portfolioHolds[h.Id].Value {
bOrders = append(bOrders, BuyOrder{
Id: h.Id,
Reference: h.Reference,
Amount: v - portfolioHolds[h.Id].Value,
})
}
if v < portfolioHolds[h.Id].Value {
difference := portfolioHolds[h.Id].Value - v
sharePrice := portfolioHolds[h.Id].Value / portfolioHolds[h.Id].Quantity
shareQuantity := difference / sharePrice
sOrders = append(sOrders, SellOrder{
Id: h.Id,
Reference: h.Reference,
Shares: shareQuantity,
})
}
}
b.logger.Println("buy orders: ", bOrders)
err = b.buyOrders(ctx, bOrders)
if err != nil {
return err
}
err = b.sellOrders(ctx, sOrders)
if err != nil {
return err
}
return nil
}