Пример #1
0
        private void btnNewOrderSingle_Click(object sender, EventArgs e)
        {
            char bs;

            if (cbxBS.Text == "BUY")
            {
                bs = QuickFix.Side.BUY;
            }
            else
            {
                bs = QuickFix.Side.SELL;
            }

            char orderType;

            if (_tradePrice == -1)
            {
                orderType = QuickFix.OrdType.MARKET;
            }
            else
            {
                orderType = QuickFix.OrdType.LIMIT;
            }

            TT.SendMsg send = new TT.SendMsg();
            send.ttNewOrderSingle(new string[] { _gw, _product, QuickFix.SecurityType.FUTURE, cbxContracts.Text }, _gw,
                                  _account, orderType, _tradePrice, 1.00, bs);
        }
Пример #2
0
 private void main_FormClosing(object sender, FormClosingEventArgs e)
 {
     TT.SendMsg send = new TT.SendMsg();
     send.ttLogout();
     log.CloseLog();
     log.CleanLog(3);
 }
Пример #3
0
        private void btnSecurityDefinitionRequest_Click(object sender, EventArgs e)
        {
            _qf._contracts.Clear();

            TT.SendMsg send = new TT.SendMsg();
            send.ttSecurityDefinitionRequest(_gw, _product, QuickFix.SecurityType.FUTURE, null);
        }
Пример #4
0
        private void btnOrderCancelReplace_Click(object sender, EventArgs e)
        {
            char bs;

            if (cbxBS.Text == "BUY")
            {
                bs = QuickFix.Side.BUY;
            }
            else
            {
                bs = QuickFix.Side.SELL;
            }

            TT.SendMsg send = new TT.SendMsg();
            send.ttOrderCancelReplace(new string[] { _gw, _product, QuickFix.SecurityType.FUTURE, cbxContracts.Text },
                                      _account, _qf.getLastSiteOrderkey(), _tradePrice, (double)new System.Random().Next(1, 10), bs,
                                      QuickFix.OrdType.LIMIT);
        }
Пример #5
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="MGT"></param>
        /// <param name="acct"></param>
        /// <param name="SecEx"></param>
        /// <param name="product"></param>
        /// <param name="secID"></param>
        /// <param name="tradesize"></param>
        /// <param name="side"></param>
        /// <param name="price"></param>
        /// <param name="gateway"></param>
        private void UpdatePosition(
            string MGT, 
            string acct,
            string SecEx, 
            string product, 
            string secID, 
            int tradesize, 
            char side,
            decimal  price,
            string gateway)
        {
            log.WriteLog("mainForm::UpdatePosition");

            //added to filter by account
            if (isAccountFilterEnabled)
            {
                string watchedAccount = dsRisk.tblTrader.Rows.Find(MGT).Field<string>(dsRisk.tblTrader.AccountColumn);
                if (watchedAccount == null || watchedAccount != acct)
                {
                    log.WriteList("Execution disregarded because account does not match");
                    return;
                }
            }
            //end account filter code

            int currentBuyPos = 0;
            int currentSellPos = 0;
            decimal  currentBuyPrc = 0.00M;
            decimal  currentSellPrc = 0.00M;
            int previousBuyPos = 0;
            int previousSellPos = 0;

            if (side == QuickFix.Fields.Side.SELL )
            {
                currentSellPos = tradesize;
                currentSellPrc = price;
            }
            else if (side == QuickFix.Fields.Side.BUY)
            {
                currentBuyPos = tradesize;
                currentBuyPrc = price;
            }
            else
            {
                log.WriteList("NO BuySell info");
                return;
            }

            try
            {
                if (dsRisk.tblPositions.Rows.Find(new object[] { MGT, SecEx, product, secID }) == null)
                {

                    //TODO why cast to double??
                    dsRisk.tblPositions.AddtblPositionsRow(MGT, SecEx, product, secID,
                    currentBuyPos, currentSellPos, (double)currentBuyPrc, (double)currentSellPrc, 0.00, 0.00, gateway, acct );

                    TT.SendMsg send = new TT.SendMsg();

                    send.ttSecurityDefinitionRequest(SecEx, product, secID);
                    send.ttMarketDataRequest(SecEx, product, secID);

                }
                else
                {
                    DataRow dr = dsRisk.tblPositions.Rows.Find(new object[] { MGT, SecEx, product, secID });

                    dr[dsRisk.tblPositions.AccountColumn] = acct;

                    //existing buy/sell positions
                    previousBuyPos = (int)dr[dsRisk.tblPositions.BuyPosColumn];
                    previousSellPos = (int)dr[dsRisk.tblPositions.SellPosColumn];

                    dr[dsRisk.tblPositions.BuyPosColumn] = previousBuyPos + currentBuyPos;
                    dr[dsRisk.tblPositions.SellPosColumn] = previousSellPos + currentSellPos;

                    decimal  previousAvgBuyPrc = 0.00M;
                    if ( dr[dsRisk.tblPositions.AvgBuyColumn] != null)
                        previousAvgBuyPrc = (decimal )dr[dsRisk.tblPositions.AvgBuyColumn];

                    decimal  previousAvgSellPrc = 0.00M;
                    if ( dr[dsRisk.tblPositions.AvgSellColumn] != null)
                        previousAvgSellPrc = (decimal )dr[dsRisk.tblPositions.AvgSellColumn];

                    dr[dsRisk.tblPositions.AvgBuyColumn] = ((previousBuyPos * previousAvgBuyPrc) +
                                                            (currentBuyPos * currentBuyPrc)) / (previousBuyPos + currentBuyPos);

                    dr[dsRisk.tblPositions.AvgSellColumn] = ((previousSellPos * previousAvgSellPrc) +
                                                             (currentSellPos * currentSellPrc)) / (previousSellPos + currentSellPos);

                    // using decimals negates the need to check for NaN?
                    // if (dr[dsRisk.tblPositions.AvgBuyColumn].Equals(decimal. .NaN)) { dr[dsRisk.tblPositions.AvgBuyColumn] = 0.00; }
                    // if (dr[dsRisk.tblPositions.AvgSellColumn].Equals(decimal .NaN)) { dr[dsRisk.tblPositions.AvgSellColumn] = 0.00; }

                    dr.AcceptChanges();

                }

                DataRow drPrc = dsRisk.tblSecurity.Rows.Find(new object[] { SecEx, product, secID });
                if (drPrc != null)
                {
                    decimal  bid = (decimal )drPrc[dsRisk.tblSecurity.BidPriceColumn];
                    decimal  ask = (decimal )drPrc[dsRisk.tblSecurity.AskPriceColumn];

                    CalcPnL(SecEx, product, secID, bid, ask);
                }
            }
            catch (Exception ex)
            {
                log.WriteList("Exception occured mainForm::UpdatePosition");
                log.WriteLog(ex.ToString());
            }
        }
