public static void UpdateProfitLoss(SimpleLogger log, SignalFile signalFile, string pnl)
        {
            try
            {
                var sqlite_conn = CreateConnection();
                int result      = 0;

                var sql1 = $"REPLACE INTO profit_Loss VALUES ('{ signalFile.TradeDate}', '{signalFile.TradeDateTime}', '{signalFile.StrategyName}', '{pnl}'); ";

                using (SQLiteCommand sqlite_cmd1 = new SQLiteCommand(sql1, sqlite_conn))
                {
                    sqlite_cmd1.CommandText = sql1;
                    result = sqlite_cmd1.ExecuteNonQuery();
                }

                if (result > 0)
                {
                    log.Db("Successfully updated profit_Loss table.");
                }
                else
                {
                    log.Db("Failed to update profit_Loss table.");
                }

                sqlite_conn.Close();
            }
            catch (SQLiteException ex)
            {
                log.Trace("Error " + ex.Message.ToString());
            }
        }
Exemple #2
0
        public static void LoadPositions(Strategy strategy, Positions positions, SimpleLogger log)
        {
            foreach (string line in Positions.PositionList)
            {
                string symbol = SignalFile.GetWantedText(line, "Symbol:");

                if (strategy.Symbol == symbol)
                {
                    positions.IBSymbol = strategy.Symbol;
                    string pos = SignalFile.GetWantedText(line, "Position:");
                    positions.IBCurrentPosition = Convert.ToInt32(pos);
                    break;
                }
            }

            if (string.IsNullOrEmpty(positions.IBSymbol))
            {
                int strategyPosition = 0;//DBFunctions.GetCurrentStrategyPositionFromDB(log, strategy);

                Positions.SetIBPosition(strategy, strategyPosition, positions);

                log.Broker($"IB Position does not exist. Setting position for symbol: {strategy.Symbol}, position: {strategyPosition}");
                //log.Broker($"Using curr_Strategy_Position table for Positions Update. symbol: {strategy.Symbol}, position: {strategyPosition}");
            }
        }
        private void ValidateParsedDataForTrade(SignalFile signalFile)
        {
            const int _max = 1000000;
            Stopwatch s1   = Stopwatch.StartNew();

            DateTime tradeDateTime = Convert.ToDateTime(string.Format("{0:MM-dd-yyyy}", signalFile.TradeDateTime.Trim()), CultureInfo.CurrentCulture);
            string   entryDateTime = tradeDateTime.ToString("MM-dd-yyyy");

            if (signalFile.TradeDate == DateToday.Today && entryDateTime == DateToday.Today)
            {
                //Map TS symbol to IB symbol and set contract details
                FuturesContract futuresContract = new FuturesContract();
                futuresContract = futures.GetContractDetails(contract, futuresContract, signalFile);

                //Map TS strategies to strategies defined in application data list
                Strategy strategy = new Strategy(log);
                Strategy.GetStrategyId(futuresContract, strategy, signalFile, log);

                if (InitializeValues(strategy, signalFile))
                {
                    //Check if app is connected to IB Api and get current IB positions
                    Positions positions = new Positions();
                    broker.UpdateIBpositions(strategy, positions, log);

                    //Check last position for strategy in Position_Data table
                    Transactions transactions = new Transactions();
                    Transactions.CheckLastPositionDataFromDB(transactions, strategy, signalFile, log);

                    //Check if strategy has exceeded maximum position
                    //Tuple MaxTradeFlag, dbPosConflict, strategyCurrentPosition
                    Tuple <bool, bool, int> db = positions.GetMaxPosition(strategy, signalFile, transactions, positions, log, @params);

                    //Display transaction conflict message
                    Transactions.CheckLastTrade(signalFile, transactions, log, positions, db);

                    //Set lot size based on current IB position
                    OrderDetails orderDetails = new OrderDetails();
                    orderDetails = OrderDetails.GetLotSize(db, orderDetails, strategy, signalFile, positions);

                    //Check if a limit order was never filled at the Broker and cancel any open order(s)
                    //Tuple MaxTradeFlag, dbPosConflict, strategyCurrentPosition
                    if (db.Item2) //db.Item1 ||
                    {
                        bool allOpenOrder = false;
                        CancelOpenOrders(strategy, db.Item2, orderDetails, allOpenOrder);
                    }

                    //If trade is for today and less than max position excute order
                    ProcessSignalForTrade(futuresContract, signalFile, orderDetails, strategy, db, log);
                }
            }
            s1.Stop();
            string diag = string.Format("Processed Order in: " + (s1.Elapsed.TotalMilliseconds * 1000000 / _max).ToString("0.00 ns"));

            log.Info(diag);
        }
        private void UpdateDBTables(FuturesContract futuresContract, SignalFile signalFile, OrderDetails orderDetails, Strategy strategy, double limitPrice)
        {
            int currentPositionForDB = GetCurrentPositionForDB(orderDetails, strategy);

            DBFunctions.UpdatePositionDataToDb(log, futuresContract, signalFile, orderDetails, limitPrice);

            DBFunctions.UpdateStrategyPosition(log, currentPositionForDB, strategy, orderDetails);

            DBFunctions.CalculateProfitandLoss(log, strategy, signalFile);
        }
