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); }
public void addExecution(IAppExecution execution) { Executions.Add(execution); }