コード例 #1
0
 public void AddTrade(LiveTrade trade)
 {
     if (!Trades.Exists(x => x.TradeId == trade.TradeId))
     {
         Trades.Add(trade);
     }
 }
コード例 #2
0
 private void RemoveAndAddToDatabase(LiveTrade liveTrade, ExecutionMessage message, MyDBContext dbContext)
 {
     DeleteRange(dbContext.LiveTrade.Where(
                     x => x.AccountID == message.AccountID), dbContext);
     Add(liveTrade, dbContext);
     SaveChanges(dbContext);
 }
コード例 #3
0
 public void CancelTrades(LiveTrade trade, LiveTrade stopTrade)
 {
     PendingApprovalCodes.RemoveAll(x => x == trade.ApprovalCode);
     if (stopTrade != null)
     {
         PendingApprovalCodes.RemoveAll(x => x == stopTrade.ApprovalCode);
     }
 }
コード例 #4
0
        private LiveTrade OrderToTrade(LiveOrder order)
        {
            var ret = new LiveTrade(
                order.Security,
                order.OrderDirection,
                order.OrderType,
                order.OrderSize,
                order.LimitPrice);

            return(ret);
        }
コード例 #5
0
        public void AddOrUpdateLiveTrade(LiveTrade liveTrade)
        {
            using (var dbContext = new MyDBContext())
            {
                var foundLiveTrade = dbContext.LiveTrade.SingleOrDefault(x => x.AccountID == liveTrade.AccountID);
                if (foundLiveTrade == null)
                {
                    dbContext.LiveTrade.Add(liveTrade);
                }
                else
                {
                    dbContext.UpdateEntryValues(foundLiveTrade, liveTrade);
                }

                dbContext.SaveChanges();
            }
        }
コード例 #6
0
        public bool ExecuteTrades(LiveTrade trade, LiveTrade stopTrade)
        {
            if (!PendingApprovalCodes.Contains(trade.ApprovalCode) || (stopTrade != null && !PendingApprovalCodes.Contains(stopTrade.ApprovalCode)))
            {
                Log(new LogMessage("Trade Mgr", $"ERROR: Trades not approved: {trade} and {stopTrade}", LogMessageType.TradingError));
                return(false);
            }

            ActiveAccount.Portfolio.AddTrade(trade);
            if (stopTrade != null)
            {
                ActiveAccount.Portfolio.AddTrade(stopTrade);
            }

            TradingProvider.SubmitTrades(trade, stopTrade);

            CancelTrades(trade, stopTrade);

            return(true);
        }
コード例 #7
0
ファイル: CustomEvents.cs プロジェクト: kenaschmidt/Finance
 public LiveTradeEventArgs(LiveTrade trade)
 {
     Trade = trade ?? throw new ArgumentNullException(nameof(trade));
 }
コード例 #8
0
 public async Task <IActionResult> Put(int id, [FromBody] LiveTrade value)
 {
     throw new NotImplementedException();
 }
コード例 #9
0
 protected void OnTradeStatusUpdate(LiveTrade trade)
 {
     TradeStatusUpdate?.Invoke(this, new LiveTradeEventArgs(trade));
 }
コード例 #10
0
        private void ProcessNewExecutionMessage(string commissionMessageExecutionId)
        {
            using (var dbContext = new MyDBContext())
            {
                var liveTradesList = GetAll <LiveTrade>(dbContext).ToList();

                var executionMessage =
                    SingleOrDefault <ExecutionMessage>(x => x.ExecutionId == commissionMessageExecutionId, dbContext);
                accountIdAndSymbolForOrdersEqualFunc = x => x.AccountID == executionMessage.AccountID &&
                                                       x.InstrumentID ==
                                                       executionMessage.InstrumentID;

                if (executionMessage != null)
                {
                    var liveTrade = new LiveTrade {
                        UpdateTime = DateTime.Now
                    };

                    var item = liveTradesList.LastOrDefault(accountIdAndSymbolForOrdersEqualFunc);
                    if (item == null)
                    {
                        executionMessage.Map(liveTrade);

                        Add(liveTrade, dbContext);
                        SaveChanges(dbContext);
                    }
                    else if (ItIsSameSideTrade(executionMessage, liveTradesList))
                    {
                        var newFillPrice = (item.AveragePrice * item.Quantity +
                                            executionMessage.Price * executionMessage.Quantity) /
                                           (item.Quantity + executionMessage.Quantity);
                        var newQuantity = item.Quantity + executionMessage.Quantity;
                        executionMessage.Map(liveTrade);
                        liveTrade.Quantity     = newQuantity;
                        liveTrade.AveragePrice = newFillPrice;

                        RemoveAndAddToDatabase(liveTrade, executionMessage, dbContext);
                    }
                    else //different side trade
                    {
                        if (executionMessage.Quantity > item.Quantity)
                        {
                            var newFillPrice = (item.AveragePrice * item.Quantity -
                                                executionMessage.Price * executionMessage.Quantity) /
                                               (item.Quantity - executionMessage.Quantity);
                            var newQuantity = executionMessage.Quantity - item.Quantity;
                            executionMessage.Map(liveTrade);
                            liveTrade.AveragePrice = newFillPrice;
                            liveTrade.Quantity     = newQuantity;

                            RemoveAndAddToDatabase(liveTrade, executionMessage, dbContext);
                        }
                        else
                        {
                            DeleteRange(dbContext.LiveTrade.Where(
                                            x => x.AccountID == executionMessage.AccountID), dbContext);
                            SaveChanges(dbContext);
                        }
                    }
                }
                else if (!triedAgain) //wait and try again
                {
                    Thread.Sleep(1000);
                    triedAgain = true;
                    ProcessNewExecutionMessage(commissionMessageExecutionId);
                }
            }
        }