Exemple #5
0
 private static OrderDetails GetOrderSide(SignalFile signalFile, OrderDetails orderDetails)
 {
     if (signalFile.Signal == -1)
     {
         orderDetails.SideText  = "SHORT";
         orderDetails.BuyOrSell = "SELL";
     }
     else
     {
         orderDetails.SideText  = "LONG";
         orderDetails.BuyOrSell = "BUY";
     }
     return(orderDetails);
 }
        private double GetPrices(FuturesContract futuresContract, SignalFile signalFile, Strategy strategy, OrderDetails orderDetails, Prices prices, Tuple <bool, bool, int> db)
        {
            double limitPrice = 0;

            if (prices.BidPrice > 0 && prices.AskPrice > 0)
            {
                limitPrice = GetBrokerLimitPrice(futuresContract, orderDetails, prices, strategy, db, signalFile);
            }
            else if (limitPrice <= 0)
            {
                limitPrice = GetSignalFileLimitPrice(futuresContract, orderDetails, signalFile, strategy, db);
            }

            return(limitPrice);
        }
        public static void CheckLastTrade(SignalFile signalFile, Transactions transactions, SimpleLogger log, Positions positions, Tuple <bool, bool, int> db)
        {
            if (db.Item1)
            {
                log.Warning($"Trying to Exceed Max Position. No order sent for {signalFile.Output}");
            }

            if (signalFile.Signal == 1 && transactions.LastTradeSide == 1 && positions.IBCurrentPosition > 0 && signalFile.StrategyName == transactions.Strategy)
            {
                log.Warning($"Last order sent in db was a BUY for {signalFile.Output}");
            }

            if (signalFile.Signal == -1 && transactions.LastTradeSide == -1 && positions.IBCurrentPosition < 0 && signalFile.StrategyName == transactions.Strategy)
            {
                log.Warning($"Last order sent in db was a SELL for {signalFile.Output}");
            }
        }
        public double GetProfitTicks(Strategy strategy, SignalFile signalFile)
        {
            double profitTicks = 0;

            if (strategy.Symbol == "QM")
            {
                if (signalFile.Adx < 15)
                {
                    profitTicks = .35;
                    return(profitTicks);
                }
                else
                {
                    profitTicks = 1.00;
                    return(profitTicks);
                }
            }
            else if (strategy.Symbol == "MES")
            {
                if (signalFile.Adx < 15)
                {
                    profitTicks = @params.@sp500ProfitOne;
                    return(profitTicks);
                }
                else
                {
                    profitTicks = @params.@sp500ProfitTwo;
                    return(profitTicks);
                }
            }
            else if (strategy.Symbol == "MGC")
            {
                if (signalFile.Adx < 15)
                {
                    profitTicks = 5.00;
                    return(profitTicks);
                }
                else
                {
                    profitTicks = 15.00;
                    return(profitTicks);
                }
            }
            return(profitTicks);
        }
Exemple #9
0
        public Tuple <bool, int> ComparePositionAtIBandDB(Strategy strategy, SignalFile signalFile, Positions positions, SimpleLogger log, Parameters @params)
        {
            bool dbPosConflict = false;

            int dbPosition = DBFunctions.GetCurrentStrategyPositionFromDB(log, strategy);

            if (dbPosition != positions.IBCurrentPosition && signalFile.StrategyName == strategy.StrategyName)
            {
                string slackMsg = $"*[POSITION CONFLICT]* *{strategy.StrategyName}* curr_Strategy_Position table:*{dbPosition}* and IB:*{IBCurrentPosition}*";

                dbPosConflict = true;

                log.Warning(slackMsg);

                slack.SendMessageToSlack(slackMsg, @params);
            }
            return(new Tuple <bool, int>(dbPosConflict, dbPosition));
        }
Exemple #10
0
        private double CalculateMaxPosition(double position, Strategy strategy, SignalFile signalFile, Transactions transactions, SimpleLogger log)
        {
            double calculatedMaxPosition = 0;

            if (signalFile.Signal == transactions.LastTradeSide)
            {
                calculatedMaxPosition = (position + strategy.StrategyMaxPosition);
            }
            else if (signalFile.Signal != transactions.LastTradeSide)
            {
                calculatedMaxPosition = (strategy.StrategyMaxPosition - position);
            }
            else if (transactions.LastTradeSide == 0)
            {
                calculatedMaxPosition = (strategy.StrategyMaxPosition - position);
            }

            log.Warning($"signalFile.Signal:{signalFile.Signal} transactions.LastTradeSide:{transactions.LastTradeSide} position:{position} strategy.StrategyMaxPosition:{strategy.StrategyMaxPosition} calculatedMaxPosition:{calculatedMaxPosition}");

            return(calculatedMaxPosition);
        }
Exemple #11
0
        private void ProcessSignalForTrade(FuturesContract futuresContract, SignalFile signalFile, OrderDetails orderDetails, Strategy strategy, Tuple <bool, bool, int> db, SimpleLogger log)
        {
            if (!db.Item1 && [email protected])
            {
                slack.SendMessageToSlack($"[*{strategy.Symbol} {orderDetails.BuyOrSell}]*\n*{signalFile.LastFileLine}*", @params);

                //Cancel any open orders
                bool dbconflict   = false;
                bool allOpenOrder = true;
                CancelOpenOrders(strategy, dbconflict, orderDetails, allOpenOrder);

                //Send order to Broker
                double limitPrice = ExecuteOrder(futuresContract, signalFile, orderDetails, strategy, log, db);

                //Used to check order status @ Broker
                //CheckOrderStatus();

                //Update db with executed strategy order
                UpdateDBTables(futuresContract, signalFile, orderDetails, strategy, limitPrice);
            }
        }
Exemple #12
0
        private bool InitializeValues(Strategy strategy, SignalFile signalFile)
        {
            if (strategy.Symbol == "QM" && strategy.Status) //@params.crudeEnabled)
            {
                return(true);
            }
            if (strategy.Symbol == "MES" && strategy.Status) //@params.sp500Enabled)
            {
                return(true);
            }
            if (strategy.Symbol == "MGC" && strategy.Status) //@params.goldEnabled)
            {
                return(true);
            }

            log.Warning($"{strategy.StrategyName} is disabled.");

            string side = (signalFile.Signal == 1) ? "BUY" : "SELL";

            slack.SendMessageToSlack($"[*{strategy.StrategyName} {side}. Disabled]*\n*{signalFile.LastFileLine}*", @params);
            return(false);
        }
Exemple #13
0
        private string OverNight(SignalFile signalFile, Tuple <bool, bool, int> db)
        {
            string orderType = null;

            TimeSpan time = DateTime.Now.TimeOfDay;

            if (db.Item3 != 0)
            {
                if (time > new TimeSpan(00, 00, 00) && time < new TimeSpan(08, 00, 00))   //Hours, Minutes, Seconds
                {
                    orderType = "MKT";
                }
                else if (time > new TimeSpan(22, 00, 00) && time < new TimeSpan(23, 59, 59))
                {
                    orderType = "MKT";
                }
                //else if (time > new TimeSpan(18, 00, 00) && time < new TimeSpan(23, 59, 59))
                //{
                //    orderType = "MKT";
                //}
            }
            return(orderType);
        }
