Advertisement
Guest User

Untitled

a guest
May 26th, 2015
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 15.56 KB | None | 0 0
  1. package ru.prolib.aquila.core.BusinessEntities;
  2.  
  3. import java.util.List;
  4.  
  5. import org.joda.time.DateTime;
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8.  
  9. import ru.prolib.aquila.core.*;
  10. import ru.prolib.aquila.core.BusinessEntities.CommonModel.*;
  11. import ru.prolib.aquila.core.BusinessEntities.utils.*;
  12. import ru.prolib.aquila.core.utils.*;
  13.  
  14. /**
  15.  * Basic terminal.
  16.  * <p>
  17.  * Basic terminal functionality implementation.
  18.   */
  19. public class BasicTerminal implements EditableTerminal {
  20.     private static Logger logger;
  21.     private volatile TerminalState state = TerminalState.STOPPED;
  22.     private final EventSystem es;
  23.     private final Securities securities;
  24.     private final Portfolios portfolios;
  25.     private final Orders orders;
  26.     private final StarterQueue starter;
  27.     private final Scheduler scheduler;
  28.     private final TerminalEventDispatcher dispatcher;
  29.     private final TerminalController controller;
  30.     private final OrderProcessor orderProcessor;
  31.    
  32.     static {
  33.         logger = LoggerFactory.getLogger(BasicTerminal.class);
  34.     }
  35.    
  36.     /**
  37.      * Constructor.
  38.      * <p>
  39.      * @param params - basic terminal constructor parameters
  40.      */
  41.     public BasicTerminal(BasicTerminalParams params) {
  42.         super();
  43.         this.controller = params.getController();
  44.         this.dispatcher = params.getEventDispatcher();
  45.         this.securities = params.getSecurityStorage();
  46.         this.portfolios = params.getPortfolioStorage();
  47.         this.orders = params.getOrderStorage();
  48.         this.starter = params.getStarter();
  49.         this.scheduler = params.getScheduler();
  50.         this.es = params.getEventSystem();
  51.         this.orderProcessor = params.getOrderProcessor();
  52.     }
  53.    
  54.     @Override
  55.     public OrderProcessor getOrderProcessor() {
  56.         return orderProcessor;
  57.     }
  58.    
  59.     @Override
  60.     public StarterQueue getStarter() {
  61.         return starter;
  62.     }
  63.    
  64.     @Override
  65.     public List<Security> getSecurities() {
  66.         return securities.getSecurities();
  67.     }
  68.  
  69.     @Override
  70.     public Security getSecurity(SecurityDescriptor descr)
  71.             throws SecurityException
  72.     {
  73.         return securities.getSecurity(descr);
  74.     }
  75.  
  76.     @Override
  77.     public boolean isSecurityExists(SecurityDescriptor descr) {
  78.         return securities.isSecurityExists(descr);
  79.     }
  80.  
  81.     @Override
  82.     public EventType OnSecurityAvailable() {
  83.         return securities.OnSecurityAvailable();
  84.     }
  85.  
  86.     @Override
  87.     public List<Portfolio> getPortfolios() {
  88.         return portfolios.getPortfolios();
  89.     }
  90.  
  91.     @Override
  92.     public Portfolio getPortfolio(Account account)
  93.             throws PortfolioException
  94.     {
  95.         return portfolios.getPortfolio(account);
  96.     }
  97.  
  98.     @Override
  99.     public boolean isPortfolioAvailable(Account account) {
  100.         return portfolios.isPortfolioAvailable(account);
  101.     }
  102.  
  103.     @Override
  104.     public EventType OnPortfolioAvailable() {
  105.         return portfolios.OnPortfolioAvailable();
  106.     }
  107.  
  108.     @Override
  109.     public synchronized void start() throws StarterException {
  110.         if ( state == TerminalState.STOPPED ) {
  111.             setTerminalState(TerminalState.STARTING);
  112.             logger.debug("Run start sequence");
  113.             controller.runStartSequence(this);
  114.         } else if ( state == TerminalState.STARTING
  115.                  || state == TerminalState.STOPPING )
  116.         {
  117.             logger.warn("start(): terminal in intermediate state: {}", state);
  118.         } else {
  119.             throw new StarterException("Cannot start terminal: " + state);
  120.         }
  121.     }
  122.  
  123.     @Override
  124.     public synchronized void stop() throws StarterException {
  125.         if (state == TerminalState.STARTED||state == TerminalState.CONNECTED) {
  126.             setTerminalState(TerminalState.STOPPING);
  127.             logger.debug("Run stop sequence");
  128.             controller.runStopSequence(this);
  129.         } else if ( state == TerminalState.STARTING
  130.                  || state == TerminalState.STOPPING )
  131.         {
  132.             logger.warn("stop(): terminal in intermediate state: {}", state);
  133.         } else {
  134.             throw new StarterException("Cannot stop terminal: " + state);
  135.         }
  136.     }
  137.  
  138.     @Override
  139.     public Portfolio getDefaultPortfolio()
  140.         throws PortfolioException
  141.     {
  142.         return portfolios.getDefaultPortfolio();
  143.     }
  144.  
  145.     @Override
  146.     public boolean isOrderExists(int id) {
  147.         return orders.isOrderExists(id);
  148.     }
  149.  
  150.     @Override
  151.     public List<Order> getOrders() {
  152.         return orders.getOrders();
  153.     }
  154.  
  155.     @Override
  156.     public Order getOrder(int id) throws OrderException {
  157.         return orders.getOrder(id);
  158.     }
  159.  
  160.     @Override
  161.     public EventType OnOrderAvailable() {
  162.         return orders.OnOrderAvailable();
  163.     }
  164.  
  165.     @Override
  166.     public void placeOrder(Order order) throws OrderException {
  167.         synchronized ( order ) {
  168.             OrderStatus status = order.getStatus();
  169.             EditableOrder o = (EditableOrder) order;
  170.             if ( status == OrderStatus.PENDING ) {
  171.                 OrderActivator activator = o.getActivator();
  172.                 if ( activator != null ) {
  173.                     activator.start(o);
  174.                     o.setStatus(OrderStatus.CONDITION);
  175.                     orders.fireEvents(o);
  176.                     return;
  177.                 }
  178.             } else if ( status == OrderStatus.CONDITION ) {
  179.                 order.getActivator().stop();
  180.             }
  181.             orderProcessor.placeOrder(this, order);
  182.         }
  183.     }
  184.  
  185.     @Override
  186.     public synchronized void cancelOrder(Order order) throws OrderException {
  187.         synchronized ( order ) {
  188.             EditableOrder o = (EditableOrder) order;
  189.             OrderStatus status = o.getStatus();
  190.             if ( status == OrderStatus.PENDING ) {
  191.                 o.setStatus(OrderStatus.CANCELLED);
  192.                 o.setLastChangeTime(getCurrentTime());
  193.                 orders.fireEvents(o);
  194.             } else if ( status == OrderStatus.CONDITION ) {
  195.                 o.getActivator().stop();
  196.                 o.setStatus(OrderStatus.CANCELLED);
  197.                 o.setLastChangeTime(getCurrentTime());
  198.                 orders.fireEvents(o);
  199.             } else {
  200.                 synchronized ( this ) {
  201.                     orderProcessor.cancelOrder(this, order);
  202.                 }
  203.             }
  204.         }
  205.     }
  206.  
  207.     @Override
  208.     public int getOrdersCount() {
  209.         return orders.getOrdersCount();
  210.     }
  211.  
  212.     @Override
  213.     public EventType OnOrderCancelFailed() {
  214.         return orders.OnOrderCancelFailed();
  215.     }
  216.  
  217.     @Override
  218.     public EventType OnOrderCancelled() {
  219.         return orders.OnOrderCancelled();
  220.     }
  221.  
  222.     @Override
  223.     public EventType OnOrderChanged() {
  224.         return orders.OnOrderChanged();
  225.     }
  226.  
  227.     @Override
  228.     public EventType OnOrderDone() {
  229.         return orders.OnOrderDone();
  230.     }
  231.  
  232.     @Override
  233.     public EventType OnOrderFailed() {
  234.         return orders.OnOrderFailed();
  235.     }
  236.  
  237.     @Override
  238.     public EventType OnOrderFilled() {
  239.         return orders.OnOrderFilled();
  240.     }
  241.  
  242.     @Override
  243.     public EventType OnOrderPartiallyFilled() {
  244.         return orders.OnOrderPartiallyFilled();
  245.     }
  246.  
  247.     @Override
  248.     public EventType OnOrderRegistered() {
  249.         return orders.OnOrderRegistered();
  250.     }
  251.  
  252.     @Override
  253.     public EventType OnOrderRegisterFailed() {
  254.         return orders.OnOrderRegisterFailed();
  255.     }
  256.  
  257.     @Override
  258.     public EventType OnSecurityChanged() {
  259.         return securities.OnSecurityChanged();
  260.     }
  261.  
  262.     @Override
  263.     public EventType OnSecurityTrade() {
  264.         return securities.OnSecurityTrade();
  265.     }
  266.  
  267.     @Override
  268.     public EventType OnPortfolioChanged() {
  269.         return portfolios.OnPortfolioChanged();
  270.     }
  271.  
  272.     @Override
  273.     public EventType OnPositionAvailable() {
  274.         return portfolios.OnPositionAvailable();
  275.     }
  276.  
  277.     @Override
  278.     public EventType OnPositionChanged() {
  279.         return portfolios.OnPositionChanged();
  280.     }
  281.  
  282.     @Override
  283.     public int getSecuritiesCount() {
  284.         return securities.getSecuritiesCount();
  285.     }
  286.  
  287.     @Override
  288.     public int getPortfoliosCount() {
  289.         return portfolios.getPortfoliosCount();
  290.     }
  291.  
  292.     @Override
  293.     public void fireEvents(EditableOrder order) {
  294.         orders.fireEvents(order);
  295.     }
  296.  
  297.     @Override
  298.     public EditableOrder getEditableOrder(int id)
  299.         throws OrderNotExistsException
  300.     {
  301.         return orders.getEditableOrder(id);
  302.     }
  303.  
  304.     @Override
  305.     public void purgeOrder(int id) {
  306.         orders.purgeOrder(id);
  307.     }
  308.  
  309.     @Override
  310.     public void fireEvents(EditablePortfolio portfolio) {
  311.         portfolios.fireEvents(portfolio);
  312.     }
  313.  
  314.     @Override
  315.     public EditablePortfolio getEditablePortfolio(Account account) {
  316.         return portfolios.getEditablePortfolio(this, account);
  317.     }
  318.  
  319.     @Override
  320.     public void setDefaultPortfolio(EditablePortfolio portfolio) {
  321.         portfolios.setDefaultPortfolio(portfolio);
  322.     }
  323.  
  324.     @Override
  325.     public EditableSecurity getEditableSecurity(SecurityDescriptor descr) {
  326.         return securities.getEditableSecurity(this, descr);
  327.     }
  328.  
  329.     @Override
  330.     public void fireEvents(EditableSecurity security) {
  331.         securities.fireEvents(security);
  332.     }
  333.  
  334.     @Override
  335.     public EventType OnConnected() {
  336.         return dispatcher.OnConnected();
  337.     }
  338.  
  339.     @Override
  340.     public EventType OnDisconnected() {
  341.         return dispatcher.OnDisconnected();
  342.     }
  343.  
  344.     @Override
  345.     public void fireTerminalConnectedEvent() {
  346.         markTerminalConnected();
  347.     }
  348.    
  349.     @Override
  350.     public synchronized void markTerminalConnected() {
  351.         if ( state == TerminalState.STARTED ) {
  352.             state = TerminalState.CONNECTED;
  353.             dispatcher.fireConnected(this);
  354.             logger.info("Terminal connected");
  355.         } else {
  356.             logger.debug("Skip connected event request cuz {}", state);
  357.         }      
  358.     }
  359.  
  360.     @Override
  361.     public void fireTerminalDisconnectedEvent() {
  362.         markTerminalDisconnected();
  363.     }
  364.    
  365.     @Override
  366.     public synchronized void markTerminalDisconnected() {
  367.         if ( state == TerminalState.CONNECTED
  368.           || state == TerminalState.STOPPING )
  369.         {
  370.             if ( state == TerminalState.CONNECTED ) {
  371.                 setTerminalState(TerminalState.STARTED);
  372.             }
  373.             dispatcher.fireDisconnected(this);
  374.             logger.info("Terminal disconnected");
  375.         } else {
  376.             logger.debug("Skip disconnected event request cuz {}", state);
  377.         }      
  378.     }
  379.    
  380.     @Override
  381.     public void fireTerminalStartedEvent() {
  382.         dispatcher.fireStarted();
  383.     }
  384.    
  385.     @Override
  386.     public void fireTerminalStoppedEvent() {
  387.         dispatcher.fireStopped();
  388.     }
  389.  
  390.     @Override
  391.     public EventType OnStarted() {
  392.         return dispatcher.OnStarted();
  393.     }
  394.  
  395.     @Override
  396.     public EventType OnStopped() {
  397.         return dispatcher.OnStopped();
  398.     }
  399.  
  400.     @Override
  401.     public EventType OnPanic() {
  402.         return dispatcher.OnPanic();
  403.     }
  404.  
  405.     @Override
  406.     public void firePanicEvent(int code, String msgId) {
  407.         firePanicEvent(code, msgId, new Object[] { });
  408.     }
  409.  
  410.     @Override
  411.     public void firePanicEvent(int code, String msgId, Object[] args) {
  412.         if ( started() ) {
  413.             logger.error("PANIC[" + code + "]: " + msgId, args);
  414.             dispatcher.firePanic(code, msgId, args);
  415.             try {
  416.                 stop();
  417.             } catch ( StarterException e ) {
  418.                 logger.error("Unexpected exception (ignore): ", e);
  419.             }
  420.         }
  421.     }
  422.  
  423.     @Override
  424.     public synchronized boolean stopped() {
  425.         return state == TerminalState.STOPPED;
  426.     }
  427.  
  428.     @Override
  429.     public synchronized boolean connected() {
  430.         return state == TerminalState.CONNECTED;
  431.     }
  432.    
  433.     @Override
  434.     public synchronized boolean started() {
  435.         return state == TerminalState.CONNECTED
  436.             || state == TerminalState.STARTED;
  437.     }
  438.  
  439.     @Override
  440.     public synchronized TerminalState getTerminalState() {
  441.         return state;
  442.     }
  443.  
  444.     @Override
  445.     public synchronized void setTerminalState(TerminalState state) {
  446.         logger.debug("Change terminal state to {}", state);
  447.         this.state = state;
  448.     }
  449.  
  450.     @Override
  451.     public DateTime getCurrentTime() {
  452.         return scheduler.getCurrentTime();
  453.     }
  454.  
  455.     @Override
  456.     public EventSystem getEventSystem() {
  457.         return es;
  458.     }
  459.  
  460.     @Override
  461.     public EditableOrder createOrder() {
  462.         return orders.createOrder(this);
  463.     }
  464.  
  465.     @Override
  466.     public EventType OnOrderTrade() {
  467.         return orders.OnOrderTrade();
  468.     }
  469.  
  470.     @Override
  471.     public Order createOrder(Account account, Direction dir, Security security,
  472.             long qty, double price)
  473.     {
  474.         return createOrder(account, dir, security, qty, price, null);
  475.     }
  476.  
  477.     @Override
  478.     public Order createOrder(Account account, Direction dir, Security security,
  479.             long qty)
  480.     {
  481.         return createOrder(account, dir, security, qty, null);
  482.     }
  483.    
  484.     @Override
  485.     public Order createOrder(Account account, Direction dir, Security security,
  486.             long qty, double price, OrderActivator activator)
  487.     {
  488.         EditableOrder order = createOrder();
  489.         order.setTime(getCurrentTime());
  490.         order.setType(OrderType.LIMIT);
  491.         order.setAccount(account);
  492.         order.setDirection(dir);
  493.         order.setSecurityDescriptor(security.getDescriptor());
  494.         order.setQty(qty);
  495.         order.setQtyRest(qty);
  496.         order.setPrice(price);
  497.         if ( activator != null ) {
  498.             order.setActivator(activator);
  499.         }
  500.         order.resetChanges();
  501.         orders.fireEvents(order);
  502.         return order;
  503.     }
  504.  
  505.     @Override
  506.     public Order createOrder(Account account, Direction dir, Security security,
  507.             long qty, OrderActivator activator)
  508.     {
  509.         EditableOrder order = createOrder();
  510.         order.setTime(getCurrentTime());
  511.         order.setType(OrderType.MARKET);
  512.         order.setAccount(account);
  513.         order.setDirection(dir);
  514.         order.setSecurityDescriptor(security.getDescriptor());
  515.         order.setQty(qty);
  516.         order.setQtyRest(qty);
  517.         if ( activator != null ) {
  518.             order.setActivator(activator);
  519.         }
  520.         order.resetChanges();
  521.         orders.fireEvents(order);
  522.         return order;
  523.     }
  524.  
  525.     @Override
  526.     public void requestSecurity(SecurityDescriptor descr) {
  527.        
  528.     }
  529.  
  530.     @Override
  531.     public EventType OnRequestSecurityError() {
  532.         return dispatcher.OnRequestSecurityError();
  533.     }
  534.  
  535.     @Override
  536.     public void fireSecurityRequestError(SecurityDescriptor descr,
  537.             int errorCode, String errorMsg)
  538.     {
  539.         dispatcher.fireSecurityRequestError(descr, errorCode, errorMsg);
  540.     }
  541.  
  542.     @Override
  543.     public TaskHandler schedule(Runnable task, DateTime time) {
  544.         return scheduler.schedule(task, time);
  545.     }
  546.  
  547.     @Override
  548.     public TaskHandler schedule(Runnable task, DateTime firstTime,
  549.             long period)
  550.     {
  551.         return scheduler.schedule(task, firstTime, period);
  552.     }
  553.  
  554.     @Override
  555.     public TaskHandler schedule(Runnable task, long delay) {
  556.         return scheduler.schedule(task, delay);
  557.     }
  558.  
  559.     @Override
  560.     public TaskHandler schedule(Runnable task, long delay, long period) {
  561.         return scheduler.schedule(task, delay, period);
  562.     }
  563.  
  564.     @Override
  565.     public TaskHandler scheduleAtFixedRate(Runnable task, DateTime firstTime,
  566.             long period)
  567.     {
  568.         return scheduler.scheduleAtFixedRate(task, firstTime, period);     
  569.     }
  570.  
  571.     @Override
  572.     public TaskHandler scheduleAtFixedRate(Runnable task, long delay,
  573.             long period)
  574.     {
  575.         return scheduler.scheduleAtFixedRate(task, delay, period);
  576.     }
  577.  
  578.     @Override
  579.     public void cancel(Runnable task) {
  580.         scheduler.cancel(task);
  581.     }
  582.    
  583.     @Override
  584.     public boolean scheduled(Runnable task) {
  585.         return scheduler.scheduled(task);
  586.     }
  587.  
  588.     @Override
  589.     public TaskHandler getTaskHandler(Runnable task) {
  590.         return scheduler.getTaskHandler(task);
  591.     }
  592.  
  593.     /**
  594.      * Получить планировщик задач.
  595.      * <p>
  596.      * @return планировщик
  597.      */
  598.     public Scheduler getScheduler() {
  599.         return scheduler;
  600.     }
  601.    
  602.     /**
  603.      * Получить контроллер терминала.
  604.      * <p>
  605.      * @return контроллер терминала
  606.      */
  607.     public TerminalController getTerminalController() {
  608.         return controller;
  609.     }
  610.    
  611.     /**
  612.      * Получить диспетчер событий терминала.
  613.      * <p>
  614.      * @return диспетчер событий
  615.      */
  616.     public TerminalEventDispatcher getTerminalEventDispatcher() {
  617.         return dispatcher;
  618.     }
  619.    
  620.     /**
  621.      * Получить хранилище инструментов.
  622.      * <p>
  623.      * @return хранилище инструментов
  624.      */
  625.     public Securities getSecurityStorage() {
  626.         return securities;
  627.     }
  628.    
  629.     /**
  630.      * Получить хранилище портфелей.
  631.      * <p>
  632.      * @return хранилище портфелей
  633.      */
  634.     public Portfolios getPortfolioStorage() {
  635.         return portfolios;
  636.     }
  637.    
  638.     /**
  639.      * Получить хранилище заявок.
  640.      * <p>
  641.      * @return хранилище заявок
  642.      */
  643.     public Orders getOrderStorage() {
  644.         return orders;
  645.     }
  646.  
  647.     @Override
  648.     public EventType OnReady() {
  649.         return dispatcher.OnReady();
  650.     }
  651.  
  652.     @Override
  653.     public EventType OnUnready() {
  654.         return dispatcher.OnUnready();
  655.     }
  656.  
  657.     @Override
  658.     public void fireTerminalReady() {
  659.         logger.debug("Terminal marked as ready");
  660.         dispatcher.fireReady();
  661.     }
  662.  
  663.     @Override
  664.     public void fireTerminalUnready() {
  665.         logger.debug("Terminal marked as unready");
  666.         dispatcher.fireUnready();
  667.     }
  668.  
  669.     @Override
  670.     public Counter getOrderIdSequence() {
  671.         return orders.getIdSequence();
  672.     }
  673.  
  674. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement