Skip to content

Commit 3429d5c

Browse files
authored
Merge pull request #85 from Julius278/feature/619
Feature/619
2 parents c167527 + 90379ce commit 3429d5c

File tree

3 files changed

+265
-0
lines changed

3 files changed

+265
-0
lines changed
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package net.finmath.smartcontract.settlement;
2+
3+
import net.finmath.smartcontract.model.ExceptionId;
4+
import net.finmath.smartcontract.model.MarketDataList;
5+
import net.finmath.smartcontract.model.SDCException;
6+
import net.finmath.smartcontract.product.SmartDerivativeContractDescriptor;
7+
import net.finmath.smartcontract.product.xml.SDCXMLParser;
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
11+
import java.lang.reflect.Field;
12+
import java.math.BigDecimal;
13+
import java.time.ZonedDateTime;
14+
import java.util.Arrays;
15+
import java.util.List;
16+
import java.util.Objects;
17+
18+
public class SettlementGenerator {
19+
20+
private static final Logger logger = LoggerFactory.getLogger(SettlementGenerator.class);
21+
22+
private Settlement settlement;
23+
24+
public SettlementGenerator generateInitialSettlementXml(String marketDataXml, SmartDerivativeContractDescriptor sdc){
25+
generateSettlement(marketDataXml, Settlement.SettlementType.INITIAL, sdc, BigDecimal.ZERO);
26+
return this.settlementValuePrevious(BigDecimal.ZERO);
27+
}
28+
29+
public SettlementGenerator generateRegularSettlementXml(String marketDataXml, SmartDerivativeContractDescriptor sdc, BigDecimal marginValue){
30+
return generateSettlement(marketDataXml, Settlement.SettlementType.REGULAR, sdc, marginValue);
31+
}
32+
33+
private SettlementGenerator generateSettlement(String marketDataXml, Settlement.SettlementType settlementType, SmartDerivativeContractDescriptor sdc, BigDecimal marginValue){
34+
MarketDataList marketDataList = SDCXMLParser.unmarshalXml(marketDataXml, MarketDataList.class);
35+
settlement = new Settlement();
36+
settlement.setTradeId(sdc.getDltTradeId());
37+
settlement.setSettlementType(settlementType);
38+
settlement.setCurrency(sdc.getCurrency());
39+
settlement.setMarginValue(marginValue);
40+
settlement.setSettlementTime(ZonedDateTime.now());
41+
settlement.setMarketData(marketDataList);
42+
43+
return this;
44+
}
45+
46+
public SettlementGenerator marginLimits(List<BigDecimal> marginLimits){
47+
settlement.setMarginLimits(marginLimits);
48+
return this;
49+
}
50+
51+
public SettlementGenerator settlementValue(BigDecimal settlementValue){
52+
settlement.setSettlementValue(settlementValue);
53+
return this;
54+
}
55+
56+
public SettlementGenerator settlementValuePrevious(BigDecimal settlementValuePrevious){
57+
settlement.setSettlementValuePrevious(settlementValuePrevious);
58+
return this;
59+
}
60+
61+
public SettlementGenerator settlementTimeNext(ZonedDateTime settlementTimeNext){
62+
settlement.setSettlementTimeNext(settlementTimeNext);
63+
return this;
64+
}
65+
66+
public SettlementGenerator settlementValueNext(BigDecimal settlementValueNext){
67+
settlement.setSettlementValueNext(settlementValueNext);
68+
return this;
69+
}
70+
71+
public String build(){
72+
String settlementString = SDCXMLParser.marshalClassToXMLString(settlement);
73+
if(allFieldsSet(settlement))
74+
return settlementString;
75+
else{
76+
logger.error("missing input for settlement, settlement string so far: {}", settlementString);
77+
throw new SDCException(ExceptionId.SDC_WRONG_INPUT, "settlement input incomplete", 400);
78+
}
79+
}
80+
81+
private static boolean allFieldsSet(Settlement settlement){
82+
return Arrays.stream(settlement.getClass().getDeclaredFields())
83+
.peek(f -> f.setAccessible(true))
84+
.map(f -> getFieldValue(f, settlement))
85+
.allMatch(Objects::nonNull);
86+
}
87+
88+
private static Object getFieldValue(Field field, Object target) {
89+
try {
90+
return field.get(target);
91+
} catch (IllegalAccessException e) {
92+
throw new RuntimeException(e);
93+
}
94+
}
95+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package net.finmath.smartcontract.valuation.marketdata.generators;
2+
3+
import com.neovisionaries.ws.client.WebSocket;
4+
import io.reactivex.rxjava3.functions.Consumer;
5+
import net.finmath.smartcontract.model.MarketDataList;
6+
import net.finmath.smartcontract.product.SmartDerivativeContractDescriptor;
7+
import net.finmath.smartcontract.valuation.marketdata.curvecalibration.CalibrationDataItem;
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
11+
import java.io.IOException;
12+
import java.util.List;
13+
import java.util.Properties;
14+
import java.util.concurrent.atomic.AtomicBoolean;
15+
import java.util.concurrent.atomic.AtomicReference;
16+
17+
public class MarketDataGeneratorLauncher {
18+
19+
private static final Logger logger = LoggerFactory.getLogger(MarketDataGeneratorLauncher.class);
20+
21+
private MarketDataGeneratorLauncher() {}
22+
23+
public static MarketDataList instantiateMarketDataGeneratorWebsocket(Properties connectionProperties, SmartDerivativeContractDescriptor sdc) {
24+
AtomicReference<MarketDataList> marketDataList = new AtomicReference<>(new MarketDataList());
25+
AtomicBoolean finished = new AtomicBoolean(false);
26+
27+
logger.info("launching MarketDataGeneratorWebsocket");
28+
List<CalibrationDataItem.Spec> mdItemList;
29+
WebSocketConnector connector;
30+
WebSocket socket;
31+
MarketDataGeneratorWebsocket emitter;
32+
try {
33+
mdItemList = sdc.getMarketdataItemList();
34+
35+
// Init Websockect Connection
36+
connector = new WebSocketConnector(connectionProperties);
37+
socket = connector.getWebSocket();
38+
emitter = new MarketDataGeneratorWebsocket(connector.getAuthJson(), connector.getPosition(), mdItemList);
39+
socket.addListener(emitter);
40+
socket.connect();
41+
42+
final Consumer<MarketDataList> marketDataWriter = s -> {
43+
logger.info("websocket open: {}", socket.isOpen());
44+
marketDataList.set(s);
45+
finished.set(true);
46+
47+
emitter.closeStreamsAndLogoff(socket);
48+
socket.sendClose();
49+
};
50+
emitter.asObservable().take(1).subscribe(marketDataWriter);
51+
while (!finished.get()) {
52+
logger.info("Waiting for Market Data List to finish retrieving");
53+
Thread.sleep(1000);
54+
}
55+
return marketDataList.get();
56+
} catch (IOException e) {
57+
throw new RuntimeException(e);
58+
} catch (Exception e) {
59+
throw new RuntimeException(e);
60+
}
61+
}
62+
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package net.finmath.smartcontract.settlement;
2+
3+
import net.finmath.smartcontract.model.SDCException;
4+
import net.finmath.smartcontract.product.SmartDerivativeContractDescriptor;
5+
import net.finmath.smartcontract.product.xml.SDCXMLParser;
6+
import org.junit.jupiter.api.Test;
7+
import org.xml.sax.SAXException;
8+
9+
import javax.xml.parsers.ParserConfigurationException;
10+
import java.io.IOException;
11+
import java.io.InputStream;
12+
import java.math.BigDecimal;
13+
import java.time.ZonedDateTime;
14+
import java.util.List;
15+
16+
import static org.junit.jupiter.api.Assertions.*;
17+
18+
class SettlementGeneratorTest {
19+
20+
@Test
21+
void generateInitialSettlement() throws IOException, ParserConfigurationException, SAXException {
22+
InputStream inputStream = SettlementGeneratorTest.class.getClassLoader().getResourceAsStream("net/finmath/smartcontract/valuation/historicalMarketData/marketdata_2008-05-02.xml");
23+
String marketDataString = new String(inputStream.readAllBytes());
24+
25+
inputStream = SettlementGeneratorTest.class.getClassLoader().getResourceAsStream("net.finmath.smartcontract.product.xml/smartderivativecontract_with_rics.xml");
26+
String productString = new String(inputStream.readAllBytes());
27+
SmartDerivativeContractDescriptor sdc = SDCXMLParser.parse(productString);
28+
29+
String settlementString = new SettlementGenerator().generateInitialSettlementXml(marketDataString, sdc)
30+
.marginLimits(List.of(BigDecimal.ONE, BigDecimal.ZERO))
31+
.settlementValue(BigDecimal.ZERO)
32+
//.settlementValuePrevious(BigDecimal.ZERO)
33+
.settlementTimeNext(ZonedDateTime.now())
34+
.settlementValueNext(BigDecimal.ZERO)
35+
.build();
36+
37+
System.out.println(settlementString);
38+
39+
assertTrue(settlementString.contains("ESTRSWP3Y"));
40+
assertTrue(settlementString.contains("ESTRSWP1W"));
41+
assertTrue(settlementString.contains("INITIAL"));
42+
assertFalse(settlementString.contains("REGULAR"));
43+
assertTrue(settlementString.contains("<marginValue>0</marginValue>"));
44+
assertTrue(settlementString.contains("<marketData>"));
45+
assertTrue(settlementString.contains("<requestTimeStamp>"));
46+
assertTrue(settlementString.contains("<item>"));
47+
assertTrue(settlementString.contains("<value>"));
48+
assertTrue(settlementString.contains("<settlementTimeNext>"));
49+
assertTrue(settlementString.contains("<settlementValueNext>"));
50+
assertTrue(settlementString.contains("<settlementValuePrevious>"));
51+
assertTrue(settlementString.contains("<settlementValue>"));
52+
assertTrue(settlementString.contains("<marginLimits>"));
53+
}
54+
55+
@Test
56+
void generateRegularSettlement() throws IOException, ParserConfigurationException, SAXException {
57+
InputStream inputStream = SettlementGeneratorTest.class.getClassLoader().getResourceAsStream("net/finmath/smartcontract/valuation/historicalMarketData/marketdata_2008-05-02.xml");
58+
String marketDataString = new String(inputStream.readAllBytes());
59+
60+
inputStream = SettlementGeneratorTest.class.getClassLoader().getResourceAsStream("net.finmath.smartcontract.product.xml/smartderivativecontract_with_rics.xml");
61+
String productString = new String(inputStream.readAllBytes());
62+
SmartDerivativeContractDescriptor sdc = SDCXMLParser.parse(productString);
63+
64+
String settlementString = new SettlementGenerator().generateRegularSettlementXml(marketDataString, sdc, BigDecimal.ONE)
65+
.marginLimits(List.of(BigDecimal.ONE, BigDecimal.ZERO))
66+
.settlementValue(BigDecimal.ZERO)
67+
.settlementValuePrevious(BigDecimal.ZERO)
68+
.settlementTimeNext(ZonedDateTime.now())
69+
.settlementValueNext(BigDecimal.ZERO)
70+
.build();
71+
72+
System.out.println(settlementString);
73+
74+
assertTrue(settlementString.contains("ESTRSWP3Y"));
75+
assertTrue(settlementString.contains("ESTRSWP1W"));
76+
assertTrue(settlementString.contains("REGULAR"));
77+
assertFalse(settlementString.contains("INITIAL"));
78+
assertTrue(settlementString.contains("<marginValue>1</marginValue>"));
79+
assertTrue(settlementString.contains("<marketData>"));
80+
assertTrue(settlementString.contains("<requestTimeStamp>"));
81+
assertTrue(settlementString.contains("<item>"));
82+
assertTrue(settlementString.contains("<value>"));
83+
assertTrue(settlementString.contains("<settlementTimeNext>"));
84+
assertTrue(settlementString.contains("<settlementValueNext>"));
85+
assertTrue(settlementString.contains("<settlementValuePrevious>"));
86+
assertTrue(settlementString.contains("<settlementValue>"));
87+
assertTrue(settlementString.contains("<marginLimits>"));
88+
}
89+
90+
@Test
91+
void generateIncompleteSettlement_Exception() throws IOException, ParserConfigurationException, SAXException {
92+
InputStream inputStream = SettlementGeneratorTest.class.getClassLoader().getResourceAsStream("net/finmath/smartcontract/valuation/historicalMarketData/marketdata_2008-05-02.xml");
93+
String marketDataString = new String(inputStream.readAllBytes());
94+
95+
inputStream = SettlementGeneratorTest.class.getClassLoader().getResourceAsStream("net.finmath.smartcontract.product.xml/smartderivativecontract_with_rics.xml");
96+
String productString = new String(inputStream.readAllBytes());
97+
SmartDerivativeContractDescriptor sdc = SDCXMLParser.parse(productString);
98+
99+
SettlementGenerator generator = new SettlementGenerator().generateRegularSettlementXml(marketDataString, sdc, BigDecimal.ONE)
100+
.marginLimits(List.of(BigDecimal.ONE, BigDecimal.ZERO))
101+
.settlementValue(BigDecimal.ZERO)
102+
.settlementValuePrevious(BigDecimal.ZERO)
103+
.settlementTimeNext(ZonedDateTime.now());
104+
//.settlementValueNext(BigDecimal.ZERO);
105+
106+
assertThrows(SDCException.class, generator::build);
107+
}
108+
}

0 commit comments

Comments
 (0)