/// <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); }
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; }