-
Notifications
You must be signed in to change notification settings - Fork 102
/
client.go
161 lines (134 loc) · 4.37 KB
/
client.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package options
import (
"context"
"encoding/json"
finance "github.com/piquette/finance-go"
"github.com/piquette/finance-go/datetime"
form "github.com/piquette/finance-go/form"
"github.com/piquette/finance-go/iter"
)
// Client is used to invoke options APIs.
type Client struct {
B finance.Backend
}
func getC() Client {
return Client{finance.GetBackend(finance.YFinBackend)}
}
// Params carries a context and chart information.
type Params struct {
// Context access.
finance.Params `form:"-"`
// Accessible fields.
UnderlyingSymbol string `form:"-"`
Expiration *datetime.Datetime `form:"-"`
date int `form:"date"`
straddle bool `form:"straddle"`
}
// StraddleIter is a structure containing results
// and related metadata for a
// yfin option straddles request.
type StraddleIter struct {
*iter.Iter
}
// Straddle returns the current straddle in the iter.
func (si *StraddleIter) Straddle() *finance.Straddle {
return si.Current().(*finance.Straddle)
}
// Meta returns the metadata associated with the options response.
func (si *StraddleIter) Meta() *finance.OptionsMeta {
return si.Iter.Meta().(*finance.OptionsMeta)
}
// GetStraddle returns options straddles.
// and requires a underlier symbol as an argument.
func GetStraddle(underlier string) *StraddleIter {
return GetStraddleP(&Params{UnderlyingSymbol: underlier})
}
// GetStraddleP returns options straddles.
// and requires a params struct as an argument.
func GetStraddleP(params *Params) *StraddleIter {
return getC().GetStraddleP(params)
}
// GetStraddleP returns options straddles.
// and requires a params struct as an argument.
func (c Client) GetStraddleP(params *Params) *StraddleIter {
// Construct request from params input.
// TODO: validate symbol..
if params == nil || len(params.UnderlyingSymbol) == 0 {
return &StraddleIter{iter.NewE(finance.CreateArgumentError())}
}
if params.Context == nil {
ctx := context.TODO()
params.Context = &ctx
}
params.straddle = true
params.date = -1
if params.Expiration != nil {
params.date = params.Expiration.Unix()
}
body := &form.Values{}
form.AppendTo(body, params)
return &StraddleIter{iter.New(body, func(b *form.Values) (meta interface{}, values []interface{}, err error) {
resp := response{}
err = c.B.Call("v7/finance/options/"+params.UnderlyingSymbol, body, params.Context, &resp)
if err != nil {
return
}
if resp.Inner.Error != nil {
err = resp.Inner.Error
return
}
result := resp.Inner.Results[0]
if result == nil {
err = finance.CreateRemoteErrorS("no results in option straddle response")
return
}
var list []straddleOptions
err = json.Unmarshal(result.Options, &list)
if err != nil || len(list) < 1 {
err = finance.CreateRemoteErrorS("no results in option straddle response")
return
}
ls := list[0]
meta = &finance.OptionsMeta{
UnderlyingSymbol: result.UnderlyingSymbol,
ExpirationDate: ls.ExpirationDate,
AllExpirationDates: result.ExpirationDates,
Strikes: result.Strikes,
HasMiniOptions: ls.HasMiniOptions,
Quote: result.Quote,
}
for _, straddle := range ls.Straddles {
values = append(values, straddle)
}
return
})}
}
// response is a yfin option response.
type response struct {
Inner struct {
Results []*result `json:"result"`
Error *finance.YfinError `json:"error"`
} `json:"optionChain"`
}
// result is an umbrella struct for options information for a specified underlying symbol.
type result struct {
UnderlyingSymbol string `json:"underlyingSymbol"`
ExpirationDates []int `json:"expirationDates"`
Strikes []float64 `json:"strikes"`
HasMiniOptions bool `json:"hasMiniOptions"`
Quote *finance.Quote `json:"quote"`
Options json.RawMessage `json:"options"`
}
// chain is an options chain of puts/calls.
type chainOptions struct {
ExpirationDate int `json:"expirationDate"`
HasMiniOptions bool `json:"hasMiniOptions"`
Calls []*finance.Contract `json:"calls"`
Puts []*finance.Contract `json:"puts"`
}
// straddles is a list of option straddles.
type straddleOptions struct {
ExpirationDate int `json:"expirationDate"`
HasMiniOptions bool `json:"hasMiniOptions"`
Straddles []*finance.Straddle `json:"straddles"`
}