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  }