Exemple #14
0
        public static OrderDetails GetLotSize(Tuple <bool, bool, int> db, OrderDetails orderDetails, Strategy strategy, SignalFile signalFile, Positions positions)
        {
            int signalDirection = signalFile.Signal;
            //int tradeDirection;

            int strategyCurrentPosition = db.Item3;

            //Trade direction
            //if (strategyCurrentPosition > 0 && signalDirection < 0)
            //{
            //    tradeDirection = -1;
            //}
            //else if (strategyCurrentPosition < 0 && signalDirection > 0)
            //{
            //    tradeDirection = 1;
            //}
            //else if (strategyCurrentPosition < 0 && signalDirection < 0)
            //{
            //    tradeDirection = -1;
            //}
            //else if (strategyCurrentPosition > 0 && signalDirection > 0)
            //{
            //    tradeDirection = 1;
            //}
            //else
            //{
            //    tradeDirection = signalFile.Signal;
            //}

            if (positions.IBSymbol == strategy.Symbol && signalFile.StrategyName == strategy.StrategyName)
            {
                switch (signalFile.Exit)
                {
                case "0":
                    if (strategyCurrentPosition > 0 && strategyCurrentPosition != 0 && signalDirection < 0)
                    {
                        orderDetails.LotSize = (strategy.LotSize * 2);
                    }
                    else if (strategyCurrentPosition < 0 && strategyCurrentPosition != 0 && signalDirection > 0)
                    {
                        orderDetails.LotSize = (strategy.LotSize * 2);
                    }
                    else if (strategyCurrentPosition != 0)
                    {
                        orderDetails.LotSize = strategy.LotSize;
                    }
                    else
                    {
                        orderDetails.LotSize = strategy.LotSize;
                    }
                    break;

                case "1":
                    //if (strategyCurrentPosition > 0 && signalDirection != tradeDirection)
                    //{
                    //    orderDetails.LotSize = strategy.LotSize;
                    //}
                    //else if (strategyCurrentPosition < 0 && signalDirection != tradeDirection)
                    //{
                    //    orderDetails.LotSize = strategy.LotSize;
                    //}
                    //else
                    //{
                    orderDetails.LotSize = strategy.LotSize;
                    //}
                    break;
                }
            }
            else if (string.IsNullOrEmpty(positions.IBSymbol) && strategyCurrentPosition == 0)
            {
                orderDetails.LotSize = strategy.LotSize;
            }

            GetOrderSide(signalFile, orderDetails);

            return(orderDetails);
        }
