/*
* CheckOrdersTask.java
* StockPlay - Controleer of aan de voorwaarde van een order voldaan is en voert het dan uit.
*
* Copyright (c) 2010 StockPlay development team
* All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kapti.transactionmanager;
import com.kapti.client.finance.Quote;
import com.kapti.client.finance.Security;
import com.kapti.client.user.Order;
import com.kapti.client.user.OrderFactory;
import com.kapti.client.user.Transaction;
import com.kapti.client.user.TransactionFactory;
import com.kapti.exceptions.StockPlayException;
import com.kapti.transactionmanager.orderverifiers.Data;
import com.kapti.transactionmanager.orderverifiers.OrderVerifier;
import com.kapti.transactionmanager.orderverifiers.OrderVerifierFactory;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import org.apache.log4j.Logger;
/**
*
* \brief Controleer of aan de voorwaarde van een order voldaan is en voert het dan uit.
*
*/
public class CheckOrdersTask implements Runnable {
private static Logger logger = Logger.getLogger(CheckOrdersTask.class);
private static TransactionFactory transactionFactory = TransactionFactory.getInstance();
private static OrderVerifierFactory orderVerifierFactory = OrderVerifierFactory.getInstance();
private OrderFactory orderFactory = OrderFactory.getInstance();
private static Data data = Data.getReference();
public void run() {
try {
logger.info("Starting Orderprocessing");
// Data verkrijgen
Collection<Order> currentOrders = data.getCurrentOrders();
HashMap<Security, Quote> currentQuotes = data.getCurrentQuotes();
data.getData();
// We testen nu een voor een elk order of het voldoet, en voeren het uit indien dat het geval is
for (Order order : currentOrders) {
logger.info("Verifying order " + order.getId());
OrderVerifier verifier = orderVerifierFactory.getOrderVerifierByType(order.getType());
Quote quote = currentQuotes.get(order.getSecurity());
// if (verifier != null && verifier.verifyOrder(order, quote) &&
// (((order.getType() != Order.Type.BUY || order.getType() != Order.Type.IMMEDIATE_BUY)) &&
// order.getUser().getCash() > quote.getPrice() * order.getAmount())) {
if (
(verifier != null) &&
(verifier.verifyOrder(order) &&
(
(order.getType() == Order.Type.BRACKET_LIMIT_SELL || order.getType() == Order.Type.SELL || order.getType() == Order.Type.SELL_IMMEDIATE || order.getType() == Order.Type.STOP_LOSS_SELL || order.getType() == Order.Type.TRAILING_STOP_SELL))
||
(order.getUser().getCash() > quote.getPrice() * order.getAmount())
)
) {
// De voorwaarden om het order te kunnen uitvoeren zijn voldaan, we voeren het uit!
Transaction transaction = transactionFactory.createTransaction();
transaction.setUser(order.getUser());
transaction.setAmount(order.getAmount());
transaction.setSecurity(order.getSecurity());
transaction.setTime(new Date());
transaction.setComment("Execution of order " + order.getId());
transaction.setPrice(quote.getPrice());
if (order.getType() == Order.Type.BUY || order.getType() == Order.Type.BUY_IMMEDIATE || order.getType() == Order.Type.BRACKET_LIMIT_BUY || order.getType() == Order.Type.STOP_LOSS_BUY || order.getType() == Order.Type.TRAILING_STOP_BUY)
transaction.setType(Transaction.Type.BUY);
else
transaction.setType(Transaction.Type.SELL);
try {
if (transactionFactory.execute(transaction)) {
order.setStatus(Order.OrderStatus.EXECUTED);
logger.info("Order " + order.getId() + " was executed with transaction " + transaction.getId());
} else {
order.setStatus(Order.OrderStatus.FAILED);
logger.warn("Failed to execute order " + order.getId());
}
orderFactory.makePersistent(order);
// We passen de user aan in onze cache
order.getUser().setCash(order.getUser().getCash() - quote.getPrice() * order.getAmount());
} catch (StockPlayException ex) {
logger.error("Exception occured while executing order " + order.getId(), ex);
}
}
}
logger.info("Orderprocessing ended -- waiting for new call");
} catch(Exception ex) {
logger.error("Error while processings orders", ex);
}
}
}