package org.cryptocoinpartners.service;
import java.util.Collection;
import java.util.Map;
import org.cryptocoinpartners.enumeration.ExecutionInstruction;
import org.cryptocoinpartners.enumeration.OrderState;
import org.cryptocoinpartners.exceptions.OrderNotFoundException;
import org.cryptocoinpartners.schema.Amount;
import org.cryptocoinpartners.schema.Fill;
import org.cryptocoinpartners.schema.GeneralOrder;
import org.cryptocoinpartners.schema.Market;
import org.cryptocoinpartners.schema.Order;
import org.cryptocoinpartners.schema.Portfolio;
import org.cryptocoinpartners.schema.SpecificOrder;
@Service
public interface OrderService {
// send new Order events to the correct market
public void placeOrder(Order order) throws Throwable;
void init();
public Collection<SpecificOrder> getPendingLongOpenOrders(Portfolio portfolio);
public Collection<SpecificOrder> getPendingLongCloseOrders(Portfolio portfolio);
public Collection<SpecificOrder> getPendingShortOpenOrders(Portfolio portfolio);
public Collection<SpecificOrder> getPendingShortCloseOrders(Portfolio portfolio);
public Collection<SpecificOrder> getPendingCloseOrders(Portfolio portfolio);
public Collection<SpecificOrder> getPendingShortCloseOrders(Portfolio portfolio, ExecutionInstruction execInst);
public Collection<SpecificOrder> getPendingLongCloseOrders(Portfolio portfolio, ExecutionInstruction execInst);
public Collection<SpecificOrder> getPendingOrders(Portfolio portfolio);
public Collection<Order> getPendingStopOrders(Portfolio portfolio);
public void handleCancelSpecificOrder(SpecificOrder specificOrder);
public void handleCancelGeneralOrder(GeneralOrder generalOrder);
public void handleCancelAllShortStopOrders(Portfolio portfolio, Market market);
public void handleCancelAllLongStopOrders(Portfolio portfolio, Market market);
public void handleCancelAllSpecificOrders(Portfolio portfolio, Market market);
public void adjustShortStopLoss(Amount price, Amount stopAdjustment, Boolean force);
public void adjustLongStopLoss(Amount price, Amount stopAdjustment, Boolean force);
public void adjustShortTargetPrices(Amount price, Amount targetAdjustment);
public void adjustLongTargetPrices(Amount price, Amount targetAdjustment);
// DO PLENTY OF LOGGING IN THIS METHOD
// initialize data interface with Xchange
// initialize order interface with Xchange
// if paper trade... then replace order interface with paper simulator
// if simulation... then replace both data and order interfaces with simulator
//
// if exchange is specified...
// send to exchange using order interface
// otherwise...
// use data interface to look at current order book for each market that has the listing
// guess at how much might fill on each market at what price
// sort the list of fill assumptions by best price
// create and submit one or more sub-orders to each market in the fill list
// - don't over-subscribe
// - do add a short auto-cancellation time (or shorter if specified on order)
// AKA reroute timeout
// retry routing periodically as books change vvvvv
// - add a timeout handler for markets that failed to fill where the sub-order has been canceled
// - this handler should try the next best market
// - this can be based on data from time of placement, or from the current data interface
public OrderState getOrderState(Order o);
void cancelOrder(Order order);
Collection<Order> getPendingOrders();
void handleCancelAllOpeningSpecificOrders(Portfolio portfolio, Market market);
void handleCancelAllLongOpeningSpecificOrders(Portfolio portfolio, Market market);
void handleCancelAllLongOpeningGeneralOrders(Portfolio portfolio, Market market);
void handleCancelAllShortOpeningSpecificOrders(Portfolio portfolio, Market market);
void handleCancelAllShortOpeningGeneralOrders(Portfolio portfolio, Market market);
void handleCancelAllClosingSpecificOrders(Portfolio portfolio, Market market);
void handleCancelAllLongClosingSpecificOrders(Portfolio portfolio, Market market, ExecutionInstruction execInst);
void handleCancelAllShortClosingSpecificOrders(Portfolio portfolio, Market market, ExecutionInstruction execInst);
Collection<SpecificOrder> getPendingOrders(Market market, Portfolio portfolio);
void setTradingEnabled(Boolean enableTrading);
boolean getTradingEnabled();
Order getPendingTriggerOrder(Order order);
void handleCancelSpecificOrderByParentFill(Fill parentFill) throws OrderNotFoundException;
void updateWorkingOrderQuantity(Order order, Amount quantity);
Collection<Order> getPendingShortStopOrders(Portfolio portfolio, Market market);
Collection<Order> getPendingLongStopOrders(Portfolio portfolio, Market market);
void handleCancelAllTriggerOrdersByParentFill(Fill parentFill);
public Map<Order, OrderState> getOrderStateMap();
Collection<SpecificOrder> cancelSpecificOrder(Collection<SpecificOrder> orders);
public Collection<Fill> getFills(Market market, Portfolio portfolio);
}