-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvalid.go
124 lines (120 loc) · 3.91 KB
/
valid.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
package cfi
import "strings"
var validCFI = map[string][]string{
// Equities
"ES": {"VNRE", "TU", "OPF", "BRNM"},
"EP": {"VNRE", "RETGACN", "FCPQANU", "BRNM"},
"EC": {"VNRE", "TU", "OPF", "BRNM"},
"EF": {"VNRE", "RETGACN", "FCPQANU", "BRNM"},
"EL": {"VNRE", "TU", "OPF", "BRNM"},
"ED": {"SPCFLM", "RNBDX", "FCPQANUD", "BRNM}"},
"EY": {"ABCDEM", "DYM", "FVEM", "BSDGTCINM"},
"EM": {"X", "X", "X", "BRNM"},
// Debt
"DB": {"FZVCK", "TGSUPNOQJC", "FGCDABTLPQRE", "BRNM"},
"DC": {"FZVK", "TGSUPNOQJC", "FGCDABTLPQRE", "BRNM"},
"DW": {"FZVK", "TGSUPNOQJC", "FGCDABTLPQRE", "BRNM"},
"DT": {"FZVK", "TGSUPNOQJC", "FGCDABTLPQRE", "BRNM"},
"DY": {"FZVK", "TGSUPNOQJCX", "X", "BRNM"},
"DS": {"ABCDM", "FDVYM", "FVM", "BSDTCINM"},
"DE": {"ABCDEM", "FDVYM", "RSCTM", "BSDTCINM"},
"DG": {"FZV", "TGSUPNOQJC", "FGCDABTLPQRE", "BRNM"},
"DA": {"FZV", "TGSUPNOQJC", "FGCDABTLPQRE", "BRNM"},
"DN": {"FZV", "TGSUPNOQJC", "FGCDABTLPQRE", "BRNM"},
"DD": {"BCWTYGANM", "FZVC", "TGSUPNOQJC", "FGCDABTLPQRE"},
"DM": {"BPM", "X", "X", "BRNM"},
// Collective investment vehicles
"CI": {"COM", "IGJ", "RBEVLCDFKM", "SQUY"},
"CH": {"DRSEANLM", "X", "X", "X"},
"CB": {"COM", "IGJX", "X", "SQUY"},
"CE": {"COM", "IGJ", "RBEVLCDFKM", "SU"},
"CS": {"COM", "BGLM", "RBM", "SU"},
"CF": {"COM", "IGJ", "IHBEPM", "SQUY"},
"CP": {"COM", "IGJ", "RBEVLCDFKM", "SQUY"},
"CM": {"X", "X", "X", "SQUY"},
// Entitlements
"RA": {"X", "X", "X", "BRNM"},
"RS": {"SPCFBIM", "X", "X", "BRNM"},
"RP": {"SPCFBIM", "X", "X", "BRNM"},
"RW": {"BSDTCIM", "TNC", "CPB", "EABM"},
"RF": {"BSDTCIM", "TNM", "CPM", "EABM"},
"RD": {"ASPWM", "X", "X", "BRNM"},
"RM": {"X", "X", "X", "X"},
// Listed options (OC & OP)
"OC": {"EAB", "BSDTCIOFWNM", "PCNE", "SN"},
"OP": {"EAB", "BSDTCIOFWNM", "PCNE", "SN"},
"OM": {"X", "X", "X", "X"},
// Futures
"FF": {"BSDCIOFWNVM", "PCN", "SN", "X"},
"FC": {"EAISNPHM", "PCN", "SN", "X"},
// Swaps
"SR": {"ACDGHZM", "CIDY", "SC", "CP"},
"SF": {"ACM", "X", "X", "PN"},
"ST": {"JKANGPSTIQM", "CT", "X", "CPE"},
"SE": {"SIBM", "PDVLTCM", "X", "CPE"},
"SC": {"UVIBM", "CTM", "CSL", "CPA"},
"SM": {"PM", "X", "X", "CP"},
// Non listed complex options
"HR": {"ACDGHORFM", "ABCDEFGHI", "VADBGLPM", "CPE"},
"HT": {"JKANGPSTIQORFWM", "ABCDEFGHI", "VADBGLPM", "CPE"},
"HE": {"SIBORFM", "ABCDEFGHI", "VADBGLPM", "CPE"},
"HC": {"UVIWM", "ABCDEFGHI", "VADBGLPM", "CPE"},
"HF": {"RFTVM", "ABCDEFGHI", "VADBGLPM", "CPEN"},
"HM": {"PM", "ABCDEFGHI", "VADBGLPM", "CPENA"},
// Spot
"IF": {"X", "X", "X", "P"},
"IT": {"AJKNPSTM", "X", "X", "X"},
// Forwards
"JE": {"SIBOF", "X", "CSF", "CP"},
"JF": {"TROF", "X", "CSF", "CPN"},
"JC": {"AIBCDGO", "X", "SF", "CP"},
"JR": {"IOM", "X", "SF", "CP"},
"JT": {"ABGIJKNPSTM", "X", "CF", "CP"},
// Strategies
"KR": {"X", "X", "X", "X"},
"KT": {"X", "X", "X", "X"},
"KE": {"X", "X", "X", "X"},
"KC": {"X", "X", "X", "X"},
"KF": {"X", "X", "X", "X"},
"KY": {"X", "X", "X", "X"},
"KM": {"X", "X", "X", "X"},
// Financing
"LL": {"ABJKNPSTM", "X", "X", "CP"},
"LR": {"GSC", "FNOT", "X", "DHT"},
"LS": {"CGPTELDWKM", "NOT", "X", "DFHT"},
// Referential instruments
"TC": {"NLCM", "X", "X", "X"},
"TT": {"EAISNPHM", "X", "X", "X"},
"TR": {"NVFRM", "DWNQSAM", "X", "X"},
"TI": {"EDFRTCM", "PCEFM", "PNGM", "X"},
"TB": {"EDFITCM", "X", "X", "X"},
"TD": {"SPCFLKM", "X", "X", "X"},
"TM": {"X", "X", "X", "X"},
// Others
"MC": {"SBHAWUM", "TUX", "X", "BRNM"},
"MM": {"RIETNPSM", "X", "X", "X"},
}
// Valid returns true if the CFI string is a valid CFI code, and false otherwise.
func Valid(cfi string) bool {
if len(cfi) != 6 {
return false
}
attributes, ok := validCFI[cfi[0:2]]
if !ok {
return false
}
for i := range cfi[2:] {
if strings.IndexByte(attributes[i], cfi[i+2]) == -1 {
return false
}
}
return true
}
// ValidCG returns true if the CFI string has a valid Category / Group combination
func ValidCG(cfi string) bool {
if len(cfi) != 6 {
return false
}
_, ok := validCFI[cfi[0:2]]
return ok
}