Пример #1
0
        /// <summary>
        /// Called with every tick
        /// </summary>
        public override int OnTick()
        {
            if (CFATManager.isOnlineMode())
            {
                m_benchMarking.push_Ontick_start(DateTime.Now); //For bench marking
            }
            m_nTradeRet = ETRADE_RET.NONE;

            updateState();
            getRates();
            if (m_stState.m_nState == ELOGIC_STATE.NORMAL)
            {
                checkForClose();
                checkForOpen();
            }

            if (m_bIsOrderHappened && !m_bIsFirstThreadLive && !m_bIsSecondThreadLive)
            {
                setState(ELOGIC_STATE.NEED_CHECK_POSITION_MATCH);
                m_bIsOrderHappened = false;
            }

            publishToMQ();//For Manager

            if (CFATManager.isOnlineMode())
            {
                m_benchMarking.push_Ontick_end(DateTime.Now);   //For bench marking
            }
            base.OnTick();
            return((int)m_nTradeRet);
        }
Пример #2
0
        private void requestOrder(ETRADER_OP nCmd)
        {
            // modified by cmh
            if (ex_bAsyncOrder)
            {
                m_nCmd4Thread         = nCmd;
                m_bIsFirstThreadLive  = true;
                m_bIsSecondThreadLive = true;
                m_bIsOrderHappened    = true;
                m_products[_FIRST].m_site.setStatus(Site.CSite.SITE_STATUS.PROCESSING);
                m_products[_SECOND].m_site.setStatus(Site.CSite.SITE_STATUS.PROCESSING);
                Thread thFirstOrder  = new Thread(requestFirstSiteOrder);
                Thread thSecondOrder = new Thread(requestSecondSiteOrder);
                thFirstOrder.Start();
                thSecondOrder.Start();
                return;
            }
            // ---

            double dReqPrice_first  = 0;
            double dReqPrice_second = 0;
            double dLots            = ex_dLots;

            if (ex_nUseRandomLots == 1)
            {
                dLots = getRandomLots(dLots);
            }

            dLots += ex_dAddLots;

            int           nProfit_calc_01 = 0;
            int           nProfit_calc_02 = 0;
            EFILLED_STATE nRet;

            if ((nCmd == ETRADER_OP.BUY || nCmd == ETRADER_OP.SELL) && m_products[_FIRST].getPosCount_vt() == 0)
            {
                setParam_newOrder(ex_nIsNewOrder - 1);
            }

            if (nCmd == ETRADER_OP.BUY_CLOSE || nCmd == ETRADER_OP.SELL_CLOSE)
            {
                dLots = Math.Abs(m_products[_FIRST].getPosLots_vt(0));
            }

            if (dLots < CFATCommon.ESP)
            {
                CFATLogger.output_proc("*** Invalid Lots !!!, pls check virtual postion!!!!");
                dLots = ex_dLots;
            }

            if (nCmd == ETRADER_OP.BUY || nCmd == ETRADER_OP.SELL_CLOSE)
            {
                dReqPrice_first  = m_products[_FIRST].m_dAsk;
                dReqPrice_second = m_products[_SECOND].m_dBid;
                //dReqPrice_self = m_dAsk_First_low;
                nProfit_calc_01 = -1;
                nProfit_calc_02 = 1;
            }

            if (nCmd == ETRADER_OP.SELL || nCmd == ETRADER_OP.BUY_CLOSE)
            {
                dReqPrice_first  = m_products[_FIRST].m_dBid;
                dReqPrice_second = m_products[_SECOND].m_dAsk;
                //dReqPrice_self = m_dBid_First_high;
                nProfit_calc_01 = 1;
                nProfit_calc_02 = -1;
            }

            m_nTradeRet = ETRADE_RET.NEWORDER;

            nRet = m_products[_FIRST].reqOrder(nCmd, ref dLots, ref dReqPrice_first, EORDER_TYPE.MARKET);//First Order
            if (nRet == EFILLED_STATE.FULL)
            {
                m_tradeHistory.pushHistory(dReqPrice_first * nProfit_calc_01);
                dLots = getSecondLots(dLots);
                nRet  = m_products[_SECOND].reqOrder(TRADER.cmdOpposite(nCmd), ref dLots, ref dReqPrice_second, EORDER_TYPE.MARKET);
                if (nRet == EFILLED_STATE.FULL)
                {
                    m_tradeHistory.pushHistory(dReqPrice_second * nProfit_calc_02);
                    if (nCmd == ETRADER_OP.SELL_CLOSE || nCmd == ETRADER_OP.BUY_CLOSE)
                    {
                        m_tradeHistory.settleHistory();
                    }
                }
                else
                {
                    CFATLogger.output_proc("second order failed!");
                    m_tradeHistory.setProfitAsZero();
                    clearAllPositions();
                    setState(ELOGIC_STATE.WAITING_FORCE_CLOSE);
                    return;
                }
            }
            else
            {
                CFATLogger.output_proc("first order failed!");
            }

            setState(ELOGIC_STATE.NEED_CHECK_POSITION_MATCH);
            m_dtLastFilledTime = DateTime.Now;
        }