more work on stop loss
This commit is contained in:
parent
b5c6d45f66
commit
a2e5143c64
@ -1,4 +1,4 @@
|
|||||||
#Fri, 04 Jan 2019 08:25:13 +0100
|
#Fri, 04 Jan 2019 17:38:20 +0100
|
||||||
annotation.processing.enabled=true
|
annotation.processing.enabled=true
|
||||||
annotation.processing.enabled.in.editor=false
|
annotation.processing.enabled.in.editor=false
|
||||||
annotation.processing.processors.list=
|
annotation.processing.processors.list=
|
||||||
|
@ -123,7 +123,18 @@ public class Account {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public double getAvail(AbstractAsset asset) {
|
public double getAvail(AbstractAsset asset) {
|
||||||
return assets_avail.getOrDefault(asset, 0.0);
|
if (this.getLeverage()>0){
|
||||||
|
Double margin = this.getMargin(world.getDefaultCurrency());
|
||||||
|
|
||||||
|
AssetPair ap = world.getAssetPair(asset, world.getDefaultCurrency());
|
||||||
|
|
||||||
|
|
||||||
|
return margin / world.getDefaultExchange().getAPI(ap).getLastQuote().price;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0.0;
|
||||||
|
|
||||||
|
//return assets_avail.getOrDefault(asset, 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addAvail(AbstractAsset asset, double val) {
|
public void addAvail(AbstractAsset asset, double val) {
|
||||||
@ -166,6 +177,8 @@ public class Account {
|
|||||||
Double v = get(a) * api.last_quote.price;
|
Double v = get(a) * api.last_quote.price;
|
||||||
Double sl = this.calcStopLoss(a);
|
Double sl = this.calcStopLoss(a);
|
||||||
Double n = get(a);
|
Double n = get(a);
|
||||||
|
if (n==0.0)
|
||||||
|
continue;
|
||||||
|
|
||||||
System.out.printf("Asset: %s - %f %f %f\n", a.getSymbol(),n, v, sl*n);
|
System.out.printf("Asset: %s - %f %f %f\n", a.getSymbol(),n, v, sl*n);
|
||||||
|
|
||||||
@ -199,10 +212,15 @@ public class Account {
|
|||||||
if (pair == null) {
|
if (pair == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
v = get(a);
|
||||||
|
if (v==0.0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
|
||||||
TradingEngine api = (TradingEngine) ex.getAPI(pair);
|
TradingEngine api = (TradingEngine) ex.getAPI(pair);
|
||||||
v = get(a) * api.last_quote.price;
|
//v = get(a) * api.last_quote.price;
|
||||||
|
|
||||||
result = result + v;
|
result = result + v*api.last_quote.price;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -52,4 +52,6 @@ public interface TradingAPI {
|
|||||||
|
|
||||||
public Set<Quote> getQuoteHistory();
|
public Set<Quote> getQuoteHistory();
|
||||||
|
|
||||||
|
public Quote getLastQuote();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -289,9 +289,9 @@ class TradingEngine implements TradingAPI {
|
|||||||
// For sellers there is no need to update.
|
// For sellers there is no need to update.
|
||||||
double avdiff = b.limit * volume - price * volume;
|
double avdiff = b.limit * volume - price * volume;
|
||||||
b.account.addAvail(assetpair.getCurrency(), avdiff);
|
b.account.addAvail(assetpair.getCurrency(), avdiff);
|
||||||
if (b.account.getLeverage()>0.0){
|
if (b.account.getLeverage() > 0.0) {
|
||||||
//b.account.margin_bound-=avdiff;
|
//b.account.margin_bound-=avdiff;
|
||||||
b.account.margin_bound-=b.limit*volume;
|
b.account.margin_bound -= b.limit * volume;
|
||||||
}
|
}
|
||||||
|
|
||||||
// b.account.addMarginAvail(assetpair.getCurrency(), avdiff/b.account.getLeverage());
|
// b.account.addMarginAvail(assetpair.getCurrency(), avdiff/b.account.getLeverage());
|
||||||
@ -438,31 +438,29 @@ class TradingEngine implements TradingAPI {
|
|||||||
switch (type) {
|
switch (type) {
|
||||||
case BUYLIMIT: {
|
case BUYLIMIT: {
|
||||||
Double avail;
|
Double avail;
|
||||||
|
|
||||||
// verfify available currency for a buy limit order
|
// verfify available currency for a buy limit order
|
||||||
AbstractAsset currency = this.assetpair.getCurrency();
|
AbstractAsset currency = this.assetpair.getCurrency();
|
||||||
if (account.getLeverage()==0.0){
|
if (account.getLeverage() == 0.0) {
|
||||||
avail = account.getAvail(currency);
|
avail = account.getAvail(currency);
|
||||||
account.addAvail(currency, -(v * l));
|
account.addAvail(currency, -(v * l));
|
||||||
|
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
|
|
||||||
|
|
||||||
avail = account.getMargin(assetpair.getCurrency());
|
avail = account.getMargin(assetpair.getCurrency());
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// return if not enough funds are available
|
|
||||||
if (avail < v * l) {
|
|
||||||
o = new Order(this, account, type, v, l);
|
|
||||||
o.status=Order.Status.ERROR;
|
|
||||||
|
|
||||||
System.out.printf("Error order no funds\n");
|
|
||||||
// return o;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
account.margin_bound+=v*l;
|
// return if not enough funds are available
|
||||||
|
if (avail < v * l) {
|
||||||
|
o = new Order(this, account, type, v, l);
|
||||||
|
o.status = Order.Status.ERROR;
|
||||||
|
|
||||||
|
System.out.printf("Error order no funds\n");
|
||||||
|
// return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
account.margin_bound += v * l;
|
||||||
// reduce the available money
|
// reduce the available money
|
||||||
// account.assets_avail.put(currency, avail - v * l);
|
// account.assets_avail.put(currency, avail - v * l);
|
||||||
|
|
||||||
@ -514,178 +512,85 @@ class TradingEngine implements TradingAPI {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
o = new Order(this, account, type, v, order_limit);
|
|
||||||
|
|
||||||
//System.out.printf("The new Order has: volume: %f limit: %f\n", o.getVolume(), o.getLimit());
|
o = new Order(this, account, type, v, order_limit);
|
||||||
synchronized (this) {
|
|
||||||
order_books.get(o.type).add(o);
|
//System.out.printf("The new Order has: volume: %f limit: %f\n", o.getVolume(), o.getLimit());
|
||||||
|
synchronized (this) {
|
||||||
|
order_books.get(o.type).add(o);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
executeOrders();
|
||||||
|
last_quote.price = 150; //75-12.5;
|
||||||
|
for (FiringEvent e : book_listener) {
|
||||||
|
e.fire();
|
||||||
|
}
|
||||||
|
|
||||||
|
account.notfiyListeners();
|
||||||
|
return o;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
HashSet<FiringEvent> book_listener
|
||||||
|
= new HashSet<>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addOrderBookListener(EventListener listener
|
||||||
|
) {
|
||||||
|
book_listener
|
||||||
|
.add(new FiringEvent(listener
|
||||||
|
));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set
|
||||||
|
getOrderBook(Order.Type type
|
||||||
|
) {
|
||||||
|
switch (type) {
|
||||||
|
case BUYLIMIT:
|
||||||
|
case BUY:
|
||||||
|
return Collections
|
||||||
|
.unmodifiableSet(bidbook
|
||||||
|
);
|
||||||
|
|
||||||
|
case SELLLIMIT:
|
||||||
|
case SELL:
|
||||||
|
return Collections
|
||||||
|
.unmodifiableSet(askbook
|
||||||
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
executeOrders();
|
|
||||||
last_quote.price = 150; //75-12.5;
|
|
||||||
for (FiringEvent e : book_listener
|
|
||||||
|
|
||||||
|
|
||||||
) {
|
|
||||||
e.fire();
|
|
||||||
}
|
|
||||||
|
|
||||||
account.notfiyListeners();
|
|
||||||
return o ;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
HashSet
|
|
||||||
|
|
||||||
<FiringEvent
|
|
||||||
|
|
||||||
> book_listener
|
|
||||||
|
|
||||||
= new HashSet
|
|
||||||
|
|
||||||
<>();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public
|
|
||||||
|
|
||||||
void addOrderBookListener
|
|
||||||
|
|
||||||
(EventListener
|
|
||||||
|
|
||||||
listener
|
|
||||||
|
|
||||||
) {
|
|
||||||
book_listener
|
|
||||||
|
|
||||||
.add
|
|
||||||
|
|
||||||
(new FiringEvent
|
|
||||||
|
|
||||||
(listener
|
|
||||||
|
|
||||||
));
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Set
|
|
||||||
|
|
||||||
getOrderBook
|
|
||||||
|
|
||||||
(Order
|
|
||||||
|
|
||||||
.Type
|
|
||||||
|
|
||||||
type
|
|
||||||
|
|
||||||
) {
|
|
||||||
switch (type
|
|
||||||
|
|
||||||
) {
|
|
||||||
case BUYLIMIT
|
|
||||||
|
|
||||||
:
|
|
||||||
case BUY
|
|
||||||
|
|
||||||
:
|
|
||||||
return Collections
|
|
||||||
|
|
||||||
.unmodifiableSet
|
|
||||||
|
|
||||||
(bidbook
|
|
||||||
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
case SELLLIMIT
|
|
||||||
|
|
||||||
:
|
|
||||||
case SELL
|
|
||||||
|
|
||||||
:
|
|
||||||
return Collections
|
|
||||||
|
|
||||||
.unmodifiableSet
|
|
||||||
|
|
||||||
(askbook
|
|
||||||
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set
|
public Set
|
||||||
|
getBidBook() {
|
||||||
|
return getOrderBook(Order.Type.BUYLIMIT
|
||||||
|
);
|
||||||
|
|
||||||
getBidBook
|
}
|
||||||
|
|
||||||
() {
|
|
||||||
return getOrderBook
|
|
||||||
|
|
||||||
(Order
|
|
||||||
|
|
||||||
.Type
|
|
||||||
|
|
||||||
.BUYLIMIT
|
|
||||||
|
|
||||||
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set
|
public Set
|
||||||
|
getAskBook() {
|
||||||
|
return getOrderBook(Order.Type.SELL
|
||||||
|
);
|
||||||
|
|
||||||
getAskBook
|
}
|
||||||
|
|
||||||
() {
|
|
||||||
return getOrderBook
|
|
||||||
|
|
||||||
(Order
|
|
||||||
|
|
||||||
.Type
|
|
||||||
|
|
||||||
.SELL
|
|
||||||
|
|
||||||
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set
|
public Set<Quote> getQuoteHistory() {
|
||||||
|
return Collections.unmodifiableSet(quote_history);
|
||||||
|
}
|
||||||
|
|
||||||
<Quote
|
@Override
|
||||||
|
public Quote getLastQuote() {
|
||||||
> getQuoteHistory
|
return this.last_quote;
|
||||||
|
|
||||||
() {
|
|
||||||
return Collections
|
|
||||||
|
|
||||||
|
|
||||||
.unmodifiableSet
|
|
||||||
|
|
||||||
(quote_history
|
|
||||||
|
|
||||||
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user