Exemple #15
0
        private void MonitorSignalFile()
        {
            long initialFileSize = new FileInfo(@params.filePath).Length;
            long lastReadLength  = initialFileSize - 1024;

            if (lastReadLength < 0)
            {
                lastReadLength = 0;
            }

            while (true)
            {
                try
                {
                    long fileSize = new FileInfo(@params.filePath).Length;

                    TimeSpan time = DateTime.Now.TimeOfDay;

                    if (time > new TimeSpan(00, 50, 00) && time < new TimeSpan(00, 50, 15))   //Hours, Minutes, Seconds
                    {
                        break;
                    }

                    if (fileSize > lastReadLength)
                    {
                        using (FileStream fs = new FileStream(@params.filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                        {
                            fs.Seek(lastReadLength, SeekOrigin.Begin);
                            byte[] buffer = new byte[1024];

                            while (true)
                            {
                                DateToday.Today = DateTime.Today.ToString("MM-dd-yyyy");

                                int bytesRead = fs.Read(buffer, 0, buffer.Length);
                                lastReadLength += bytesRead;

                                if (bytesRead == 0)
                                {
                                    break;
                                }

                                string[]      lines;
                                List <string> list       = new List <string>();
                                FileStream    fileStream = new FileStream(@params.filePath, FileMode.Open, FileAccess.Read);

                                using (StreamReader streamReader = new StreamReader(fileStream, Encoding.UTF8))
                                {
                                    string line;
                                    while ((line = streamReader.ReadLine()) != null)
                                    {
                                        list.Add(line);
                                    }
                                }

                                SignalFile signalFile = new SignalFile();

                                lines = list.ToArray();
                                signalFile.LastFileLine = lines.Last().ToString();

                                log.Signal($"[RAW DATA] {signalFile.LastFileLine}");

                                //Parse signal file data for trade validation
                                signalFile = SignalFile.ParseSignalFile(signalFile, log);

                                //Validate signal and process order if valid
                                ValidateParsedDataForTrade(signalFile);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    log.Trace(ex.Message.ToString());
                    log.Trace(ex.StackTrace.ToString());
                }

                Thread.Sleep(TimeSpan.FromSeconds(2));
            }

            //Restart App after IB Trader Workstation does its daily restart
            broker.RestartProgram();
        }
Exemple #16
0
        public Tuple <bool, bool, int> GetMaxPosition(Strategy strategy, SignalFile signalFile, Transactions transactions, Positions positions, SimpleLogger log, Parameters @params)
        {
            bool   MaxTradeFlag = true;
            bool   maxPosFlag;
            double _position;

            Tuple <bool, int> db = ComparePositionAtIBandDB(strategy, signalFile, positions, log, @params);

            bool   dbPosConflict           = db.Item1;
            int    strategyCurrentPosition = db.Item2;
            double calculatedMaxPosition;

            //Converting position to positive number to validate if the number exceeds the max number for the strategy maximum position(s)
            if (!dbPosConflict)
            {
                _position             = (strategyCurrentPosition < 0) ? -1 * strategyCurrentPosition : strategyCurrentPosition;
                calculatedMaxPosition = CalculateMaxPosition(_position, strategy, signalFile, transactions, log);
            }
            else
            {
                _position = (positions.IBCurrentPosition < 0) ? -1 * positions.IBCurrentPosition : positions.IBCurrentPosition;

                if (dbPosConflict)//if dbconflict then the position in the database must be incorrect and last trade was never filled
                {
                    if (positions.IBCurrentPosition > 0)
                    {
                        transactions.LastTradeSide = 1;
                    }
                    else if (positions.IBCurrentPosition < 0)
                    {
                        transactions.LastTradeSide = -1;
                    }

                    strategyCurrentPosition = positions.IBCurrentPosition;

                    log.Warning($"Positions conflict. Using IB Position for last trade side: {transactions.LastTradeSide}");
                }

                calculatedMaxPosition = CalculateMaxPosition(_position, strategy, signalFile, transactions, log);
            }

            if (calculatedMaxPosition > strategy.StrategyMaxPosition && calculatedMaxPosition >= strategy.MaxPositionForSymbol)
            {
                maxPosFlag = true;

                log.Warning($"{signalFile.StrategyName} is trying to Exceed Strategy Max Position of {strategy.StrategyMaxPosition}.");
            }
            else if (calculatedMaxPosition <= strategy.StrategyMaxPosition)
            {
                maxPosFlag = false;
            }
            else
            {
                maxPosFlag = false;
            }
            log.Warning($"{signalFile.StrategyName} dbPosConflict:{dbPosConflict} MaxTradeFlag:{MaxTradeFlag} calculatedMaxPosition:{calculatedMaxPosition} strategy.StrategyMaxPosition:{strategy.StrategyMaxPosition} strategy.MaxPositionForSymbol:{strategy.MaxPositionForSymbol}");

            if (signalFile.StrategyName == strategy.StrategyName && !maxPosFlag && strategyCurrentPosition != 0)
            {
                switch (signalFile.Signal)
                {
                case 1:
                    if (strategyCurrentPosition < 0)
                    {
                        MaxTradeFlag = false;
                    }
                    else if (strategyCurrentPosition > 0 && _position <= strategy.MaxPositionForSymbol)
                    {
                        MaxTradeFlag = false;
                    }
                    break;

                case -1:
                    if (strategyCurrentPosition > 0)
                    {
                        MaxTradeFlag = false;
                    }
                    else if (strategyCurrentPosition < 0 && _position <= strategy.MaxPositionForSymbol)
                    {
                        MaxTradeFlag = false;
                    }
                    break;
                }
            }
            else if (strategyCurrentPosition == 0)
            {
                MaxTradeFlag = false;
            }

            return(new Tuple <bool, bool, int>(MaxTradeFlag, dbPosConflict, strategyCurrentPosition));
        }
Exemple #17
0
        private bool CancelOpenOrders(Strategy strategy, bool dbconflict, OrderDetails orderDetails, bool allOpenOrder)
        {
            bool openOrderstatus = false;

            OpenOrder.OpenOrderFlag = false;
            int cnt = 0;

            if (strategy.OrderType == "LMT")
            {
                OpenOrder.OpenOrderList.DataList.Clear();

                clientSocket.reqAllOpenOrders();

                while (!OpenOrder.OpenOrderFlag)
                {
                    if (OpenOrder.OpenOrderFlag)
                    {
                        break;
                    }

                    if (cnt > @params.maxLoopCount)
                    {
                        log.Warning("[IB WARNING] Could not update IB Open Order.");
                        break;
                    }

                    log.Warning($"Waiting for IB Open Order to Update. Try # {cnt}");
                    cnt++;
                }

                List <int> cancelList = new List <int>();

                foreach (string openOrder in OpenOrder.OpenOrderList.DataList)
                {
                    OpenOrder.Symbol     = SignalFile.GetWantedText(openOrder, "Symbol:");
                    OpenOrder.OrderId    = SignalFile.GetWantedText(openOrder, "Id:");
                    OpenOrder.OrderState = SignalFile.GetWantedText(openOrder, "OrderState:");
                    OpenOrder.Action     = SignalFile.GetWantedText(openOrder, "Action:");

                    if (allOpenOrder && OpenOrder.Symbol == strategy.Symbol && OpenOrder.OrderState.Contains("Submit"))
                    {
                        int id = Convert.ToInt32(OpenOrder.OrderId);
                        cancelList.Add(id);
                    }
                    else if (dbconflict && OpenOrder.Action == orderDetails.BuyOrSell && OpenOrder.Symbol == strategy.Symbol && OpenOrder.OrderState.Contains("Submit"))
                    {
                        int id = Convert.ToInt32(OpenOrder.OrderId);
                        cancelList.Add(id);
                    }
                    else if (!dbconflict && OpenOrder.Symbol == strategy.Symbol && OpenOrder.OrderState.Contains("Submit"))
                    {
                        int id = Convert.ToInt32(OpenOrder.OrderId);
                        cancelList.Add(id);
                    }
                }

                if (cancelList.Count() > 0)
                {
                    foreach (int id in cancelList)
                    {
                        clientSocket.cancelOrder(id);
                        log.Warning($"Cancelling open order for {strategy.StrategyName} OrderId: {id}.");
                        openOrderstatus = true;
                    }
                }
            }

            return(openOrderstatus);
        }
        public static void UpdatePositionDataToDb(SimpleLogger log, FuturesContract futuresContract, SignalFile signalFile, OrderDetails orderDetails, double limitPrice)
        {
            try
            {
                var sqlite_conn = CreateConnection();

                SQLiteCommand sqlite_cmd;
                sqlite_cmd             = sqlite_conn.CreateCommand();
                sqlite_cmd.CommandText = "INSERT INTO Position_Data" +
                                         " VALUES (  '" + signalFile.TradeDate +
                                         "','" + signalFile.TradeDateTime +
                                         "','" + orderDetails.OrderId +
                                         "','" + signalFile.StrategyName +
                                         "','" + futuresContract.Exchange +
                                         "','" + orderDetails.BuyOrSell +
                                         "','" + orderDetails.OrderStatus +
                                         "'," + limitPrice.ToString("0." + new string('#', 20)) +
                                         ");";
                int result = sqlite_cmd.ExecuteNonQuery();

                if (result > 0)
                {
                    log.Db("Successfully updated Position_Data table.");
                }
                else
                {
                    log.Db("Failed to update Position_Data table.");
                }

                sqlite_conn.Close();
            }
            catch (SQLiteException ex)
            {
                log.Trace("Error " + ex.Message.ToString());
                log.Trace(ex.StackTrace.ToString());
            }
        }
        public static void CalculateProfitandLoss(SimpleLogger log, Strategy strategy, SignalFile signalFile)
        {
            var sqlite_conn = CreateConnection();

            List <string> results = new List <string>();
            string        amt;
            string        side;

            SQLiteCommand sqlite_cmd;

            //var sqlCmd = $"SELECT Side, Amount FROM (SELECT * FROM Position_Data WHERE Strategy = {signalFile.StrategyName} ORDER BY OrderId DESC LIMIT 2)ORDER BY OrderId ASC;";
            var sqlCmd = $"SELECT Side, Amount FROM Position_Data where Strategy = '{signalFile.StrategyName}' LIMIT 2 OFFSET(SELECT COUNT(*) FROM Position_Data WHERE Strategy = '{signalFile.StrategyName}') - 2;";

            sqlite_cmd             = sqlite_conn.CreateCommand();
            sqlite_cmd.CommandText = sqlCmd;

            using (SQLiteDataReader sqlite_datareader = sqlite_cmd.ExecuteReader())
            {
                while (sqlite_datareader.Read())
                {
                    side = (string)sqlite_datareader["Side"];
                    decimal t = (decimal)sqlite_datareader["Amount"];
                    amt = Convert.ToString(t);
                    results.Add(side);
                    results.Add(amt);
                }
            }
            sqlite_conn.Close();

            if (results.Count > 2)
            {
                string side1 = results[0];
                //string side2 = results[2];

                decimal amt1       = Convert.ToDecimal(results[1]);
                decimal amt2       = Convert.ToDecimal(results[3]);
                int     multiplier = GetMultiplier(strategy);

                decimal proftLoss = (side1 == "BUY") ? ((amt2 - amt1) * multiplier) : ((amt1 - amt2) * multiplier);

                proftLoss *= strategy.LotSize;
                string pnl = string.Format("{0:C2}", proftLoss);

                string type = (side1 == "BUY") ? " Long " : " Short ";

                string msg = string.Format(signalFile.StrategyName + type + "trade Pnl: {0:C2} ", proftLoss);

                log.Info(msg);
                UpdateProfitLoss(log, signalFile, pnl);
            }
        }
Exemple #20
0
        private double GetSignalFileLimitPrice(FuturesContract futuresContract, OrderDetails orderDetails, SignalFile signalFile, Strategy strategy, Tuple <bool, bool, int> db)
        {
            double tick;
            double limitPrice = signalFile.LimitPrice;

            switch (strategy.Symbol)
            {
            case "QM":
                tick = FuturesContract.GetTickSize(futuresContract);
                decimal nearOf = 0.025M;

                //tick *= (signalFile.EMAAngle < 40 && signalFile.EMAAngle > -40) ? @params.crudeSpread : 4;
                tick *= (signalFile.Trend < 40) ? @params.crudeSpread : 4;

                if (orderDetails.BuyOrSell == "BUY")
                {
                    limitPrice -= tick;
                }
                else if (orderDetails.BuyOrSell == "SELL")
                {
                    limitPrice += tick;
                }

                decimal _limitPrice = Convert.ToDecimal(limitPrice);
                _limitPrice = Precision.UltimateRoundingFunction(_limitPrice, nearOf, 0.49M);
                limitPrice  = Convert.ToDouble(_limitPrice);

                return(limitPrice);

            case "MES":
                tick  = FuturesContract.GetTickSize(futuresContract);
                tick *= (signalFile.EMAAngle <40 && signalFile.EMAAngle> -40) ? @params.sp500Spread : @params.sp500Spread / 2;

                if (signalFile.Adx < 15)
                {
                    if (orderDetails.BuyOrSell == "BUY")
                    {
                        limitPrice -= tick;
                    }
                    else if (orderDetails.BuyOrSell == "SELL")
                    {
                        limitPrice += tick;
                    }
                }

                return(limitPrice);

            case "MGC":
                tick = FuturesContract.GetTickSize(futuresContract);

                if (signalFile.Adx < 15)
                {
                    tick *= 1;

                    if (orderDetails.BuyOrSell == "BUY")
                    {
                        limitPrice -= tick;
                        return(limitPrice);
                    }
                    else if (orderDetails.BuyOrSell == "SELL")
                    {
                        limitPrice += tick;
                        return(limitPrice);
                    }
                }
                else
                {
                    tick *= 2;

                    if (orderDetails.BuyOrSell == "BUY")
                    {
                        limitPrice += tick;
                        return(limitPrice);
                    }
                    else if (orderDetails.BuyOrSell == "SELL")
                    {
                        limitPrice -= tick;
                        return(limitPrice);
                    }
                }

                break;
            }
            return(limitPrice);
        }
Exemple #21
0
        private double GetBrokerLimitPrice(FuturesContract futuresContract, OrderDetails orderDetails, Prices prices, Strategy strategy, Tuple <bool, bool, int> db, SignalFile signalFile)
        {
            double tick       = FuturesContract.GetTickSize(futuresContract);
            double limitPrice = 0;

            switch (strategy.Symbol)
            {
            case "QM":
                //tick *= (db.Item3 == 0 || db.Item3 != 0) ? @params.crudeSpread : 1;
                //if (signalFile.Macd == 1)
                //{
                //    tick *= (signalFile.Trend < 40 && orderDetails.BuyOrSell == "SELL") ? @params.crudeSpread : 4;
                //}
                //else if (signalFile.Macd == 2)
                //{
                //    tick *= (signalFile.Trend < 40 && orderDetails.BuyOrSell == "SELL") ? @params.crudeSpread : 3;
                //}
                //if (signalFile.Macd == -1)
                //{
                //    tick *= (signalFile.Trend < 40 && orderDetails.BuyOrSell == "BUY") ? @params.crudeSpread : 4;
                //}
                //else if (signalFile.Macd == -2)
                //{
                //    tick *= (signalFile.Trend < 40 && orderDetails.BuyOrSell == "BUY") ? @params.crudeSpread : 3;
                //}

                if (orderDetails.BuyOrSell == "BUY")
                {
                    //If Up trend than our bid is spread = 2 and offer is  @params.crudeSpread = 5
                    //tick *= (signalFile.EMAAngle < 40 && signalFile.EMAAngle > -40) ? @params.crudeSpread : 8;
                    tick *= (signalFile.Trend < 40) ? @params.crudeSpread : 4;

                    limitPrice  = Math.Min(prices.BidPrice, signalFile.LimitPrice);    //prices.BidPrice;
                    limitPrice -= tick;
                }
                else if (orderDetails.BuyOrSell == "SELL")
                {
                    //If Down trend than our offer is spread = 2 and out bid is @params.crudeSpread = 5
                    //tick *= (signalFile.EMAAngle < 40 && signalFile.EMAAngle > -40) ? @params.crudeSpread : 8;
                    tick *= (signalFile.Trend < 40) ? @params.crudeSpread : 4;

                    limitPrice  = Math.Max(prices.AskPrice, signalFile.LimitPrice);    //prices.AskPrice;
                    limitPrice += tick;
                }
                return(limitPrice);

            case "MES":
                //tick *= (db.Item3 == 0 || db.Item3 != 0) ? @params.sp500Spread : 1;
                //tick *= (signalFile.EMAAngle < 40 && signalFile.EMAAngle > -40) ? @params.sp500Spread : @params.sp500Spread ;
                tick *= (signalFile.Trend < 40) ? @params.sp500Spread : 5;

                if (orderDetails.BuyOrSell == "BUY")
                {
                    limitPrice  = Math.Min(prices.BidPrice, signalFile.LimitPrice);
                    limitPrice -= tick;
                }
                else if (orderDetails.BuyOrSell == "SELL")
                {
                    limitPrice  = Math.Max(prices.AskPrice, signalFile.LimitPrice);
                    limitPrice += tick;
                }
                return(limitPrice);
            }
            return(limitPrice);
        }
        public static Transactions CheckLastPositionDataFromDB(Transactions transactions, Strategy strategy, SignalFile signalFile, SimpleLogger log)
        {
            string[] dbResults;

            if (signalFile.StrategyName != strategy.StrategyName)
            {
                log.Warning($"Strategy {signalFile.StrategyName} does exist in Position_Data table.");
            }
            else
            {
                dbResults = DBFunctions.GetLastTradeSideFromPositionDataTable(log, strategy);

                transactions.LastTradeSideText = dbResults[1];
                transactions.Strategy          = dbResults[2];

                if (transactions.LastTradeSideText == "BUY" && signalFile.StrategyName == transactions.Strategy)
                {
                    transactions.LastTradeSide = 1;
                }
                else if (transactions.LastTradeSideText == "SELL" && signalFile.StrategyName == transactions.Strategy)
                {
                    transactions.LastTradeSide = -1;
                }
                else if (string.IsNullOrEmpty(transactions.LastTradeSideText))
                {
                    transactions.LastTradeSide = 0;
                }
            }
            return(transactions);
        }
Exemple #23
0
        private double ExecuteOrder(FuturesContract futuresContract, SignalFile signalFile, OrderDetails orderDetails, Strategy strategy, SimpleLogger log, Tuple <bool, bool, int> db)
        {
            Prices prices = new Prices();

            prices = prices.StartListener(clientSocket, contract, strategy, prices, log);

            double limitPrice = GetPrices(futuresContract, signalFile, strategy, orderDetails, prices, db);

            if (limitPrice <= 0)
            {
                limitPrice = signalFile.LimitPrice;
                log.Warning($"LimitPrice for {strategy.StrategyName} is null using signalFile price {signalFile.LimitPrice}");
            }

            //Use market orders overnight so we don't miss getting filled
            //string orderType = OverNight(signalFile, db);

            //if (string.IsNullOrEmpty(orderType))
            //{
            //    orderType = strategy.OrderType;
            //}

            Order        parent    = new Order();
            Order        openOrder = new Order();
            List <Order> orders    = new List <Order>();

            if (db.Item3 != 0) //If there is a position
            {
                //Use market orders overnight so we don't miss getting filled
                string orderType = OverNight(signalFile, db);

                //if (string.IsNullOrEmpty(orderType))
                //{
                //    orderType = strategy.OrderType;
                //}

                //Close position with market order
                parent = new Order()
                {
                    OrderId = OrderDetails.NextOrderId++,

                    Action        = orderDetails.BuyOrSell,
                    OrderType     = (string.IsNullOrEmpty(orderType) ? strategy.OrderType : orderType),     //strategy.OrderType, //"MKT",
                    TotalQuantity = strategy.LotSize,
                    LmtPrice      = (orderDetails.BuyOrSell == "SELL") ? prices.BidPrice : prices.AskPrice, //limitPrice,
                    AuxPrice      = (orderDetails.BuyOrSell == "SELL") ? prices.BidPrice : prices.AskPrice, //limitPrice,
                    Tif           = "GTC",

                    Transmit = true
                };

                openOrder = new Order()
                {
                    OrderId       = OrderDetails.NextOrderId++,
                    Action        = orderDetails.BuyOrSell,
                    OrderType     = strategy.OrderType, //(strategy.OrderType == "MKT" ? strategy.OrderType : orderType),
                    TotalQuantity = strategy.LotSize,
                    LmtPrice      = limitPrice,
                    AuxPrice      = limitPrice,
                    Tif           = "GTC",
                    Transmit      = true
                };

                orders = new List <Order>()
                {
                    parent,
                    openOrder
                };
            }
            else
            {
                openOrder = new Order()
                {
                    OrderId = OrderDetails.NextOrderId++,

                    Action        = orderDetails.BuyOrSell,
                    OrderType     = strategy.OrderType, //(strategy.OrderType == "MKT" ? strategy.OrderType : orderType),
                    TotalQuantity = orderDetails.LotSize,
                    LmtPrice      = limitPrice,
                    AuxPrice      = limitPrice,
                    Tif           = "GTC",

                    Transmit = true
                };
                orders = new List <Order>()
                {
                    openOrder
                };
            }

            foreach (Order o in orders)
            {
                clientSocket.placeOrder(o.OrderId, contract, o);
            }

            orderDetails.OrderId     = parent.OrderId.ToString();
            orderDetails.OrderStatus = "Submitted";

            if (db.Item3 != 0)
            {
                log.Signal($"Sent Closing {parent.Action} {parent.OrderType} Order for {strategy.Symbol} LimitPrice:{parent.LmtPrice} LotSize:{parent.TotalQuantity} OrderId:{parent.OrderId}");
                log.Signal($"Sent Opening {openOrder.Action} {openOrder.OrderType} Order for {strategy.Symbol} LimitPrice:{openOrder.LmtPrice} LotSize:{openOrder.TotalQuantity} OrderId:{openOrder.OrderId}");
            }
            else
            {
                log.Signal($"Sent Opening {openOrder.Action} {openOrder.OrderType} Order for {strategy.Symbol} LimitPrice:{openOrder.LmtPrice} LotSize:{openOrder.TotalQuantity} OrderId:{openOrder.OrderId}");
            }

            OrderDetails.OrderIdList.DataList.Add(orderDetails.OrderId);

            return(limitPrice);
        }
Exemple #24
0
        //public  string OrderType { get; set; }
        //public  int MaxPosition { get; set; }
        //public  int LotSize { get; set; }
        public FuturesContract GetContractDetails(Contract contract, FuturesContract futuresContract, SignalFile signalFile)
        {
            if (signalFile.Symbol.Contains("ES"))
            {
                signalFile.Symbol = "ES";

                //switch (signalFile.StrategyName)
                //{
                //    case "MES TMA_Slope Kase Bar 3.75":
                contract.LocalSymbol = string.Empty;
                contract.Symbol      = "MES"; //MES  ***USE MICRO CONTRACT FOR GO LIVE
                contract.SecType     = @params.sp500SecType;
                contract.LastTradeDateOrContractMonth = @params.sp500Expiry;
                contract.Exchange = @params.sp500Exchange;
                contract.Currency = @params.sp500Currency;

                futuresContract.Symbol   = contract.Symbol;
                futuresContract.Exchange = @params.sp500Exchange;

                //break;
                //default:
                //    contract.LocalSymbol = string.Empty;
                //    contract.Symbol = signalFile.Symbol; //MES  ***USE MICRO CONTRACT FOR GO LIVE
                //    contract.SecType = @params.sp500SecType;
                //    contract.LastTradeDateOrContractMonth = @params.sp500Expiry;
                //    contract.Exchange = @params.sp500Exchange;
                //    contract.Currency = @params.sp500Currency;

                //    Symbol = contract.Symbol;
                //    Exchange = @params.sp500Exchange;
                //    break;
                //}
            }
            else if (signalFile.Symbol.Contains("QM"))
            {
                signalFile.Symbol    = "QM";
                contract.LocalSymbol = string.Empty;
                contract.Symbol      = signalFile.Symbol;
                contract.SecType     = @params.crudeSecType;
                contract.LastTradeDateOrContractMonth = @params.crudeExpiry;
                contract.Exchange = @params.crudeExchange;
                contract.Currency = @params.crudeCurrency;

                futuresContract.Symbol   = contract.Symbol;
                futuresContract.Exchange = @params.crudeExchange;
            }
            else if (signalFile.Symbol.Contains("CL"))
            {
                signalFile.Symbol    = "CL";
                contract.LocalSymbol = string.Empty;
                contract.Symbol      = signalFile.Symbol;
                contract.SecType     = @params.crudeSecType;
                contract.LastTradeDateOrContractMonth = @params.crudeExpiry;
                contract.Exchange = @params.crudeExchange;
                contract.Currency = @params.crudeCurrency;

                futuresContract.Symbol   = contract.Symbol;
                futuresContract.Exchange = @params.crudeExchange;
            }
            else if (signalFile.Symbol.Contains("GC"))
            {
                signalFile.Symbol    = "GC";
                contract.LocalSymbol = string.Empty;
                contract.Symbol      = "MGC"; //signalFile.Symbol;
                contract.SecType     = @params.goldSecType;
                contract.LastTradeDateOrContractMonth = @params.goldExpiry;
                contract.Exchange = @params.goldExchange;
                contract.Currency = @params.goldCurrency;

                futuresContract.Symbol   = contract.Symbol;
                futuresContract.Exchange = @params.goldExchange;
            }
            else if (signalFile.Symbol.Contains("TY"))
            {
                signalFile.Symbol    = "ZN";
                contract.LocalSymbol = string.Empty;
                contract.Symbol      = signalFile.Symbol;
                contract.SecType     = "FUT";
                contract.LastTradeDateOrContractMonth = @params.crudeExpiry;
                contract.Exchange = "ECBOT";
                contract.Currency = "USD";

                futuresContract.Symbol   = signalFile.Symbol;
                futuresContract.Exchange = "ECBOT";
            }

            return(futuresContract);
        }
Exemple #25
0
        public static SignalFile ParseSignalFile(SignalFile signalFile, SimpleLogger log)
        {
            string strColumn;

            foreach (KeyValuePair <int, string> column in FileColumns)
            {
                strColumn = GetWantedText(signalFile.LastFileLine, column.Value);

                if (string.IsNullOrEmpty(strColumn))
                {
                    log.Warning($"SignalFile field {column.Value} missing data.");
                    break;
                }

                switch (column.Value)
                {
                case "strategy:":
                    signalFile.StrategyName = strColumn;
                    break;

                case "symbol:":
                    signalFile.Symbol = strColumn;
                    break;

                case "entry_date:":
                    signalFile.TradeDate = strColumn;
                    break;

                case "entry_time:":
                    signalFile.TradeDateTime = strColumn;
                    break;

                case "signal:":
                    signalFile.Signal = int.Parse(strColumn, CultureInfo.InvariantCulture);
                    break;

                case "entry_price:":
                    signalFile.EntryPrice = strColumn;
                    break;

                case "exit:":
                    signalFile.Exit = strColumn.Substring(0, 1);
                    break;

                case "adx:":
                    signalFile.Adx = int.Parse(strColumn, CultureInfo.InvariantCulture);
                    break;

                case "emaAngle:":
                    signalFile.EMAAngle = double.Parse(strColumn, CultureInfo.InvariantCulture);
                    break;

                case "trend:":
                    signalFile.Trend = double.Parse(strColumn, CultureInfo.InvariantCulture);
                    break;

                case "macd:":
                    signalFile.Macd = int.Parse(strColumn, CultureInfo.InvariantCulture);
                    break;
                }
            }

            signalFile.LimitPrice = double.Parse(signalFile.EntryPrice, CultureInfo.InvariantCulture);

            signalFile.Output = $"strategy:{signalFile.StrategyName}, symbol:{signalFile.Symbol}, entryDate:{signalFile.TradeDate}, entryDateTime: {signalFile.TradeDateTime} signal:{signalFile.Signal}, price:{signalFile.EntryPrice}, exit:{signalFile.Exit}, adx:{signalFile.Adx}, emaAngle:{signalFile.EMAAngle}, trend:{signalFile.Trend}, macd:{signalFile.Macd}";
            log.Signal("[PARSED DATA] " + signalFile.Output);

            return(signalFile);
        }
Exemple #26
0
        public static void GetStrategyId(FuturesContract futuresContract, Strategy strategy, SignalFile signalFile, SimpleLogger log)
        {
            var strategyInfo = from s in StrategyList
                               where s.Name == signalFile.StrategyName
                               select new { s.Id, s.Name, s.Ticker, s.OType, s.Contracts, s.MaxPosition, s.Enabled };

            var symbolMaxPosition = from s in StrategyList
                                    where s.Ticker == futuresContract.Symbol
                                    group s by s.Ticker into sg
                                    orderby sg.Key
                                    select new { sg.Key, Total = sg.Sum(x => x.MaxPosition) };

            foreach (var g in strategyInfo)
            {
                strategy.StrategyId          = g.Id;
                strategy.Symbol              = g.Ticker;
                strategy.StrategyName        = g.Name;
                strategy.OrderType           = g.OType;
                strategy.LotSize             = g.Contracts;
                strategy.StrategyMaxPosition = g.MaxPosition;
                strategy.Status              = g.Enabled;

                foreach (var c in symbolMaxPosition)
                {
                    strategy.MaxPositionForSymbol = c.Total;
                }
            }

            log.Info($"[STRATEGY INFO] StrategyId:{strategy.StrategyId} StrategyName:{strategy.StrategyName}");
        }
Exemple #27
0
        public Prices StartListener(EClientSocket clientSocket, Contract contract, Strategy strategy, Prices prices, SimpleLogger log)
        {
            string ticker;
            string strBid;
            string strAsk;

            double bid;
            double ask;

            int maxLoopCount = 30;

            Prices.IBDepthBidPriceFlag = false;
            Prices.IBDepthAskPriceFlag = false;

            if (strategy.Symbol != "MGC")
            {
                int cnt = 0;

                clientSocket.reqMarketDepth(strategy.StrategyId, contract, 1, null);

                while (true)
                {
                    ticker = SignalFile.GetWantedText(Prices.SideOne, "TickerId:");
                    strBid = SignalFile.GetWantedText(Prices.SideOne, "Price:");
                    strAsk = SignalFile.GetWantedText(Prices.SideTwo, "Price:");

                    if (Prices.IBDepthBidPriceFlag && Prices.IBDepthAskPriceFlag)
                    {
                        bid = Convert.ToDouble(strBid);
                        ask = Convert.ToDouble(strAsk);

                        if (bid > 0 && ask > 0)
                        {
                            prices.BidPrice = bid;
                            prices.AskPrice = ask;

                            clientSocket.cancelMktDepth(strategy.StrategyId);
                            log.Info($"Received Market Depth for TickerId:{ticker}, Symbol:{strategy.Symbol}, Bid:{strBid}, Ask:{strAsk}");
                            break;
                        }
                        else
                        {
                            log.Info($"Unable to get Market Depth for TickerId:{ticker}, Market Depth Bid:{strBid}, Ask:{strAsk}");
                            clientSocket.cancelMktDepth(strategy.StrategyId);
                            break;
                        }
                    }
                    if (cnt > maxLoopCount)
                    {
                        clientSocket.cancelMktDepth(strategy.StrategyId);

                        log.Warning($"Unable to get Market Depth for TickerId:{ticker}, Symbol:{strategy.Symbol}, Market Depth Bid:{strBid}, Ask:{strAsk}");
                        break;
                    }

                    log.Info($"Getting Market Depth... {cnt}");
                    cnt++;
                }
            }

            if (prices.BidPrice <= 0 || prices.AskPrice <= 0)
            {
                int cnt = 0;

                clientSocket.reqMktData(strategy.StrategyId, contract, "", false, null);

                Prices.IBBidPriceFlag = false;
                Prices.IBAskPriceFlag = false;

                while (true)
                {
                    ticker = SignalFile.GetWantedText(Prices.SideOne, "TickerId:");
                    strBid = SignalFile.GetWantedText(Prices.FieldOne, "Price:");
                    strAsk = SignalFile.GetWantedText(Prices.FieldTwo, "Price:");

                    bid = Convert.ToDouble(strBid);
                    ask = Convert.ToDouble(strAsk);

                    if (Prices.IBBidPriceFlag && Prices.IBAskPriceFlag)
                    {
                        if (bid > 0 && ask > 0)
                        {
                            prices.BidPrice = bid;
                            prices.AskPrice = ask;

                            clientSocket.cancelMktData(strategy.StrategyId);
                            log.Info($"Received Snapshot Data for TickerId:{ticker}, Symbol:{strategy.Symbol}, Bid:{strBid}, Ask:{strAsk}");
                            break;
                        }
                        else
                        {
                            log.Info($"Unable to get Snapshot Data for TickerId:{ticker}, Symbol:{strategy.Symbol}, Bid:{strBid}, Ask:{strAsk}");
                            clientSocket.cancelMktDepth(strategy.StrategyId);
                            break;
                        }
                    }
                    if (cnt >= maxLoopCount)
                    {
                        clientSocket.cancelMktData(strategy.StrategyId);

                        log.Warning($"Unable to get Snapshot Data for TickerId:{ticker}, Symbol:{strategy.Symbol}, Bid:{strBid}, Ask:{strAsk}");
                        break;
                    }

                    log.Info($"Getting Price Snapshot Data... {cnt}");
                    cnt++;
                }
            }
            return(prices);
        }