code.vegaprotocol.io/vega@v0.79.0/core/integration/steps/market/risk_models.go (about) 1 // Copyright (C) 2023 Gobalsky Labs Limited 2 // 3 // This program is free software: you can redistribute it and/or modify 4 // it under the terms of the GNU Affero General Public License as 5 // published by the Free Software Foundation, either version 3 of the 6 // License, or (at your option) any later version. 7 // 8 // This program is distributed in the hope that it will be useful, 9 // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 // GNU Affero General Public License for more details. 12 // 13 // You should have received a copy of the GNU Affero General Public License 14 // along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16 package market 17 18 import ( 19 "embed" 20 "fmt" 21 22 "code.vegaprotocol.io/vega/core/integration/steps/helpers" 23 "code.vegaprotocol.io/vega/core/integration/steps/market/defaults" 24 vegapb "code.vegaprotocol.io/vega/protos/vega" 25 26 "github.com/jinzhu/copier" 27 ) 28 29 var ( 30 //go:embed defaults/risk-model/simple/*.json 31 defaultSimpleRiskModels embed.FS 32 defaultSimpleRiskModelFileNames = []string{ 33 "defaults/risk-model/simple/default-simple-risk-model.json", 34 "defaults/risk-model/simple/default-simple-risk-model-2.json", 35 "defaults/risk-model/simple/default-simple-risk-model-3.json", 36 "defaults/risk-model/simple/default-simple-risk-model-4.json", 37 "defaults/risk-model/simple/system-test-risk-model.json", 38 } 39 40 //go:embed defaults/risk-model/log-normal/*.json 41 defaultLogNormalRiskModels embed.FS 42 defaultLogNormalRiskModelFileNames = []string{ 43 "defaults/risk-model/log-normal/default-log-normal-risk-model.json", 44 "defaults/risk-model/log-normal/default-st-risk-model.json", 45 "defaults/risk-model/log-normal/closeout-st-risk-model.json", 46 } 47 ) 48 49 type riskModels struct { 50 simple map[string]*vegapb.TradableInstrument_SimpleRiskModel 51 logNormal map[string]*vegapb.TradableInstrument_LogNormalRiskModel 52 } 53 54 func newRiskModels(unmarshaler *defaults.Unmarshaler) *riskModels { 55 models := &riskModels{ 56 simple: map[string]*vegapb.TradableInstrument_SimpleRiskModel{}, 57 logNormal: map[string]*vegapb.TradableInstrument_LogNormalRiskModel{}, 58 } 59 60 simpleRiskModelReaders := helpers.ReadAll(defaultSimpleRiskModels, defaultSimpleRiskModelFileNames) 61 for name, contentReader := range simpleRiskModelReaders { 62 instrument, err := unmarshaler.UnmarshalRiskModel(contentReader) 63 if err != nil { 64 panic(fmt.Errorf("couldn't unmarshal default risk model %s: %v", name, err)) 65 } 66 if err := models.AddSimple(name, instrument.RiskModel.(*vegapb.TradableInstrument_SimpleRiskModel)); err != nil { 67 panic(fmt.Errorf("failed to add default simple risk model %s: %v", name, err)) 68 } 69 } 70 71 logNormalRiskModelReaders := helpers.ReadAll(defaultLogNormalRiskModels, defaultLogNormalRiskModelFileNames) 72 for name, contentReader := range logNormalRiskModelReaders { 73 instrument, err := unmarshaler.UnmarshalRiskModel(contentReader) 74 if err != nil { 75 panic(fmt.Errorf("couldn't unmarshal default risk model %s: %v", name, err)) 76 } 77 if err := models.AddLogNormal(name, instrument.RiskModel.(*vegapb.TradableInstrument_LogNormalRiskModel)); err != nil { 78 panic(fmt.Errorf("failed to add default simple risk model %s: %v", name, err)) 79 } 80 } 81 82 return models 83 } 84 85 func (r *riskModels) AddSimple(name string, model *vegapb.TradableInstrument_SimpleRiskModel) error { 86 if _, okLogNormal := r.logNormal[name]; okLogNormal { 87 return fmt.Errorf("risk model \"%s\" already registered as log normal risk model", name) 88 } 89 r.simple[name] = model 90 return nil 91 } 92 93 func (r *riskModels) AddLogNormal(name string, model *vegapb.TradableInstrument_LogNormalRiskModel) error { 94 if _, okSimple := r.simple[name]; okSimple { 95 return fmt.Errorf("risk model \"%s\" already registered as simple risk model", name) 96 } 97 r.logNormal[name] = model 98 return nil 99 } 100 101 func (r riskModels) LoadModel(name string, instrument *vegapb.TradableInstrument) error { 102 simpleModel, okSimple := r.simple[name] 103 if okSimple { 104 // Copy to avoid modification between tests. 105 copyConfig := &vegapb.TradableInstrument_SimpleRiskModel{} 106 if err := copier.Copy(copyConfig, simpleModel); err != nil { 107 panic(fmt.Errorf("failed to deep copy simple risk model: %v", err)) 108 } 109 instrument.RiskModel = copyConfig 110 return nil 111 } 112 113 logNormalModel, okLogNormal := r.logNormal[name] 114 if okLogNormal { 115 // Copy to avoid modification between tests. 116 copyConfig := &vegapb.TradableInstrument_LogNormalRiskModel{} 117 if err := copier.Copy(copyConfig, logNormalModel); err != nil { 118 panic(fmt.Errorf("failed to deep copy log normal risk model: %v", err)) 119 } 120 instrument.RiskModel = logNormalModel 121 return nil 122 } 123 124 return fmt.Errorf("no risk model \"%s\" registered", name) 125 }