コード例 #1
0
        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);
            }
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
        private void ReadBrokerMetadata(TradeSharpConnection ctx)
        {
            var currencyData = ctx.ENGINE_METADATA.FirstOrDefault(r =>
                                                                  r.Category == "BROKER" && r.Name == "Currency"); // !!

            BrokerCurrency = currencyData != null ? currencyData.Value : "USD";
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        /// <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);
        }
コード例 #8
0
        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);
        }
コード例 #9
0
 private static TradeSharpConnection EnsureContext(ref TradeSharpConnection context)
 {
     if (context != null)
     {
         return(null);
     }
     context = new TradeSharpConnection();
     return(context);
 }
コード例 #10
0
        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);
        }
コード例 #11
0
        /// <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);
            }
        }
コード例 #12
0
ファイル: MainForm.cs プロジェクト: suspended/TradeSharp
        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);
            }
        }
コード例 #13
0
        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();
        }
コード例 #14
0
 private void CloseAccount(int id, TradeSharpConnection ctx)
 {
     try
     {
         new AccountCleaner().CloseAccount(id, ctx);
     }
     catch (Exception ex)
     {
         Logger.Error("Error in CloseAccount(" + id + "): " + ex);
     }
 }
コード例 #15
0
 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);
 }
コード例 #16
0
        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);
        }
コード例 #17
0
        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);
        }
コード例 #18
0
        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);
            }
        }
コード例 #19
0
        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));
        }
コード例 #20
0
        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();
        }
コード例 #21
0
        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);
        }
コード例 #22
0
        /// <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);
        }
コード例 #23
0
        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);
        }
コード例 #24
0
        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);
        }
コード例 #25
0
        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);
        }
コード例 #26
0
        /// <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();
        }
コード例 #27
0
 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);
     }
 }
コード例 #28
0
        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>());
        }
コード例 #29
0
 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);
     }
 }
コード例 #30
0
        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);
        }