package com.romerun.trading.mtgox;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import com.xeiam.xchange.currency.Currencies;
import com.xeiam.xchange.Exchange;
import com.xeiam.xchange.ExchangeFactory;
import com.xeiam.xchange.ExchangeSpecification;
import com.xeiam.xchange.dto.Order.OrderType;
import com.xeiam.xchange.dto.account.AccountInfo;
import com.xeiam.xchange.dto.marketdata.Ticker;
import com.xeiam.xchange.dto.trade.MarketOrder;
import com.xeiam.xchange.service.account.polling.PollingAccountService;
import com.xeiam.xchange.service.marketdata.polling.PollingMarketDataService;
import com.xeiam.xchange.service.trade.polling.PollingTradeService;
import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;
final class MiniCrashBot {
@Parameter(names = "-apiKey", description = "apiKey", required = true)
private String apiKey;
@Parameter(names = "-secretKey", description = "secretKey", required = true)
private String secretKey;
@Parameter(names = "-sellTrigger", description = "sellTrigger", required = true, variableArity = true, converter = TriggerConverter.class)
private List<Trigger> sellTriggers = new ArrayList<Trigger>();
@Parameter(names = "-buyTrigger", description = "buyTrigger", required = true, variableArity = true, converter = TriggerConverter.class)
private List<Trigger> buyTriggers = new ArrayList<Trigger>();
@Parameter(names = "-hi", description = "hi")
private double hi = 1;
@Parameter(names = "-lo", description = "lo")
private double lo = 999999999;
static Exchange getMyExchange(String apiKey, String secretKey) {
ExchangeSpecification exchangeSpecification = new ExchangeSpecification("com.xeiam.xchange.mtgox.v1.MtGoxExchange");
exchangeSpecification.setApiKey(apiKey);
exchangeSpecification.setSecretKey(secretKey);
exchangeSpecification.setUri("https://mtgox.com");
exchangeSpecification.setHost("mtgox.com");
return ExchangeFactory.INSTANCE.createExchange(exchangeSpecification);
}
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
MiniCrashBot conf = new MiniCrashBot();
new JCommander(conf, args);
double hi = conf.hi;
double lo = conf.lo;
Exchange mtGox = getMyExchange(conf.apiKey, conf.secretKey);
// Get the account information
PollingAccountService accountService = mtGox.getPollingAccountService();
PollingMarketDataService marketDataService = mtGox.getPollingMarketDataService();
PollingTradeService tradeService = mtGox.getPollingTradeService();
AccountInfo accountInfo = accountService.getAccountInfo();
System.out.println("AccountInfo as String: " + accountInfo.toString() + "\n");
HashMap<String,Trigger> sellTriggers = new HashMap<String,Trigger>();
for (Trigger t: conf.sellTriggers) {
sellTriggers.put(t.name, t);
}
for (;;) {
Ticker ticker = marketDataService.getTicker(Currencies.BTC, Currencies.USD);
double last = ticker.getLast().getAmount().doubleValue();
double drop = (hi - last) / hi * 100;
double jump = (last - lo) / lo * 100;
System.out.println(String.format("hi %f lo %f last %f, drop %f percent jump, %f percent", hi, lo, last, drop, jump));
for (Entry<String, Trigger> tuple : sellTriggers.entrySet()) {
String triggerName = tuple.getKey();
Trigger trigger = tuple.getValue();
if (drop >= trigger.percent) {
System.out.println("Below " + trigger.percent + "%");
if (trigger.stopOrderId == null) {
OrderType orderType = (OrderType.ASK);
BigDecimal tradeableAmount = new BigDecimal(trigger.size);
String tradableIdentifier = "BTC";
String transactionCurrency = "USD";
MarketOrder marketOrder = new MarketOrder(orderType, tradeableAmount, tradableIdentifier, transactionCurrency);
trigger.stopOrderId = tradeService.placeMarketOrder(marketOrder);
System.out.println("Selling off " + triggerName + ": " + trigger.stopOrderId);
}
}
}
for (Trigger trigger : conf.buyTriggers) {
if (jump >= trigger.percent) {
System.out.println("Above " + trigger.percent + "%");
if (trigger.stopOrderId == null && sellTriggers.get(trigger.name).stopOrderId != null) {
OrderType orderType = (OrderType.BID);
BigDecimal tradeableAmount = new BigDecimal(trigger.size);
String tradableIdentifier = "BTC";
String transactionCurrency = "USD";
MarketOrder marketOrder = new MarketOrder(orderType, tradeableAmount, tradableIdentifier, transactionCurrency);
trigger.stopOrderId = tradeService.placeMarketOrder(marketOrder);
System.out.println("Buying back: " + trigger.name + ": " + trigger.stopOrderId);
}
}
}
if (last > hi) {
hi = last;
}
if (last < lo) {
lo = last;
}
Thread.sleep(1000);
}
}
}