예제 #1
0
        public void updatePosition(int stgIndex, IAppExecution execution)
        {
            String[] stgNames = stgManager.getStgNames();
            String   side;

            if (AppConstant.BUY_SIGNAL.Equals(execution.Side))
            {
                side = AppConstant.BUY_SIGNAL;
            }
            else
            {
                side = AppConstant.SELL_SIGNAL;
            }

            String      stgName  = stgNames[stgIndex];
            AppPosition position = StoreStgPositions[stgName];

            lock (position)
            {
                int beforeNetQ = position.NetQ;
                if (AppConstant.BUY_SIGNAL.Equals(side))
                {
                    position.AccBuyQ     += execution.ExeShare;
                    position.AccBuyMoney += (execution.ExeShare * execution.AvgPrice);
                    position.NetQ         = position.AccBuyQ - position.AccSellQ;
                }
                else
                {
                    position.AccSellQ     += execution.ExeShare;
                    position.AccSellMoney += (execution.ExeShare * execution.AvgPrice);
                    position.NetQ          = position.AccBuyQ - position.AccSellQ;
                }

                if (beforeNetQ != 0 && position.NetQ == 0)
                {
                    int    closedPosition = Math.Min(position.AccBuyQ, position.AccSellQ);
                    double avgBuyPrice    = position.AccBuyMoney / position.AccBuyQ;
                    double avgSellPrice   = position.AccSellMoney / position.AccSellQ;
                    position.TotalPnL = avgSellPrice * closedPosition - avgBuyPrice * closedPosition;
                }
            }
        }
        public void test_updateAppOrderExecution()
        {
            IAppStrategyManager stgManager   = getStgManager();
            IAppOrderManager    orderManager = new AppOrderManager(stgManager);
            IAppOrder           appOrder     = createOrder_Sell3Contract();

            orderManager.AppOrderStore.AddOrUpdate(appOrder.OrderId, appOrder, (key, oldValue) => oldValue);
            ExecutionMessage exeMessage = getExeMessage_for_Sell3Contract();

            orderManager.updateAppOrderExecution(exeMessage);
            IAppOrder retAppOrder = orderManager.AppOrderStore[appOrder.OrderId];

            IAppExecution appExe = retAppOrder.Executions[0];

            Assert.AreEqual(1, retAppOrder.Executions.Count);
            Assert.AreEqual(23000, appExe.AvgPrice);
            Assert.AreEqual("1102", appExe.ExecId);
            Assert.AreEqual(3, appExe.ExeShare);
            Assert.AreEqual("2015-11-11 01:07:01", appExe.LastExecTime);
            Assert.AreEqual(1001, appExe.OrderId);
            Assert.AreEqual(AppConstant.SELL_SIGNAL, appExe.Side);
        }
예제 #3
0
 public void addExecution(IAppExecution execution)
 {
     Executions.Add(execution);
 }