Пример #6
0
 /// <summary>
 /// Receive data from QuickFix to cancel all orders for a shutdown trader
 /// </summary>
 /// <param name="MGT"></param>
 /// <param name="key"></param>
 private void orderCancel(string MGT, string key)
 {
     if (stoppedTraders.Contains(MGT))
     {
         TT.SendMsg send = new TT.SendMsg();
         send.ttOrderCancelRequest(key);
     }
 }
Пример #7
0
        /// <summary>
        /// Flatten all positions for a trader.
        /// </summary>
        /// <param name="MGT"></param>
        private void FlattenTrader(string MGT)
        {
            try
            {
                foreach (DataRow dr in dsRisk.tblPositions)
                {
                    if (dr[dsRisk.tblPositions.MGTColumn].Equals(MGT) &&
                        !dr[dsRisk.tblPositions.BuyPosColumn].Equals(dr[dsRisk.tblPositions.SellPosColumn]))
                    {
                        string account = dr[dsRisk.tblPositions.AccountColumn].ToString();
                        if (String.IsNullOrEmpty(account))
                        { account = dsRisk.tblTrader.Rows.Find(MGT).Field<string>(dsRisk.tblTrader.AccountColumn); }

                        int buys = (int)dr[dsRisk.tblPositions.BuyPosColumn];
                        int sells = (int)dr[dsRisk.tblPositions.SellPosColumn];
                        char bs = char.MinValue;

                        if (buys < sells)
                        { bs = QuickFix.Fields.Side.BUY; }
                        else
                        { bs = QuickFix.Fields.Side.SELL; }
                        decimal qty = Convert.ToDecimal(Math.Abs(buys - sells));

                        string SecEx = dr[dsRisk.tblPositions.SecurityExchangeColumn].ToString();
                        string symbol = dr[dsRisk.tblPositions.SymbolColumn].ToString();
                        string secID = dr[dsRisk.tblPositions.SecurityIDColumn].ToString();
                        string gateway = dr[dsRisk.tblPositions.ExchangeGatewayColumn].ToString();

                        if (TT.SendMsg.inflightOrders.Count == 0 && chkBxAUTO.Checked)
                        {
                            TT.SendMsg send = new TT.SendMsg();
                            send.ttNewOrderSingle(account, SecEx,symbol, secID, qty, bs, gateway );
                        }
                        else if (!chkBxAUTO.Checked)
                        { log.WriteList("AUTO MODE DISABLED! No orders sent"); }

                    }
                }
            }
            catch (Exception ex)
            { log.WriteList(ex.ToString()); }
        }
