// validates commands and returns hard coded (canned) responses
DynamicSimulationAdapter simulationAdapter = new DynamicSimulationAdapter(false);
String password = "P455w0rd";
String eMail = "someone@somewhere.com";
Portfolio portfolio = new SimplePortfolioFactory().createPortfolio(new BigDecimal("10000"));
BigDecimal commission = new BigDecimal("10.00");
Integer systemId = simulationAdapter.createSystem("first system",password,portfolio,commission);
simulationAdapter.subscribe(eMail,systemId,password);
C2ServiceFactory factory = new C2ServiceFactory(simulationAdapter);
C2EntryService sentryService = factory.signalEntryService(password, systemId, eMail);
validateStartingBalances(systemId, sentryService);
assertEquals(0, portfolio.position("msft").quantity().intValue());
Response openResponse = sentryService.stockSignal(ActionForStock.BuyToOpen)
.marketOrder().quantity(10).symbol("msft")
.duration(Duration.GoodTilCancel).send();
Integer signalId = openResponse.getInteger(C2Element.ElementSignalId);
assertEquals(0,signalId.intValue());
long timeStep = 60000l*60l*24l;
long time = 100000l;
BigDecimal fixedPrice = new BigDecimal("80.43");
DynamicSimulationMockDataProvider dataProvider = new DynamicSimulationMockDataProvider(time,fixedPrice,fixedPrice,fixedPrice,fixedPrice,time+timeStep);
simulationAdapter.tick(dataProvider,sentryService);
Number buyPower = sentryService.buyPower(); // 10000 - ((10 * 80.43)+10) = 10000-814.30
assertEquals(9185.7d,buyPower.doubleValue(),DELTA);
Number systemEquity = sentryService.systemEquity(); //10 * 80.43 = 804.30
assertEquals(804.30d,systemEquity.doubleValue(),DELTA);
final Set<C2Element> checkedElements = new HashSet<C2Element>();
sentryService.sendSystemHypotheticalRequest(systemId).visitC2Elements(new C2ElementVisitor() {
@Override
public void visit(C2Element element, String data) {
switch (element) {
case ElementTotalEquityAvail:
checkedElements.add(element);
assertEquals(9990d, Double.parseDouble(data), DELTA);
break;
case ElementCash:
checkedElements.add(element);
assertEquals(9185.70d, Double.parseDouble(data), DELTA);
break;
case ElementEquity:
checkedElements.add(element);
assertEquals(804.30d, Double.parseDouble(data), DELTA);
break;
case ElementMarginUsed:
checkedElements.add(element);
assertEquals(0d, Double.parseDouble(data), DELTA);
break;
default:
//nothing
}
}
},C2Element.ElementTotalEquityAvail,
C2Element.ElementCash,
C2Element.ElementEquity,
C2Element.ElementMarginUsed);
assertEquals("expected to check 4 elements",4,checkedElements.size());
assertEquals(10, portfolio.position("msft").quantity().intValue());
///////////////////
//market order sell test
///////////////////
Response marketOrderResponse = sentryService.stockSignal(ActionForStock.SellToClose)
.marketOrder().quantity(10).symbol("msft")
.duration(Duration.GoodTilCancel).send();
//force request response now
marketOrderResponse.getXML();
///////////////////////
//tick for market buy
/////////////////////
long startTime = time+timeStep;
long closeTime = startTime+timeStep;
BigDecimal closePrice = new BigDecimal("160.86");
dataProvider = new DynamicSimulationMockDataProvider(startTime,fixedPrice,closePrice,fixedPrice,closePrice,closeTime);
simulationAdapter.tick(dataProvider,sentryService);
////////////////////
//confirm values
///////////////////
assertEquals(0, portfolio.position("msft").quantity().intValue());
buyPower = sentryService.buyPower();
assertEquals(9980d,buyPower.doubleValue(),DELTA);
systemEquity = sentryService.systemEquity(); //10 * 80.43 = 804.30
assertEquals(0d,systemEquity.doubleValue(),DELTA);
///////////////////
//limit order test
//////////////////
BigDecimal failLimit = new BigDecimal("65.10");
Response limitOrderResponse = sentryService.stockSignal(ActionForStock.BuyToOpen)
.limitOrder(failLimit).quantity(10).symbol("msft")
.duration(Duration.DayOrder).send();
///////////////////////////
//tick for limit order fail
////////////////////////////
dataProvider = dataProvider.incTime(timeStep);
simulationAdapter.tick(dataProvider,sentryService);
////////////////////
//confirm unchanged values
///////////////////
assertEquals(0, portfolio.position("msft").quantity().intValue());
buyPower = sentryService.buyPower();
assertEquals(9980d,buyPower.doubleValue(),DELTA);
systemEquity = sentryService.systemEquity(); //10 * 80.43 = 804.30
assertEquals(0d,systemEquity.doubleValue(),DELTA);
///////////////////
//limit order test
//////////////////
BigDecimal successLimit = new BigDecimal("170.10");
limitOrderResponse = sentryService.stockSignal(ActionForStock.BuyToOpen)
.limitOrder(successLimit).quantity(10).symbol("msft")
.duration(Duration.DayOrder).send();
//force request response now
Integer openSignalId = limitOrderResponse.getInteger(C2Element.ElementSignalId);
///////////////////////////
//tick for limit order success
////////////////////////////
dataProvider = dataProvider.incTime(timeStep);
simulationAdapter.tick(dataProvider,sentryService);
////////////////////
//confirm changed
///////////////////
BigDecimal entryPrice = portfolio.position("msft").openPrice();
assertTrue(null == entryPrice || entryPrice.compareTo(successLimit)<=0);
BigDecimal shares = new BigDecimal("10");
assertEquals(shares.intValue(), portfolio.position("msft").quantity().intValue());
BigDecimal openEquity = entryPrice.multiply(shares);
BigDecimal expectedBuyPower = new BigDecimal("9980").subtract(commission.add(openEquity));
buyPower = sentryService.buyPower();
assertEquals(expectedBuyPower.doubleValue(),buyPower.doubleValue(),DELTA);
BigDecimal closeEquity = closePrice.multiply(shares);
systemEquity = sentryService.systemEquity();
assertEquals(closeEquity.doubleValue(),systemEquity.doubleValue(),DELTA);
///////////////////
//market limit sell fail test
///////////////////
BigDecimal sellLimitFail = new BigDecimal("180.10");
Response marketLimitSellResponse = sentryService.stockSignal(ActionForStock.SellToClose)
.limitOrder(sellLimitFail).quantity(10).symbol("msft")
.duration(Duration.DayOrder).send();
//force request response now
marketLimitSellResponse.getXML();
///////////////////////////
//tick for limit order fail
////////////////////////////
dataProvider = dataProvider.incTime(timeStep);
simulationAdapter.tick(dataProvider,sentryService);
////////////////////
//confirm nothing changed
///////////////////
entryPrice = portfolio.position("msft").openPrice();
assertTrue(entryPrice.compareTo(successLimit)<=0);
shares = new BigDecimal("10");
assertEquals(shares.intValue(), portfolio.position("msft").quantity().intValue());
openEquity = entryPrice.multiply(shares);
expectedBuyPower = new BigDecimal("9980").subtract(commission.add(openEquity));
buyPower = sentryService.buyPower();
assertEquals(expectedBuyPower.doubleValue(),buyPower.doubleValue(),DELTA);
closeEquity = closePrice.multiply(shares);
systemEquity = sentryService.systemEquity();
assertEquals(closeEquity.doubleValue(),systemEquity.doubleValue(),DELTA);
///////////////////
//market limit sell success test
///////////////////
BigDecimal sellLimitSuccess = new BigDecimal("110.10");
marketLimitSellResponse = sentryService.stockSignal(ActionForStock.SellToClose)
.limitOrder(sellLimitSuccess).quantity(10).symbol("msft")
.duration(Duration.DayOrder).send();
///////////////////////////
//tick for limit order success
////////////////////////////
dataProvider = dataProvider.incTime(timeStep);
simulationAdapter.tick(dataProvider,sentryService);
shares = new BigDecimal("0");
assertEquals(shares.intValue(), portfolio.position("msft").quantity().intValue());
//extra simple methods
boolean ok = sentryService.flushPendingSignals();
assertTrue(ok);