예제 #1
0
        // Stock algo worker thread
        public static void BG_StockWorkerThread_SingleSymbol(object obj)
        {
            BrokerSymbolAlgosObject stockTraderObj      = (BrokerSymbolAlgosObject)obj;
            IBroker                           broker    = stockTraderObj.Broker;
            List <ITradingAlgo>               algos     = stockTraderObj.Algos;
            BrokerErrorCode                   errorCode = BrokerErrorCode.Success;
            EquitySymbolLiveTickGenerator     ETicks    = stockTraderObj.ETicks;
            DerivativeSymbolLiveTickGenerator DTicks    = stockTraderObj.DTicks;
            bool     isDayNewTicksStarted           = false;
            bool     isAnyAlgoSquareOffRetryPending = false;
            DateTime quoteTime;

            foreach (ITradingAlgo algo in algos)
            {
                algo.ErrorCode = algo.Prolog();
                if (algo.ErrorCode != BrokerErrorCode.Success)
                {
                    errorCode = algo.ErrorCode;
                }
            }

            do
            {
                errorCode = BrokerErrorCode.Success;

                foreach (ITradingAlgo algo in algos)
                {
                    if (algo.ErrorCode != BrokerErrorCode.Success)
                    {
                        algo.ErrorCode = algo.Prolog();
                        if (algo.ErrorCode != BrokerErrorCode.Success)
                        {
                            errorCode = algo.ErrorCode;
                        }
                    }
                }

                if (!errorCode.Equals(BrokerErrorCode.Success))
                {
                    Thread.Sleep(1000 * 30);
                }
            } while (!stockTraderObj.DoStopThread && !errorCode.Equals(BrokerErrorCode.Success));

            SymbolTick tick = new SymbolTick();

            tick.I = stockTraderObj.Instrument;

            while (!stockTraderObj.DoStopThread)
            {
                if (stockTraderObj.Instrument.InstrumentType == InstrumentType.Share)
                {
                    tick.E = ETicks.GetTick(false, out errorCode);
                }
                else
                {
                    tick.D = DTicks.GetTick(false, out errorCode);
                }

                if (!errorCode.Equals(BrokerErrorCode.Success))
                {
                    Thread.Sleep(1000);
                    continue;
                }

                if (stockTraderObj.Instrument.InstrumentType == InstrumentType.Share)
                {
                    quoteTime = tick.E.Q[0].QuoteTime;
                }
                else
                {
                    quoteTime = tick.D.Q.QuoteTime;
                }


                // to guard against previous day's ticks
                if (!isDayNewTicksStarted)
                {
                    isDayNewTicksStarted = quoteTime.Date == DateTime.Now.Date;

                    if (!isDayNewTicksStarted)
                    {
                        Thread.Sleep(10 * 1000);
                        continue;
                    }
                }

                // Main Algo
                foreach (ITradingAlgo algo in algos)
                {
                    if (!algo.DoStopAlgo)
                    {
                        algo.IsExternallySuspended = false;
                        algo.ErrorCode             = errorCode = algo.RunCoreAlgoLive(tick);
                        if (algo.IsOrderExecutionPending)
                        {
                            isAnyAlgoSquareOffRetryPending = true;
                        }
                    }
                    else
                    {
                        algo.IsExternallySuspended = true;
                    }
                }

                if (!isAnyAlgoSquareOffRetryPending)
                {
                    Thread.Sleep(stockTraderObj.TickIntervalInMiliSeconds);//algo.GetSleepTimeInMilliSecs());
                }
                isAnyAlgoSquareOffRetryPending = false;
            }

            foreach (ITradingAlgo algo in algos)
            {
                algo.ErrorCode = algo.Epilog();
            }

            if (stockTraderObj.Instrument.InstrumentType == InstrumentType.Share)
            {
                ETicks.Close();
            }
            else
            {
                DTicks.Close();
            }
        }
예제 #2
0
        // Stock algo worker thread
        public static void Background_StockWorkerThread(object obj)
        {
            BrokerErrorCode         errorCode      = BrokerErrorCode.Success;
            BrokerSymbolAlgosObject stockTraderObj = (BrokerSymbolAlgosObject)obj;
            IBroker broker = stockTraderObj.Broker;
            //EquityStockTradeStats stockInfo = stockTraderObj.stockInfo;
            ITradingAlgo algo = stockTraderObj.Algos[0];

            // Thread local params
            int threadRunCount  = 0;
            int threadFailCount = 0;

            //string stockCode = stockInfo.StockCode;
            string traceString;
            bool   bChecked = false;

            // On program re-run, cancel any previous outstanding orders
            // BUGBUGCD: is this infinite loop necessary or try only once
            // and come out on failure
            do
            {
                errorCode = algo.Prolog();
                if (!errorCode.Equals(BrokerErrorCode.Success))
                {
                    Thread.Sleep(1000 * 30);
                }
            } while (!stockTraderObj.DoStopThread && !errorCode.Equals(BrokerErrorCode.Success));


            while (!stockTraderObj.DoStopThread)
            {
                // Main Algo
                errorCode = algo.RunCoreAlgo();

                // thread stats
                if (!errorCode.Equals(BrokerErrorCode.Success))
                {
                    threadFailCount++;
                }
                threadRunCount++;

                // Check remote control
                //ProgramRemoteControl remoteControlValue = CheckRemoteControlInAlgo(ref bChecked);

                //if (remoteControlValue.Equals(ProgramRemoteControl.STOP) ||
                //       remoteControlValue.Equals(ProgramRemoteControl.HIBERNATE))
                //    break;

                // Check if login problem
                if (errorCode == BrokerErrorCode.NotLoggedIn)
                {
                    FileTracing.TraceOut("AlgoRunner: " + errorCode.ToString() + " Trying to login again\n");
                    // MGOYAL: TEMP SLEEP this is for external login to do some work .
                    // External logger will have 2 minute (CheckAndLoginIfNeeded) window to complete a work before he is logged out.
                    // Sleep for a minute

                    // It means someone has stolen session, so let it be. if they need for more time then will set remote to PAUSE
                    Thread.Sleep(120000);
                    broker.LogOut();
                    errorCode = broker.CheckAndLogInIfNeeded(true);
                    continue;
                }
                if (errorCode == BrokerErrorCode.InvalidLoginPassword || errorCode == BrokerErrorCode.ChangePassword)
                {
                    FileTracing.TraceOut("AlgoRunner: InvalidLoginPassword, Exiting");
                    break;
                }
                Thread.Sleep(algo.GetSleepTimeInMilliSecs());
            }

            errorCode = algo.Epilog();

            // Trace out Thread run stats
            // TODO: more such fancy stuff later

            traceString = string.Format("AlgoRunner: Thread Run Stats: \nTotalRuns: {0}\nFailures: {1}\nFailurePercentagH: {2}",
                                        threadRunCount, threadFailCount, (double)(threadFailCount / (threadRunCount > 0 ? threadRunCount : 1)) * 100);

            FileTracing.TraceOut(traceString);
        }