Пример #8
0
        // check what actions must be taken based on limits and P&L
        private void checkPnLAction()
        {
            try
            {
                log.WriteLog("mainForm::checkPnLAction: ");

                foreach (DataRow dr in dsRisk.tblTrader)
                {
                    //log.WriteList(string.Format("{0} < {1}", dr[dsRisk.tblTrader.TotalPLColumn], dr[dsRisk.tblTrader.LimitColumn]));

                    decimal  total;
                    bool isValid = decimal .TryParse(dr[dsRisk.tblTrader.TotalPLColumn].ToString(), out total);

                    if (isValid && (decimal )dr[dsRisk.tblTrader.TotalPLColumn] <= (decimal )dr[dsRisk.tblTrader.LimitColumn])
                    {
                        string MGT = dr[dsRisk.tblTrader.MGTColumn].ToString();
                        stoppedTraders.Add(MGT);

                        if (chkBxAUTO.Checked)
                        {
                            TT.SendMsg send = new TT.SendMsg();
                            send.ttOrderStatusRequest();
                        }
                        else
                        { log.WriteList("AUTO MODE DISABLED! Orders not canceled"); }

                        FlattenTrader(MGT);
                    }

                    if (isEmailEnabled)
                    {
                        int ActiveAlert = (int)dr[dsRisk.tblTrader.EmailAlertColumn];

                        if (isValid &&
                            ActiveAlert <= EmailLimits.GetUpperBound(0) &&
                            (decimal )dr[dsRisk.tblTrader.TotalPLColumn] < EmailLimits[ActiveAlert])
                        {

                            SendEmail(
                                to[ActiveAlert],
                                cc[ActiveAlert],
                                bcc[ActiveAlert],
                                msg[ActiveAlert],
                                subject[ActiveAlert] + Environment.NewLine + dr[dsRisk.tblTrader.MGTColumn].ToString(),
                                priority[ActiveAlert]);

                            ActiveAlert++;
                            dr[dsRisk.tblTrader.EmailAlertColumn] = ActiveAlert;
                            dr.AcceptChanges();
                        }
                    }

                }
            }
            catch (Exception ex)
            { log.WriteList(ex.ToString()); }
        }
Пример #9
0
 private void btnOrderCancelRequest_Click(object sender, EventArgs e)
 {
     TT.SendMsg send = new TT.SendMsg();
     send.ttOrderCancelRequest(_qf.getLastSiteOrderkey());
 }
Пример #10
0
 private void btnOrderStatusRequest_Click(object sender, EventArgs e)
 {
     TT.SendMsg send = new TT.SendMsg();
     send.ttOrderStatusRequest();
 }
Пример #11
0
 private void btnRequestForPosition_Click(object sender, EventArgs e)
 {
     TT.SendMsg send = new TT.SendMsg();
     send.ttRequestForPosition(TT.PosReqType.POSITIONS);
 }
Пример #12
0
 private void btnGatewayStatusRequest_Click(object sender, EventArgs e)
 {
     TT.SendMsg send = new TT.SendMsg();
     send.ttGatewayStatusRequest(QuickFix.SubscriptionRequestType.SNAPSHOT);
 }
Пример #13
0
 private void btnSecurityStatusRequest_Click(object sender, EventArgs e)
 {
     TT.SendMsg send = new TT.SendMsg();
     send.ttSecurityStatusRequest(new string[] { _gw, _product, QuickFix.SecurityType.FUTURE, cbxContracts.Text },
                                  QuickFix.SubscriptionRequestType.SNAPSHOT);
 }
Пример #14
0
 private void btnLogout_Click(object sender, EventArgs e)
 {
     TT.SendMsg send = new TT.SendMsg();
     send.ttLogout();
 }
        public virtual void OnLogon(QuickFix.SessionID session)
        {
            log.WriteLog("onLogon: " + session.TargetCompID ); //FIX4.2:SenderCompID->TargetCompID:SessionQualifier

                if (string.Equals(session.SessionQualifier.ToUpperInvariant(), "ORDER"))
                {
                    //Add code to clear position table before downloading all trades
                    posReports.Clear();
                    updateClearPOS();

                    TT.SendMsg send = new TT.SendMsg();

                    send.ttGatewayStatusRequest(QuickFix.Fields.SubscriptionRequestType.SNAPSHOT_PLUS_UPDATES);

                    send.ttRequestForPosition(QuickFix.Fields.PosReqType.START_OF_DAYS);
                    send.ttRequestForPosition(QuickFix.Fields.PosReqType.DETAILED_START_OF_DAYS);
                    send.ttRequestForPosition(QuickFix.Fields.PosReqType.MANUAL_FILLS);
                    send.ttRequestForPosition(QuickFix.Fields.PosReqType.TRADES);

                }
        }