Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bxbot restapi #40

Merged
merged 24 commits into from
Sep 16, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
cc77d21
Switched Travis link back to restapi
gazbert Sep 10, 2016
6203afb
Merge remote-tracking branch 'remotes/origin/master' into bxbot-restapi
gazbert Sep 10, 2016
8472353
Merge remote-tracking branch 'remotes/origin/master' into bxbot-restapi
gazbert Sep 10, 2016
941cad4
Added links to Gitter
gazbert Sep 13, 2016
8e1ab2e
Corrected Gitter links
gazbert Sep 13, 2016
b78c5f4
Travis link update for master merge
gazbert Sep 13, 2016
d64fd6a
Travis link updated for restapi
gazbert Sep 13, 2016
6ac3411
Added Gitter badge
gazbert Sep 13, 2016
92c0d0f
Travis link updated for restapi
gazbert Sep 13, 2016
eae997c
Fomatting - all on one line
gazbert Sep 13, 2016
9cc362c
Merge remote-tracking branch 'remotes/origin/master' into bxbot-restapi
gazbert Sep 13, 2016
b112e9c
Travis link updated for restapi
gazbert Sep 13, 2016
8442f99
README update only
gazbert Sep 13, 2016
d524303
More Market REST API impl
gazbert Sep 14, 2016
0eff8c7
Market config REST API controller done
gazbert Sep 14, 2016
4cb2469
Market repo impl - findById done
gazbert Sep 15, 2016
ad7998b
Market repo impl - updateMarket done
gazbert Sep 15, 2016
7b360d5
README tweak only
gazbert Sep 15, 2016
0d2cb98
README tweak only
gazbert Sep 15, 2016
74f3067
Removed old log4j2 deps versions from parent POM
gazbert Sep 16, 2016
8fb8341
Removed some old (confusing) comments from parent POM
gazbert Sep 16, 2016
6392bd8
Market repo impl - deleteById done
gazbert Sep 16, 2016
b6eb41f
Market repo impl - createMarket done
gazbert Sep 16, 2016
5fc4006
Prop for PR to merge more stuff back to master
gazbert Sep 16, 2016
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
[![Join the chat at https://gitter.im/BX-bot/Lobby](https://badges.gitter.im/BX-bot/Lobby.svg)](https://gitter.im/BX-bot/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)

## What is BX-bot?
BX-bot (_Bex_) is a simple Java automated trading bot for trading [Bitcoin](https://bitcoin.org) on
BX-bot (_Bex_) is a simple Java trading bot for trading [Bitcoin](https://bitcoin.org) on
cryptocurrency [exchanges](https://bitcoinwisdom.com/).

The project contains the basic infrastructure to trade on a [cryptocurrency](http://coinmarketcap.com/) exchange...
Expand Down Expand Up @@ -415,6 +415,8 @@ You can also create your own jar for your strats, e.g. `my-strats.jar`, and incl
see the _Installation Guide_ for how to do this.

### How do I write my own Exchange Adapter?
_"I was seldom able to see an opportunity until it had ceased to be one."_ - Mark Twain

The best place to start is with one of the sample Exchange Adapters provided - see the latest
[`BitstampExchangeAdapter`](./bxbot-exchanges/src/main/java/com/gazbert/bxbot/exchanges/BitstampExchangeAdapter.java)
for example.
Expand Down Expand Up @@ -504,7 +506,7 @@ The following features are in the pipeline:
- REST API for administering the bot.
- [Web UI](https://github.com/gazbert/bxbot-ui) for administering the bot written in [Angular](https://angular.io/).
- An experimental project to register [BX-bot](https://github.com/gazbert/bxbot) trades using an [Ethereum](https://www.ethereum.org/) blockchain.
- Trade Analysis app - a microservice that will feed off trading events sent by the bots.
- Trade Analysis app - a microservice that will feed off trading events sent by the bot.
- Android app for administering the bot.

See the main project [Issue Tracker](https://github.com/gazbert/bxbot/issues) for timescales and progress.
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

import static com.gazbert.bxbot.datastore.FileLocations.MARKETS_CONFIG_XML_FILENAME;
import static com.gazbert.bxbot.datastore.FileLocations.MARKETS_CONFIG_XSD_FILENAME;
Expand All @@ -61,22 +63,114 @@ public List<MarketConfig> findAllMarkets() {

@Override
public MarketConfig findById(String id) {
throw new UnsupportedOperationException("findById not coded yet!");

LOG.info(() -> "Fetching config for market id: " + id);

final MarketsType internalMarketsConfig = ConfigurationManager.loadConfig(MarketsType.class,
MARKETS_CONFIG_XML_FILENAME, MARKETS_CONFIG_XSD_FILENAME);

return adaptInternalToExternalConfig(
internalMarketsConfig.getMarkets()
.stream()
.filter((item) -> item.getId().equals(id))
.distinct()
.collect(Collectors.toList()));
}

@Override
public MarketConfig createMarket(MarketConfig config) {
throw new UnsupportedOperationException("createMarket not coded yet!");

final MarketsType internalMarketsConfig = ConfigurationManager.loadConfig(MarketsType.class,
MARKETS_CONFIG_XML_FILENAME, MARKETS_CONFIG_XSD_FILENAME);

final List<MarketType> marketTypes = internalMarketsConfig.getMarkets()
.stream()
.filter((item) -> item.getId().equals(config.getId()))
.distinct()
.collect(Collectors.toList());

if (marketTypes.isEmpty()) {

internalMarketsConfig.getMarkets().add(adaptExternalToInternalConfig(config));
ConfigurationManager.saveConfig(MarketsType.class, internalMarketsConfig,
MARKETS_CONFIG_XML_FILENAME);

final MarketsType updatedInternalMarketsConfig = ConfigurationManager.loadConfig(
MarketsType.class, MARKETS_CONFIG_XML_FILENAME, MARKETS_CONFIG_XSD_FILENAME);

return adaptInternalToExternalConfig(
updatedInternalMarketsConfig.getMarkets()
.stream()
.filter((item) -> item.getId().equals(config.getId()))
.distinct()
.collect(Collectors.toList()));
} else {
// already have a matching id :-(
return new MarketConfig();
}
}

@Override
public MarketConfig updateMarket(MarketConfig config) {
throw new UnsupportedOperationException("updateMarket not coded yet!");

final MarketsType internalMarketsConfig = ConfigurationManager.loadConfig(MarketsType.class,
MARKETS_CONFIG_XML_FILENAME, MARKETS_CONFIG_XSD_FILENAME);

final List<MarketType> marketTypes = internalMarketsConfig.getMarkets()
.stream()
.filter((item) -> item.getId().equals(config.getId()))
.distinct()
.collect(Collectors.toList());

if (!marketTypes.isEmpty()) {

internalMarketsConfig.getMarkets().remove(marketTypes.get(0)); // will only be 1 unique strat
internalMarketsConfig.getMarkets().add(adaptExternalToInternalConfig(config));
ConfigurationManager.saveConfig(MarketsType.class, internalMarketsConfig,
MARKETS_CONFIG_XML_FILENAME);

final MarketsType updatedInternalMarketsConfig = ConfigurationManager.loadConfig(
MarketsType.class, MARKETS_CONFIG_XML_FILENAME, MARKETS_CONFIG_XSD_FILENAME);

return adaptInternalToExternalConfig(
updatedInternalMarketsConfig.getMarkets()
.stream()
.filter((item) -> item.getId().equals(config.getId()))
.distinct()
.collect(Collectors.toList()));
} else {
// no matching id :-(
return new MarketConfig();
}
}

@Override
public MarketConfig deleteMarketById(String id) {
throw new UnsupportedOperationException("deleteMarketById not coded yet!");

LOG.info(() -> "Deleting config for Market id: " + id);

final MarketsType internalMarketsConfig = ConfigurationManager.loadConfig(MarketsType.class,
MARKETS_CONFIG_XML_FILENAME, MARKETS_CONFIG_XSD_FILENAME);

final List<MarketType> marketTypes = internalMarketsConfig.getMarkets()
.stream()
.filter((item) -> item.getId().equals(id))
.distinct()
.collect(Collectors.toList());

if (!marketTypes.isEmpty()) {

final MarketType marketToRemove = marketTypes.get(0); // will only be 1 unique strat
internalMarketsConfig.getMarkets().remove(marketToRemove);
ConfigurationManager.saveConfig(MarketsType.class, internalMarketsConfig,
MARKETS_CONFIG_XML_FILENAME);

return adaptInternalToExternalConfig(Collections.singletonList(marketToRemove));
} else {
// no matching id :-(
return new MarketConfig();
}

}

// ------------------------------------------------------------------------------------------------
Expand All @@ -103,4 +197,34 @@ private static List<MarketConfig> adaptAllInternalToAllExternalConfig(MarketsTyp

return marketConfigItems;
}

private static MarketConfig adaptInternalToExternalConfig(List<MarketType> internalMarketConfigItems) {

final MarketConfig marketConfig = new MarketConfig();

if (!internalMarketConfigItems.isEmpty()) {

// Should only ever be 1 unique Market id
final MarketType internalMarketConfig = internalMarketConfigItems.get(0);
marketConfig.setId(internalMarketConfig.getId());
marketConfig.setLabel(internalMarketConfig.getLabel());
marketConfig.setEnabled(internalMarketConfig.isEnabled());
marketConfig.setBaseCurrency(internalMarketConfig.getBaseCurrency());
marketConfig.setCounterCurrency(internalMarketConfig.getCounterCurrency());
marketConfig.setTradingStrategy(internalMarketConfig.getTradingStrategy());
}
return marketConfig;
}

private static MarketType adaptExternalToInternalConfig(MarketConfig externalMarketConfig) {

final MarketType marketType = new MarketType();
marketType.setId(externalMarketConfig.getId());
marketType.setLabel(externalMarketConfig.getLabel());
marketType.setEnabled(externalMarketConfig.isEnabled());
marketType.setBaseCurrency(externalMarketConfig.getBaseCurrency());
marketType.setCounterCurrency(externalMarketConfig.getCounterCurrency());
marketType.setTradingStrategy(externalMarketConfig.getTradingStrategy());
return marketType;
}
}
Loading