// обработка добавления строки в AllTradesChannel void _allTradChannel_LoadedLineEvent(object sender, EventArgs e) { id++; AllTradesChannel _send = (AllTradesChannel)sender; ParametrMarketTrades _pmt = new ParametrMarketTrades(id.ToString(), _send.Date, _send.Time, _send.Number, _send.Price, _send.Security, _send.TimeMsk, _send.Operation, _send.Quantity); marketTradRepo.Add(_pmt); // ! добавляем без проверки по номеру ! }
public void TradesFilled(ParametrMarketTrades _paramMarketTrades) { decimal variation_margin = 0; // вариационная маржа после каждой сделки decimal varMarLots = 0; // вариационка на один лот при каждой сделке decimal accumIncomeLots = 0; // накопленный доход на лот при каждой сделке decimal countOpenPosition = 0; // количество открытых позиций после каждой сделки decimal qty_trad = _paramMarketTrades.Quantity; if (_paramMarketTrades.Operation == Constants.OperationSell) { qty_trad *= -1; } if (this.Count == 0) { // добавляем новую позу this.Add(new ParametrPosition(_paramMarketTrades.PriceTrades, qty_trad)); } else { // провeрка корректности элементов int sign_position = Math.Sign(this[0].Quantity); bool correct_element = this.All(x => Math.Sign(x.Quantity) == sign_position); if (!correct_element) { System.Windows.MessageBox.Show("Есть лонги и шорты!"); return; } // сортировка this.Sort((a, b) => a.Price.CompareTo(b.Price)); // если позиции длинные if (sign_position > 0) { // если оперция покупка - добаление позиции if (_paramMarketTrades.Operation == Constants.OperationBuy) { AddPosition(_paramMarketTrades.PriceTrades, qty_trad); } else // в протвном случае - закрытие позиции { decimal balance = qty_trad; for (int i = 0; i < Math.Abs(qty_trad); i++) { if (balance != 0) { if (this.Count > 0) // если еще есть, что закрывать { decimal income = 0; balance = this[0].CountCloseLong(balance, _paramMarketTrades.PriceTrades, out income); accumulatedIncome += income; this.RemoveAll(x => x.Quantity == 0); // удаляем позы с нулевыми остатками } else // в протвном случае добляем позу { this.Add(new ParametrPosition(_paramMarketTrades.PriceTrades, balance)); break; } } else { break; } } } } // если позиции короткие if (sign_position < 0) { // если оперция продажа - добаление позиции if (_paramMarketTrades.Operation == Constants.OperationSell) { AddPosition(_paramMarketTrades.PriceTrades, qty_trad); } else // в протвном случае - закрытие позиции { decimal balance = qty_trad; for (int i = 0; i < Math.Abs(qty_trad); i++) { if (balance != 0) { if (this.Count > 0) // если еще есть, что закрывать { decimal income = 0; balance = this[this.Count - 1].CountCloseShort(balance, _paramMarketTrades.PriceTrades, out income); accumulatedIncome += income; this.RemoveAll(x => x.Quantity == 0); // удаляем позы с нулевыми остатками } else // в протвном случае добляем позу { this.Add(new ParametrPosition(_paramMarketTrades.PriceTrades, balance)); break; } } else { break; } } } } } // установить вариационную маржу + общая вариационка + общее кол. откр. поз foreach (ParametrPosition item in this) { variation_margin += item.VariationMarginChange(_paramMarketTrades.PriceTrades); countOpenPosition += item.Quantity; } if (countOpenPosition != 0) { varMarLots = variation_margin / Math.Abs(countOpenPosition); accumIncomeLots = accumulatedIncome / Math.Abs(countOpenPosition); } StaticService.LogFileWriteNotDateTime(_paramMarketTrades.DateTimeTrades + "\t" + _paramMarketTrades.TimeMsk + "\t" + _paramMarketTrades.Operation + "\t" + _paramMarketTrades.Quantity + "\t" + _paramMarketTrades.PriceTrades + "\t*\t" + accumulatedIncome + "\t" + variation_margin + "\t" + countOpenPosition + "\t*\t" + Math.Abs(varMarLots).ToString("#") + "\t" + accumIncomeLots.ToString("#"), out_data_log, true); StaticService.LogFileWriteNotDateTime(_paramMarketTrades.PriceTrades.ToString(), data_price_log, true); StaticService.LogFileWriteNotDateTime(countOpenPosition.ToString(), data_position_log, true); }