// START SNIPPET: buy1sell1
import java.util.Timer;
import java.util.TimerTask;
import com.activequant.aqviz.BluntConsole;
import com.activequant.domainmodel.AlgoConfig;
import com.activequant.domainmodel.exceptions.IncompleteOrderInstructions;
import com.activequant.domainmodel.exceptions.UnsupportedOrderType;
import com.activequant.domainmodel.streaming.MarketDataSnapshot;
import com.activequant.domainmodel.streaming.StreamEvent;
import com.activequant.domainmodel.trade.order.MarketOrder;
import com.activequant.domainmodel.trade.order.OrderSide;
import com.activequant.interfaces.trading.ITradingSystem;
import com.activequant.trading.TradingSystemEnvironment;
/**
* This trading system buys 1, waits ten seconds and then sells one EUR/USD lot.
* When started, it waits for the next stream event. It then sends an order.
*
* @author GhostRider
*
*/
public class Buy1Sell1System implements ITradingSystem {
// let's create a blunt console.
BluntConsole console = new BluntConsole("Buy one, sell one trading system");
// opens a position.
boolean positionOpen = false;
boolean done = false;
MarketDataSnapshot lastQuote;
/**
* All events arrive here. For the type of different events, consult the jdocs.
*/
@Override
public void process(StreamEvent se) {
// if we are done already, leave and don't do anything.
if(done)return;
// ok, we are still here, so let's go.
console.addLog("********** Receiving an event.");
// we are only interested in market data snapshots.
if(se instanceof MarketDataSnapshot){
// we store the current price for reuse at some other time.
lastQuote = (MarketDataSnapshot)se;
// check if we sent our order already.
if(!positionOpen){
MarketOrder mo = new MarketOrder();
mo.setOrderSide(OrderSide.BUY);
mo.setQuantity(100000.0);
mo.setTradInstId("EUR/USD");
try {
env.getExchange().prepareOrder(mo).submit();
// no error handling in this simple example
// no position fill monitoring in this simple example
// plain vanilla.
positionOpen = true;
// schedule a callback for in five seconds.
new Timer().schedule(new TimerTask(){public void run() {closePosition();}}, 5000);
} catch (UnsupportedOrderType e) {
e.printStackTrace();
} catch (IncompleteOrderInstructions e) {
e.printStackTrace();
}
}
}
}
/**
* example method how to close a position.
*/
private void closePosition(){
console.addLog("----------- Closing position");
MarketOrder mo = new MarketOrder();
mo.setOrderSide(OrderSide.SELL);
mo.setQuantity(100000.0);
mo.setTradInstId("EUR/USD");
try {
env.getExchange().prepareOrder(mo).submit();
positionOpen = false;
done = true;
} catch (UnsupportedOrderType e) {
e.printStackTrace();
} catch (IncompleteOrderInstructions e) {
e.printStackTrace();
}
}
/////////////////////////////////////////////////////////////////
/////////////////COMMON FUNCTIONALITY BELOW. KEEP THIS ALWAYS. //
/////////////////////////////////////////////////////////////////
// pointer to the trading system environment. Store it.
private TradingSystemEnvironment env;
@Override
public void environment(TradingSystemEnvironment env) {
this.env = env;
}
@Override
public void initialize() throws Exception {
console.addLog("********** Initialized Buy1Sell1");
}
private boolean isRunning = false;
@Override
public void start() throws Exception {
console.addLog("********** Starting Buy1Sell1");
isRunning = true;
}
@Override
public void stop() throws Exception {
console.addLog("********** Stopping Buy1Sell1");
isRunning = false;
}
@Override
public boolean isRunning() {
return isRunning;
}
@Override
public AlgoConfig getAlgoConfig() {
return null;
}
}
//END SNIPPET: buy1sell1