private static void Client_OwnTradesReceived(object sender, Events.KrakenPrivateEventArgs<OwnTradesMessage> e) { List<TradeObject> trades = e.PrivateMessage.Trades; for (int i = 0; i < trades.Count; i++) { TradeObject t = trades[i]; OsEngine.Entity.MyTrade trade = new OsEngine.Entity.MyTrade(); trade.NumberOrderParent = t.OrderTxId; trade.Price = t.Price; trade.NumberTrade = t.TradeId; string pair = t.Pair.ToString(); Sec security = Securities.Find(sec => sec.NameInSocket == pair); if (security == null) { return; } trade.SecurityNameCode = security.NameInRest; trade.Volume = t.Volume; DateTime time = new DateTime(1970, 1, 1).AddSeconds(Convert.ToDouble(t.Time)); trade.Time = time; if (t.Type == "sell") { trade.Side = OsEngine.Entity.Side.Sell; } else { trade.Side = OsEngine.Entity.Side.Sell; } if (MyTradeUpdateEvent != null) { MyTradeUpdateEvent(trade); } } // // = (sender, e) => Console.WriteLine($"OwnTrades received"); }
/// <summary> /// check incoming trade for this trade /// проверить входящий трейд, на принадлежность этой сделке /// </summary> public void SetTrade(MyTrade trade) { _myTrades = null; if (_openOrders != null) { for (int i = 0; i < _openOrders.Count; i++) { if (_openOrders[i].NumberMarket == trade.NumberOrderParent || _openOrders[i].NumberUser.ToString() == trade.NumberOrderParent) { trade.NumberPosition = Number.ToString(); _openOrders[i].SetTrade(trade); if (OpenVolume != 0) { State = PositionStateType.Open; } else if (OpenVolume == 0) { _openOrders[i].TimeDone = trade.Time; State = PositionStateType.Done; } } } } if (CloseOrders != null) { for (int i = 0; i < CloseOrders.Count; i++) { if (CloseOrders[i].NumberMarket == trade.NumberOrderParent || CloseOrders[i].NumberUser.ToString() == trade.NumberOrderParent) { trade.NumberPosition = Number.ToString(); CloseOrders[i].SetTrade(trade); if (OpenVolume == 0) { State = PositionStateType.Done; CloseOrders[i].TimeDone = trade.Time; } else if (OpenVolume < 0) { State = PositionStateType.ClosingSurplus; } } } } if (State == PositionStateType.Done && CloseOrders != null && EntryPrice != 0 && ClosePrice != 0) { if (Direction == Side.Buy) { ProfitOperationPersent = ClosePrice / EntryPrice * 100 - 100; ProfitOperationPunkt = ClosePrice - EntryPrice; } else { ProfitOperationPunkt = EntryPrice - ClosePrice; ProfitOperationPersent = -(ClosePrice / EntryPrice * 100 - 100); } } }
/// <summary> /// проверить входящий трейд, на принадлежность этой сделке /// </summary> public void SetTrade(MyTrade trade) { if (_openOrders != null) { for (int i = 0; i < _openOrders.Count; i++) { if (_openOrders[i].NumberMarket == trade.NumberOrderParent || _openOrders[i].NumberUser.ToString() == trade.NumberOrderParent) { _openOrders[i].SetTrade(trade); if (OpenVolume != 0) { State = PositionStateType.Open; } else if (OpenVolume == 0) { State = PositionStateType.Done; } } } } if (CloseOrders != null) { for (int i = 0; i < CloseOrders.Count; i++) { if (CloseOrders[i].NumberMarket == trade.NumberOrderParent || CloseOrders[i].NumberUser.ToString() == trade.NumberOrderParent) { CloseOrders[i].SetTrade(trade); if (OpenVolume == 0) { State = PositionStateType.Done; } else if (OpenVolume < 0) { State = PositionStateType.ClosingSurplus; } } } } if (State == PositionStateType.Done && CloseOrders != null && EntryPrice != 0) { decimal medianPriceClose = 0; decimal countValue = 0; for (int i = 0; i < CloseOrders.Count; i++) { if (CloseOrders[i].VolumeExecute != 0) { medianPriceClose += CloseOrders[i].PriceReal * CloseOrders[i].VolumeExecute; countValue += CloseOrders[i].VolumeExecute; } } if (countValue != 0) { medianPriceClose = medianPriceClose / countValue; } if (medianPriceClose == 0) { return; } if (Direction == Side.Buy) { ProfitOperationPersent = medianPriceClose / EntryPrice * 100 - 100; ProfitOperationPunkt = medianPriceClose - EntryPrice; } else { ProfitOperationPunkt = EntryPrice - medianPriceClose; ProfitOperationPersent = -(medianPriceClose / EntryPrice * 100 - 100); } ProfitOperationPersent = Math.Round(ProfitOperationPersent, 3); } }
void MyTradeDelete_Click(object sender, EventArgs e) { if (_position.OpenOrders == null) { return; } if (_openOrdersGrid.Rows.Count == 0) { return; } int number; try { number = _openOrdersGrid.CurrentCell.RowIndex; } catch (Exception) { return; } if (ActionDeleteIsAccepted() == false) { return; } string strNum = _tradesGrid.Rows[number].Cells[0].Value.ToString(); List <Order> openOrders = _position.OpenOrders; List <Order> closeOrders = _position.CloseOrders; bool isInArray = false; for (int i = 0; openOrders != null && i < openOrders.Count; i++) { if (isInArray == true) { break; } Order curOrd = openOrders[i]; for (int i2 = 0; i2 < curOrd.MyTrades.Count; i2++) { MyTrade curTrade = curOrd.MyTrades[i2]; if (curTrade.NumberTrade == strNum) { curOrd.MyTrades.RemoveAt(i2); isInArray = true; break; } } } for (int i = 0; closeOrders != null && i < closeOrders.Count; i++) { if (isInArray == true) { break; } Order curOrd = closeOrders[i]; for (int i2 = 0; i2 < curOrd.MyTrades.Count; i2++) { MyTrade curTrade = curOrd.MyTrades[i2]; if (curTrade.NumberTrade == strNum) { curOrd.MyTrades.RemoveAt(i2); isInArray = true; break; } } } RePaint(); }
private void Serv_NewMyTradeEvent(MyTrade obj) { NewMyTradeEvent(Type, obj); }