public bool UpdateAccountBalance(TradeSharpConnection ctx, ACCOUNT account, decimal amount, BalanceChangeType changeType, string description, DateTime valueDate, int?positionId) { var bc = new BALANCE_CHANGE { AccountID = account.ID, Amount = amount, ChangeType = (int)changeType, Description = description, ValueDate = valueDate, Position = positionId }; try { ctx.BALANCE_CHANGE.Add(bc); account.Balance += ((changeType == BalanceChangeType.Deposit || changeType == BalanceChangeType.Profit) ? amount : -amount); ctx.SaveChanges(); return(true); } catch (Exception ex) { Logger.ErrorFormat("Ошибка обновления баланса счета {0} на сумму {1}: {2}", account.ID, amount, ex); return(false); } }
/// <summary> /// Пересчёт баланса для указанного счёта. Применяется, например, после отмены уже закрытых сделок /// </summary> /// <param name="ctx"></param> /// <param name="accountId">уникаьлный идентификатор счёта, для которого пересчитываем баланс</param> public bool ReCalculateAccountBalance(TradeSharpConnection ctx, int accountId) { try { Logger.Info(string.Format("Пытыемся пересчитать баланс для счёта {0}", accountId)); var bal = ctx.BALANCE_CHANGE.Where(b => b.AccountID == accountId).Sum(c => (c.ChangeType == (int)BalanceChangeType.Deposit || c.ChangeType == (int)BalanceChangeType.Profit || c.ChangeType == (int)BalanceChangeType.Swap ? 1: -1) * c.Amount); var acc = ctx.ACCOUNT.Single(a => a.ID == accountId); acc.Balance = bal; ctx.SaveChanges(); return(true); } catch (InvalidOperationException ex) { Logger.Error(string.Format( "ReCalculateAccountBalance(). Не удалось пересчитать балланс {0}. Возможно нет ни одной проводки по счёту.", accountId), ex); } catch (Exception ex) { Logger.Error(string.Format("ReCalculateAccountBalance(). Не удалось пересчитать балланс счёта {0}.", accountId), ex); } return(false); }
private RequestStatus GetUserSubscribedCats(TradeSharpConnection ctx, string userLogin, string hash, long localTime, out List <Subscription> categories) { categories = new List <Subscription>(); try { var user = ctx.PLATFORM_USER.FirstOrDefault(u => u.Login == userLogin); if (user == null) { return(RequestStatus.Unauthorized); } var userHash = CredentialsHash.MakeCredentialsHash(userLogin, user.Password, localTime); if (userHash != hash) { return(RequestStatus.Unauthorized); } // получить подписку на торг. сигналы и собственные сигналы пользователя categories = (from uc in ctx.SUBSCRIPTION_V where uc.User == user.ID select uc).ToList().Select(LinqToEntity.DecorateSubscription).ToList(); return(RequestStatus.OK); } catch (Exception ex) { Logger.Error("Error in GetUserSubscribedCats()", ex); return(RequestStatus.ServerError); } }
private void ReadBrokerMetadata(TradeSharpConnection ctx) { var currencyData = ctx.ENGINE_METADATA.FirstOrDefault(r => r.Category == "BROKER" && r.Name == "Currency"); // !! BrokerCurrency = currencyData != null ? currencyData.Value : "USD"; }
public string DeleteSpotItem(TradeSharpConnection context, string title) { var result = string.Empty; var newContext = EnsureContext(ref context); try { var itemToDel = context.SPOT.Single(x => x.Title == title); context.SPOT.Remove(itemToDel); context.SaveChanges(); } catch (Exception ex) { Logger.Error("DeleteSpotItem()", ex); result = ex.Message; } finally { if (newContext != null) { newContext.Dispose(); } } return(result); }
private static void CorrectBalance(int acId, decimal deltaAmount, TradeSharpConnection conn) { // поправить депозит var bc = new BALANCE_CHANGE { AccountID = acId, ValueDate = DateTime.Now, Amount = deltaAmount, ChangeType = (int)BalanceChangeType.Withdrawal, Description = "public offering" }; conn.BALANCE_CHANGE.Add(bc); conn.SaveChanges(); var userId = conn.PLATFORM_USER_ACCOUNT.First(a => a.Account == acId).PlatformUser; var tr = new TRANSFER { ValueDate = bc.ValueDate, BalanceChange = bc.ID, Amount = -deltaAmount, Comment = "public offering", User = userId, TargetAmount = -deltaAmount }; conn.TRANSFER.Add(tr); }
/// <summary> /// посчитать профит по открытым позам в валюте депозита /// </summary> private float CalculateAccountOpenProfit(TradeSharpConnection ctx, ACCOUNT account, Dictionary <string, CandleData> candles) { var profitOpen = 0f; foreach (var pos in ctx.POSITION.Where(p => p.AccountID == account.ID)) { // найти последнюю котировку CandleData candle; if (!candles.TryGetValue(pos.Symbol, out candle)) { Errors.Add("CalculateAccountOpenProfit - " + Resource.ErrorMessageNoExitPriceFor + " " + pos.Symbol); continue; } // получить профит по позиции var priceExit = pos.Side > 0 ? candle.close : DalSpot.Instance.GetAskPriceWithDefaultSpread(pos.Symbol, candle.close); var profitCounter = pos.Volume * pos.Side * (priceExit - (float)pos.PriceEnter); // перевести профит в валюту депо if (!ConvertBaseOrCounterDepo(false, pos.Symbol, account.Currency, candles, ref profitCounter)) { continue; } profitOpen += profitCounter; } return(profitOpen); }
public static ORDER_BILL ProcessPriceForOrderClosing(MarketOrder order, Account account, TradeSharpConnection ctx) { AccountGroup.MarkupType markType; var spreadDelta = AcccountMarkupDictionary.GetMarkupAbs(account.Group, order.Symbol, out markType); var markupExit = 0f; if (spreadDelta > 0 && markType != AccountGroup.MarkupType.NoMarkup) { markupExit = spreadDelta; if (markType == AccountGroup.MarkupType.Markup) { order.PriceExit -= spreadDelta * order.Side; } } var bill = ctx.ORDER_BILL.FirstOrDefault(b => b.Position == order.ID); if (bill != null) { bill.MarkupExit = markupExit; } //else // Logger.Debug("Markup: ProcessPriceForOrderClosing - can not find the bill for pos " + order.ID); return(bill); }
private static TradeSharpConnection EnsureContext(ref TradeSharpConnection context) { if (context != null) { return(null); } context = new TradeSharpConnection(); return(context); }
public bool HasUserPaidTheService(TradeSharpConnection ctx, SERVICE service, int usr) { var nowDate = DateTime.Now.Date; // проверить - совершался ли платеж за подключение к подписке в ближайшие N минут? // если да - не снимать денег var hasTodayTransfers = ctx.TRANSFER.Any(t => t.User == usr && EntityFunctions.TruncateTime(t.ValueDate) == nowDate && t.Subscription == service.ID); return(hasTodayTransfers); }
/// <summary> /// отключить подписчика /// заодно отрубить ему торговые сигналы /// </summary> public bool UnsubscribeSubscriber(TradeSharpConnection ctx, SUBSCRIPTION sub) { // отписать подписчика и сформировать для него уведомление try { var service = ctx.SERVICE.First(s => s.ID == sub.Service); Logger.InfoFormat("UnsubscribeSubscriber(srv={0}, user={1}, srvAccount={2})", sub.Service, sub.User, service.AccountId); // отписать от торг. сигналов? if (service.ServiceType == (int)PaidServiceType.Signals) { var signalService = (from srv in ctx.SERVICE where srv.ID == sub.Service select srv).FirstOrDefault(); if (signalService != null) { var signalId = signalService.ID; var query = (from us in ctx.SUBSCRIPTION where us.Service == signalId && us.User == sub.User select us); var userSignalToRemove = new List <SUBSCRIPTION>(); foreach (var userSubscribed in query) { userSignalToRemove.Add(userSubscribed); } Logger.InfoFormat("UnsubscribeSubscriber(): remove {0} signals", userSignalToRemove.Count); foreach (var userSubscribed in userSignalToRemove) { ctx.SUBSCRIPTION.Remove(userSubscribed); } } else { Logger.ErrorFormat("UnsubscribeSubscriber(#{0}) - владелец сигнала #{1} не найден", sub.User, sub.Service); } } // убрать саму подписку ctx.SUBSCRIPTION.Remove(sub); // !! с уведомлением пока что вопрос return(true); } catch (Exception ex) { Logger.Error("Error in UnsubscribeSubscriber()", ex); return(false); } }
private void DoFixtransactions(BackgroundWorkerTask taskParam) { var accountList = (List <int>)taskParam.DataParam; int accountNumber = 0; foreach (var id in accountList) { if (workerQuote.CancellationPending) { break; } var accountId = id; using (var db = new TradeSharpConnection()) { foreach (var order in db.POSITION_CLOSED.Where(p => p.AccountID == accountId)) { if (workerQuote.CancellationPending) { break; } var orderId = order.ID; if (db.BALANCE_CHANGE.Any(bc => bc.Position == orderId)) { continue; } var changeType = (int)(order.ResultDepo > 0 ? BalanceChangeType.Profit : BalanceChangeType.Loss); var closeTime = order.TimeExit; var orderResult = Math.Abs(order.ResultDepo); var missIdBc = db.BALANCE_CHANGE.FirstOrDefault(b => b.AccountID == accountId && b.ValueDate == closeTime && b.Amount == orderResult); if (missIdBc != null) { missIdBc.Position = orderId; missIdBc.ChangeType = changeType; } else { db.BALANCE_CHANGE.Add(new BALANCE_CHANGE { AccountID = order.AccountID, Position = order.ID, Amount = order.ResultDepo, ChangeType = changeType, ValueDate = order.TimeExit }); } } db.SaveChanges(); } workerQuote.ReportProgress(100 * (accountNumber++) / accountList.Count); } }
public static void MakePammData(TradeSharpConnection conn, out ACCOUNT testAccount, out PLATFORM_USER shareOwner, out ACCOUNT eurAccount) { testAccount = conn.ACCOUNT.First(a => a.Balance > 0 && a.POSITION.Count > 0 && a.ACCOUNT_SHARE.Count == 0 && a.ACCOUNT_GROUP.IsReal); var ownerId = testAccount.PLATFORM_USER_ACCOUNT.First().PlatformUser; shareOwner = conn.PLATFORM_USER.First(u => u.ID == ownerId); var shareOwnerId = shareOwner.ID; var shareOwners = conn.PLATFORM_USER.Where(u => u.ID != shareOwnerId).Take(2).ToArray(); conn.ACCOUNT_SHARE.Add(new ACCOUNT_SHARE { Account = testAccount.ID, Share = 50, ShareOwner = shareOwner.ID }); conn.ACCOUNT_SHARE.Add(new ACCOUNT_SHARE { Account = testAccount.ID, Share = 30, ShareOwner = shareOwners[0].ID }); conn.ACCOUNT_SHARE.Add(new ACCOUNT_SHARE { Account = testAccount.ID, Share = 20, ShareOwner = shareOwners[1].ID }); // счет в евро eurAccount = new ACCOUNT { Balance = 10500, Currency = "EUR", AccountGroup = conn.ACCOUNT_GROUP.First(g => !g.IsReal).Code, TimeCreated = DateTime.Now, Status = (int)Account.AccountStatus.Created }; conn.ACCOUNT.Add(eurAccount); conn.SaveChanges(); // сделки по евровому счету conn.POSITION.Add(new POSITION { AccountID = eurAccount.ID, Side = (int)DealType.Sell, Symbol = "EURUSD", State = (int)PositionState.Opened, TimeEnter = eurAccount.TimeCreated, PriceEnter = (decimal)(Contract.Util.BL.QuoteStorage.Instance.ReceiveValue("EURUSD").bid + 0.002f) }); conn.SaveChanges(); }
private void CloseAccount(int id, TradeSharpConnection ctx) { try { new AccountCleaner().CloseAccount(id, ctx); } catch (Exception ex) { Logger.Error("Error in CloseAccount(" + id + "): " + ex); } }
private bool ModifyClosedPosition(MarketOrder order, TradeSharpConnection ctx, POSITION_CLOSED pos, out string errorString) { errorString = string.Empty; if (order.IsClosed) { var opened = new POSITION { AccountID = pos.AccountID, ID = pos.ID, Comment = order.Comment, Magic = order.Magic, ExpertComment = order.ExpertComment, PendingOrderID = order.PendingOrderID, PriceBest = (decimal?)order.PriceBest, PriceEnter = (decimal)order.PriceEnter, PriceWorst = (decimal?)order.PriceWorst, Side = order.Side, Stoploss = (decimal?)order.StopLoss, Symbol = order.Symbol, Takeprofit = (decimal?)order.TakeProfit, TimeEnter = order.TimeEnter, Volume = order.Volume, State = (int)order.State, MasterOrder = order.MasterOrder }; ctx.POSITION_CLOSED.Remove(pos); ctx.POSITION.Add(opened); return(true); } pos.Comment = order.Comment; pos.Magic = order.Magic; pos.ExpertComment = order.ExpertComment; pos.PendingOrderID = order.PendingOrderID; pos.PriceBest = (decimal?)order.PriceBest; pos.PriceEnter = (decimal)order.PriceEnter; pos.PriceWorst = (decimal?)order.PriceWorst; pos.Side = order.Side; pos.Stoploss = (decimal?)order.StopLoss; pos.Symbol = order.Symbol; pos.Takeprofit = (decimal?)order.TakeProfit; pos.TimeEnter = order.TimeEnter; pos.Volume = order.Volume; pos.ExitReason = (int)order.ExitReason; pos.PriceExit = (decimal)(order.PriceExit ?? 0); pos.PriceWorst = (decimal?)order.PriceWorst; pos.ResultBase = (decimal)order.ResultBase; pos.ResultDepo = (decimal)order.ResultDepo; pos.ResultPoints = (decimal)order.ResultPoints; pos.TimeExit = order.TimeExit ?? default(DateTime); pos.Swap = (decimal)(order.Swap ?? 0); ctx.SaveChanges(); return(true); }
public bool DeletePendingOrder(PENDING_ORDER order, TradeSharpConnection ctx, PendingOrderStatus status, int?positionID, string closeReason) { // получить текущую цену var pair = QuoteStorage.Instance.ReceiveValue(order.Symbol); var priceClosed = pair == null ? 0 : order.Side > 0 ? pair.bid : pair.ask; var hist = new PENDING_ORDER_CLOSED { OrderID = order.ID, AccountID = order.AccountID, Comment = order.Comment, ExpertComment = order.ExpertComment, Magic = order.Magic, PairOCO = order.PairOCO, PriceFrom = order.PriceFrom, PriceTo = order.PriceTo, Side = order.Side, Status = (int)status, Stoploss = order.Stoploss, Takeprofit = order.Takeprofit, Symbol = order.Symbol, TimeClosed = DateTime.Now, Volume = order.Volume, PriceClosed = (decimal)priceClosed, Position = positionID, CloseReason = closeReason }; try { ctx.PENDING_ORDER_CLOSED.Add(hist); var ord = ctx.PENDING_ORDER.FirstOrDefault(p => p.ID == order.ID); if (ord == null) { Logger.ErrorFormat("DeletePendingOrder - ордер {0} не найден", order.ID); ServiceManagerClientManagerProxy.Instance.NewOrderResponse(null, RequestStatus.ServerError, "crudsav"); return(false); } ctx.PENDING_ORDER.Remove(ord); ctx.SaveChanges(); return(true); } catch (Exception ex) { Logger.ErrorFormat("Ошибка в DeletePendingOrder (#{0}): {1}", order.ID, ex); } return(false); }
public bool CloseAccount(int accountId, TradeSharpConnection ctx) { var ac = ctx.ACCOUNT.FirstOrDefault(a => a.ID == accountId); if (ac == null) { return(false); } CloseOrders(ac, ctx); ZeroBalance(ac, ctx); return(true); }
public RequestStatus UnsubscribeUserFromPortfolio(TradeSharpConnection ctx, string subscriberLogin, bool deletePortfolio, bool deleteSubscriptions) { try { var user = ctx.PLATFORM_USER.FirstOrDefault(u => u.Login == subscriberLogin); if (user == null) { return(RequestStatus.Unauthorized); } var subscriptions = ctx.USER_TOP_PORTFOLIO.Where(u => u.User == user.ID).ToList(); foreach (var portfolioSub in subscriptions) { // удалить подписку ctx.USER_TOP_PORTFOLIO.Remove(portfolioSub); Logger.InfoFormat("UnsubscribeUserFromPortfolio({0}) - отписан от портфеля", subscriberLogin); // если подписка была на пользовательский портфель - удалить пользовательский портфель if (deletePortfolio) { var portfolio = ctx.TOP_PORTFOLIO.Single(p => p.Id == portfolioSub.Portfolio); if (portfolio.OwnerUser == user.ID) { ctx.TOP_PORTFOLIO.Remove(portfolio); } } if (!deleteSubscriptions) { continue; } // удалить подписки на сервисы var subs = ctx.SUBSCRIPTION.Where(s => s.User == user.ID).ToList(); foreach (var sub in subs) { ctx.SUBSCRIPTION.Remove(sub); } } ctx.SaveChanges(); return(RequestStatus.OK); } catch (Exception ex) { Logger.Error("Ошибка в UnsubscribePortfolio()", ex); return(RequestStatus.ServerError); } }
public WalletError ChargeFeeOnSubscription(TradeSharpConnection ctx, int serviceId, int usr, bool renewSubscription) { SERVICE service; try { service = ctx.SERVICE.First(s => s.ID == serviceId); } catch (Exception ex) { Logger.Error("Ошибка в ChargeFeeOnSubscription() - сервис не найден", ex); return(WalletError.InvalidData); } return(ChargeFeeOnSubscription(ctx, service, usr, renewSubscription)); }
private void CloseOrders(ACCOUNT ac, TradeSharpConnection ctx) { var ordersToClose = ctx.POSITION.Where(p => p.AccountID == ac.ID).ToList(); foreach (var order in ordersToClose) { ctx.POSITION.Remove(order); } var pendingsToClose = ctx.PENDING_ORDER.Where(p => p.AccountID == ac.ID).ToList(); foreach (var order in pendingsToClose) { ctx.PENDING_ORDER.Remove(order); } ctx.SaveChanges(); }
private PaidService GetPaidServiceProgressiveFeeScaleDetail(TradeSharpConnection ctx, SERVICE srv) { var fees = ctx.SERVICE_RATE.Where(r => r.Service == srv.ID).OrderBy(r => r.UserBalance).ToList(); if (fees.Count == 0) { return(null); } var service = LinqToEntity.DecoratePaidService(srv); service.serviceRates = fees.Select(f => new PaidServiceRate { Amount = f.Amount, RateType = PaidServiceRate.ServiceRateType.Percent, UserBalance = f.UserBalance }).ToList().ToList(); return(service); }
/// <summary> /// Получить с сервера описание всех дилеров, используя уже имеющийся контекст (что бы не пересоздавать его лишний раз) /// </summary> /// <param name="ctx">контекст</param> /// <returns>перечисление диллеров</returns> public IEnumerable <DealerDescription> GetAllDealerDescription(TradeSharpConnection ctx) { Logger.Info(string.Format("попытка запроса описания всех дилеров и их мапинг в класс {0}", typeof(DealerDescription).Name)); var dealerDescription = new List <DealerDescription>(); try { foreach (var dealer in ctx.DEALER) { dealerDescription.Add(LinqToEntity.DecorateDealerDescription(dealer)); } } catch (Exception ex) { Logger.Error("GetAllDealerDescription()", ex); return(new List <DealerDescription>()); } return(dealerDescription); }
private RequestStatus CheckCredentials(string hash, string userLogin, long localTime, int accountId, bool checkTradeRights, TradeSharpConnection connection = null) { try { var ctx = connection ?? DatabaseContext.Instance.Make(); try { var user = ctx.PLATFORM_USER.FirstOrDefault(u => u.Login == userLogin); if (user == null) { return(RequestStatus.IncorrectData); } var userHash = CredentialsHash.MakeCredentialsHash(userLogin, user.Password, localTime); if (userHash != hash) { return(RequestStatus.IncorrectData); } if (!ctx.PLATFORM_USER_ACCOUNT.Any(pa => pa.PlatformUser == user.ID && pa.Account == accountId && (!checkTradeRights || pa.RightsMask == (int)AccountRights.Управление))) { return(RequestStatus.Unauthorized); } } finally { if (connection == null) { ctx.Dispose(); } } } catch (Exception ex) { Logger.Error("Ошибка в CheckCredentials()", ex); return(RequestStatus.ServerError); } return(RequestStatus.OK); }
public static decimal CalculateAccountEquityWithShares(TradeSharpConnection ctx, ACCOUNT account, int accountOwnerId, Dictionary <string, QuoteData> quotes, out List <AccountShare> accountShares, out bool noQuoteError) { accountShares = new List <AccountShare>(); var orders = ctx.POSITION.Where(p => p.AccountID == account.ID && p.State == (int)PositionState.Opened).ToList().Select(LinqToEntity.DecorateOrder).ToList(); var curProfit = DalSpot.Instance.CalculateOpenedPositionsCurrentResult(orders, quotes, account.Currency, out noQuoteError); if (noQuoteError) { return(account.Balance); } var equity = (decimal)curProfit + account.Balance; // паи владельцев accountShares = ctx.ACCOUNT_SHARE.Where(s => s.Account == account.ID).ToList().Select(s => { var sh = LinqToEntity.DecorateAccountShare(s); sh.ShareMoney = sh.SharePercent * equity / 100; return(sh); }).ToList(); if (accountShares.Count == 0) { // прописать долю владельца accountShares.Add(new AccountShare { ShareMoney = equity, SharePercent = 100, UserId = accountOwnerId }); } return(equity); }
private static decimal AmendDeal(POSITION_CLOSED deal, TradeSharpConnection conn, decimal deltaAmount) { // "поправить" сделку deal.Side = -deal.Side; deal.ResultDepo = -deal.ResultDepo; var bc = conn.BALANCE_CHANGE.FirstOrDefault(b => b.Position == deal.ID); if (bc != null) { bc.ChangeType = (int)BalanceChangeType.Profit; var trans = conn.TRANSFER.FirstOrDefault(t => t.BalanceChange == bc.ID); deltaAmount += (bc.Amount * 2); if (trans != null) { trans.Amount = -trans.Amount; trans.TargetAmount = -trans.TargetAmount; } } return(deltaAmount); }
/// <summary> /// Метод пересчитывает баланс во всех операциях, кроме закрытия или отмены сделок /// </summary> public void UpdateBalanceChange(TradeSharpConnection ctx, MarketOrder closedPos, bool deleteTransferOnly) { // поправить трансфер по счету и баланс var dealDescr = string.Format("{1} #{0}", closedPos.ID, Resource.TitleMarketOrderResult); var trans = ctx.BALANCE_CHANGE.FirstOrDefault(c => c.AccountID == closedPos.AccountID && (c.ChangeType == (int)BalanceChangeType.Profit || c.ChangeType == (int)BalanceChangeType.Loss) && c.Description.Equals(dealDescr, StringComparison.OrdinalIgnoreCase)); if (deleteTransferOnly) { if (trans == null) { return; } ctx.BALANCE_CHANGE.Remove(trans); } else { // изменить или добавить перевод if (trans == null) { trans = new BALANCE_CHANGE { Description = dealDescr, AccountID = closedPos.AccountID }; ctx.BALANCE_CHANGE.Add(trans); } trans.Amount = (decimal)Math.Abs(closedPos.ResultDepo); trans.ChangeType = closedPos.ResultDepo > 0 ? (int)BalanceChangeType.Profit : (int)BalanceChangeType.Loss; if (closedPos.TimeExit != null) { trans.ValueDate = closedPos.TimeExit.Value; } } //ctx.BALANCE_CHANGE.ApplyCurrentValues(trans); ctx.SaveChanges(); }
public void MakeNewlyRegisteredAccountSignaller(TradeSharpConnection ctx, PLATFORM_USER user, ACCOUNT account) { try { ctx.SERVICE.Add(new SERVICE { AccountId = account.ID, ServiceType = (int)PaidServiceType.PAMM, Currency = account.Currency, FixedPrice = 1, Comment = "Сигналы " + LinqToEntity.DecoratePlatformUser(user).NameWithInitials, User = user.ID }); } catch (Exception ex) { Logger.ErrorFormat("Ошибка в MakeNewlyRegisteredAccountSignaller(login={0}, account={1}): {2}", user.Login, account.ID, ex); } }
public List <SPOT> GetAllSpotSymbols(TradeSharpConnection context) { var newContext = EnsureContext(ref context); try { return(context.SPOT.ToList()); } catch (Exception ex) { Logger.Error("GetAllSpotSymbols()", ex); } finally { if (newContext != null) { newContext.Dispose(); } } return(new List <SPOT>()); }
private void PerformStopout(ACCOUNT ac, Dictionary <string, QuoteData> quotes, TradeSharpConnection ctx) { try { var sb = new StringBuilder(); var posReq = from pos in ctx.POSITION where pos.AccountID == ac.ID && pos.State == (int)PositionState.Opened select pos; var totalCount = 0; var closedCount = 0; foreach (var pos in posReq) { totalCount++; // закрыть ордер QuoteData quote; quotes.TryGetValue(pos.Symbol, out quote); var price = quote == null ? 0 : quote.GetPrice(pos.Side > 0 ? QuoteType.Bid : QuoteType.Ask); if (price == 0) { sb.AppendFormat("Невозможно закрыть ордер {0} ({1}): нет цены", pos.ID, pos.Symbol); continue; } if (orderRepository.CloseOrder(LinqToEntity.DecorateOrder(pos), (decimal)price, PositionExitReason.Stopout)) { closedCount++; } sb.AppendFormat("позиция {0} закрыта по цене {1:f4} - стопаут. ", pos.ID, price); } if (ShouldLogStopout(ac.ID)) { Logger.Info(string.Format("Счет {0}. Закрыто {1} из {2} позиций. ", ac.ID, closedCount, totalCount) + sb); } } catch (Exception ex) { loggerNoFlood.LogMessageFormatCheckFlood(LogEntryType.Error, LogMagicStopout, 60 * 1000, "Ошибка при выполнении стопаута {0}: {1}", ac.ID, ex); } }
public string AddNewSpotItem(TradeSharpConnection context, SpotModel model) { var result = string.Empty; var newContext = EnsureContext(ref context); try { var spot = new SPOT { ComBase = model.ComBase, ComCounter = model.ComCounter, Title = model.Title, CodeFXI = model.CodeFXI, MinVolume = model.MinVolume, MinStepVolume = model.MinStepVolume, Precise = model.Precise, SwapBuy = model.SwapBuy, SwapSell = model.SwapSell, Description = model.Description }; context.SPOT.Add(spot); context.SaveChanges(); } catch (Exception ex) { Logger.Error("AddNewSpotItem()", ex); result = ex.Message; } finally { if (newContext != null) { newContext.Dispose(); } } return(result); }