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); }
private void main_FormClosing(object sender, FormClosingEventArgs e) { TT.SendMsg send = new TT.SendMsg(); send.ttLogout(); log.CloseLog(); log.CleanLog(3); }
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); }
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); }
/// <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()); } }
/// <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); } }
/// <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()); } }
// 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()); } }
private void btnOrderCancelRequest_Click(object sender, EventArgs e) { TT.SendMsg send = new TT.SendMsg(); send.ttOrderCancelRequest(_qf.getLastSiteOrderkey()); }
private void btnOrderStatusRequest_Click(object sender, EventArgs e) { TT.SendMsg send = new TT.SendMsg(); send.ttOrderStatusRequest(); }
private void btnRequestForPosition_Click(object sender, EventArgs e) { TT.SendMsg send = new TT.SendMsg(); send.ttRequestForPosition(TT.PosReqType.POSITIONS); }
private void btnGatewayStatusRequest_Click(object sender, EventArgs e) { TT.SendMsg send = new TT.SendMsg(); send.ttGatewayStatusRequest(QuickFix.SubscriptionRequestType.SNAPSHOT); }
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); }
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); } }