Example #1
0
        /// <summary>
        /// возвращает Id категории сигналов или null
        /// </summary>
        public int?IsSignaller(int acId)
        {
            var lastReq          = lastUpdated.GetLastHitIfHitted();
            var milsSinceRequest = lastReq.HasValue
                                       ? (DateTime.Now - lastReq.Value).TotalMilliseconds
                                       : int.MaxValue;

            if (milsSinceRequest > MilsToUpdateTraders)
            {
                UpdateSignallers();
            }
            try
            {
                locker.AcquireReaderLock(LockTimeout);
            }
            catch (ApplicationException)
            {
                return(null);
            }
            try
            {
                int catId;
                return((traderAccounts.TryGetValue(acId, out catId)) ? catId : (int?)null);
            }
            finally
            {
                locker.ReleaseReaderLock();
            }
        }
        /// <summary>
        /// проверить - не пора ли начислить своп?
        /// </summary>
        private void CheckSwap()
        {
            // проверить час
            var timeNow = DateTime.Now.ToUniversalTime();
            var hourGmt = timeNow.Hour;

            if (swapCheckHourGmt != hourGmt)
            {
                return;
            }

            // проверить день
            if (timeNow.DayOfWeek == DayOfWeek.Sunday)
            {
                return;
            }

            // проверить, не было ли уже начисления свопа
            var lastTimeChecked = swapCheckedTime.GetLastHitIfHitted();

            if (lastTimeChecked.HasValue && lastTimeChecked.Value.Date == timeNow.Date)
            {
                return;
            }

            // сколько минут прошло с часа Х
            if (timeNow.Minute > minutesToCheckSwap)
            {
                return;
            }

            swapCheckedTime.SetTime(timeNow);
            // таки насчитать своп
            DoMakeSwap();
        }
        private void CheckUpdates()
        {
            // проверка уже запущена?
            if (updateCheckInProgress)
            {
                return;
            }

            // проверка запускалась недавно?
            var lastTimeUpdated = lastCheckUpdate.GetLastHitIfHitted();

            if (!lastTimeUpdated.HasValue)
            {
                lastCheckUpdate.Touch();
                return;
            }
            var milsSince = (DateTime.Now - lastTimeUpdated.Value).TotalMilliseconds;

            if (milsSince < CheckUpdateIntervalMils)
            {
                return;
            }

            // асинхронно запустить проверку
            if (updateCheckInProgress)
            {
                return;
            }
            updateCheckInProgress = true;
            ThreadPool.QueueUserWorkItem(DoCheckUpdates, null);
        }
Example #4
0
        public override string ActivateScript(bool byTrigger)
        {
            // проверить количество повторений и интервал ожидания
            if (repeatTimes == 0)
            {
                return(string.Empty);
            }

            var timeAct = timeActivated.GetLastHitIfHitted();

            if (timeAct.HasValue)
            {
                if ((DateTime.Now - timeAct.Value).TotalSeconds < freezeSeconds)
                {
                    return(string.Empty);
                }
            }

            // таки проиграть сигнал
            EventSoundPlayer.Instance.PlayEvent(eventSound);

            if (repeatTimes > 0)
            {
                repeatTimes--;
            }
            timeActivated.Touch();

            MainForm.Instance.AddMessageToStatusPanelSafe(DateTime.Now, scriptMessage);
            return(scriptMessage);
        }
Example #5
0
        public void ScheduleTopPortfolioUpdates(IEnumerable <FarmAccount> accountsList)
        {
            schedules = new[]
            {
                new Schedule(
                    () =>
                {
                    var nowTime     = DateTime.Now;
                    var lastUpdated = lastTimeUpdated.GetLastHitIfHitted();
                    // если портфель уже тасовался - обновить его минимум сутки спустя
                    if (lastUpdated.HasValue)
                    {
                        var daysPassed = (nowTime - lastUpdated.Value).TotalDays;
                        if (daysPassed < 1)
                        {
                            return;
                        }
                    }
                    // иначе - обновить портфель на промежутке 0:00 - 0:30
                    else
                    if (nowTime.Hour > 0 || nowTime.Minute > 30)
                    {
                        return;
                    }

                    // таки обновить портфели по всем счетам
                    Logger.Info("Обновить портфели по счетам");
                    var accounts = RobotFarm.Instance.Accounts;
                    foreach (var ac in accounts)
                    {
                        if (RobotFarm.Instance.State == FarmState.Stopping)
                        {
                            break;
                        }
                        ac.UpdatePortfolio();
                    }

                    // сохранить время последнего обновления
                    lastTimeUpdated.Touch();
                    new IniFile(iniFilePath).WriteValue("portfolio", "uptime",
                                                        DateTime.Now.ToStringUniform());
                }, SecondsBetweenCheckTossTime * 1000),
                new Schedule(
                    () =>
                {
                    var accounts = RobotFarm.Instance.Accounts;
                    foreach (var ac in accounts)
                    {
                        if (RobotFarm.Instance.State == FarmState.Stopping)
                        {
                            break;
                        }
                        ac.ReviveChannel();
                    }
                }, SecondsBetweenReviveChannel * 1000)
            };
        }
 private void RequestQueuedOnClient(ChatRequest request)
 {
     if (isStopping)
     {
         return;
     }
     if (!liveServerCheckTime.GetLastHitIfHitted().HasValue)
     {
         liveServerCheckTime.SetTime(DateTime.Now + aliveTimeSpan);
     }
     else if (RequestQueueFilled != null)
     {
         RequestQueueFilled();
     }
     if (Logged != null)
     {
         Logged(request.ToString());
     }
 }
Example #7
0
        /// <summary>
        /// если за последние N (к примеру, 60)
        /// секунд накопилось больше N * K сообщений (к примеру, больше 60 * 20) -
        /// вернуть True
        /// </summary>
        public bool CheckOverflood()
        {
            var lastCheckedTime       = lastTimeFloodChecked.GetLastHitIfHitted();
            var secondsSinceLastCheck = lastCheckedTime == null
                ? int.MaxValue
                : (DateTime.Now - lastCheckedTime.Value).TotalSeconds;

            if (secondsSinceLastCheck < checkFloodIntervalSeconds)
            {
                return(false);
            }
            lastTimeFloodChecked.Touch();

            requestLocker.EnterReadLock();
            List <DateTime> requestTimes;

            try
            {
                requestTimes = tradeRequestList.Select(r => r.requestTime).ToList();
            }
            finally
            {
                requestLocker.ExitReadLock();
            }
            if (requestTimes.Count < 10)
            {
                return(false);
            }

            var nowTime = DateTime.Now;

            requestTimes = requestTimes.OrderByDescending(t => t).ToList();
            var countInQueue = 0;

            foreach (var time in requestTimes)
            {
                var secondsLeft = (nowTime - time).TotalSeconds;
                if (secondsLeft > checkFloodSeconds)
                {
                    break;
                }
                countInQueue++;
            }
            var maxMessages = checkFloodSeconds * checkFloodMsgPerSecond;

            if (countInQueue > maxMessages)
            {
                Logger.ErrorFormat("Mt4Dealer - flood, {0} messages for {1} seconds ({2} are allowed)",
                                   countInQueue, checkFloodSeconds, maxMessages);
                return(true);
            }
            return(false);
        }
        /// <summary>
        /// возвращает список ордеров - как есть или обновив (прочитав) с сервера
        /// считает прибыль по ордерам
        /// </summary>
        public List <MarketOrder> GetActualOrderList()
        {
            var  lastHit   = lastTimeOrdersReceived.GetLastHitIfHitted();
            var  deltaTime = lastHit.HasValue ? (DateTime.Now - lastHit.Value).TotalMilliseconds : int.MaxValue;
            var  isActual  = deltaTime < OrdersActualInterval;
            bool timeoutFlag;

            if (isActual)
            {
                return(orders.GetAll(DefaultTimeout, out timeoutFlag) ?? new List <MarketOrder>());
            }

            // обновить и вернуть список ордеров
            ActualizeOrders();
            return(orders.GetAll(DefaultTimeout, out timeoutFlag) ?? new List <MarketOrder>());
        }
        public override string ActivateScript(bool byTrigger)
        {
            if (!byTrigger)
            {
                throw new Exception("Неверный тип вызова скрипта \"ShowRobotSummary\"");
            }

            var nowTime = DateTime.Now;
            var lastHit = lastTimeCalled.GetLastHitIfHitted();

            if (lastHit.HasValue)
            {
                var deltaSeconds = (nowTime - lastHit.Value).TotalSeconds;
                if (deltaSeconds < 0.5)
                {
                    return("");
                }
            }
            lastTimeCalled.Touch();

            var robots = MainForm.Instance.RobotFarm.GetRobotsAsIs().ToList();

            if (robots.Count == 0)
            {
                return("");
            }

            var charts = MainForm.Instance.GetChartList(true);

            foreach (var chart in charts)
            {
                var commentText = GetCommentForChart(chart.Symbol, chart.Timeframe, robots);
                if (string.IsNullOrEmpty(commentText))
                {
                    continue;
                }

                var comment = chart.seriesComment.data.FirstOrDefault(c => c.Name == CommentSpecName);
                if (comment != null)
                {
                    comment.Text = commentText;
                }
            }

            return("");
        }
        private void UpdateLotByGroup()
        {
            var timUpdated = lastTimeLotByGroupUpdated.GetLastHitIfHitted();

            if (timUpdated.HasValue)
            {
                var deltaMils = (DateTime.Now - timUpdated.Value).TotalMilliseconds;
                if (deltaMils <= updateIntervalMils)
                {
                    return;
                }
            }

            lotByGroup.Clear();

            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    foreach (var lotGroup in ctx.LOT_BY_GROUP)
                    {
                        Dictionary <string, VolumeStep> dic;
                        if (!lotByGroup.dictionary.TryGetValue(lotGroup.Group, out dic))
                        {
                            dic = new Dictionary <string, VolumeStep>();
                            lotByGroup.dictionary.Add(lotGroup.Group, dic);
                        }
                        dic.Add(lotGroup.Spot,
                                new VolumeStep((int)lotGroup.MinVolume, (int)lotGroup.MinStepVolume));
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка в UpdateLotByGroup()", ex);
                throw;
            }
            finally
            {
                lotByGroup.GetHashCodeForDic();
                lastTimeLotByGroupUpdated.Touch();
            }

            lotByGroup.GetHashCodeForDic();
        }
        public DateSpan GetServerTickerHistorySpan(string ticker)
        {
            var lastUpTime = lastUpdated.GetLastHitIfHitted();
            var needUpdate = !lastUpTime.HasValue || (DateTime.Now - lastUpTime.Value).TotalMinutes >= MinutesToRefreshTickerHistory;

            if (needUpdate)
            {
                try
                {
                    tickerFirstRecord = quoteStorage.GetTickersHistoryStarts();
                }
                catch (Exception ex)
                {
                    tickerFirstRecord = new Dictionary <string, DateSpan>();
                    Logger.Error("GetServerTickerHistoryStart() - ошибка получения истории", ex);
                }
            }
            DateSpan span;

            tickerFirstRecord.TryGetValue(ticker, out span);
            return(span);
        }
Example #12
0
        public static List <PerformerStatRecord> GetRecords()
        {
            var timeSinceUpdate = lastUpdated.GetLastHitIfHitted();

            if (timeSinceUpdate.HasValue)
            {
                var  deltaSec = (DateTime.Now - timeSinceUpdate.Value).TotalSeconds;
                bool isTimeout;
                if (deltaSec < RecordsUpdateIntervalSeconds)
                {
                    return(recordsSafe.GetAll(TimeoutIntervalMils, out isTimeout));
                }
            }

            var records = new List <PerformerStatRecord>();

            // обратиться к сервису TradeSharp.SiteBridge
            try
            {
                try
                {
                    var performers = TradeSharpAccountStatistics.Instance.proxy.GetAllPerformers(false) ?? new List <PerformerStat>();
                    var recs       = performers.Select(p => new PerformerStatRecord(p)).ToList();
                    recordsSafe.ReplaceRange(recs, TimeoutIntervalMils);
                    return(recs);
                }
                catch (Exception ex)
                {
                    //Logger.Error("Невозможно получить информацию о подписчиках - необходимо обновить файл конфигурации сайта", ex);
                    Logger.Error("GetPerformers() error", ex);
                    return(records);
                }
            }
            finally
            {
                lastUpdated.Touch();
            }
        }
Example #13
0
        public DateTime GetServerTickerHistoryStart(string ticker)
        {
            var lastUpTime = lastUpdated.GetLastHitIfHitted();
            var needUpdate = !lastUpTime.HasValue || (DateTime.Now - lastUpTime.Value).TotalMinutes >= MinutesToRefreshTickerHistory;

            if (needUpdate)
            {
                try
                {
                    IQuoteStorage quoteStorage;
                    try
                    {
                        quoteStorage = Contract.Util.Proxy.QuoteStorage.Instance.proxy;
                    }
                    catch (Exception)
                    {
                        Logger.Error("Связь с сервером (IQuoteStorageBinding) не установлена");
                        return(DateTime.Now.Date.AddDays(-355));
                    }

                    tickerFirstRecord = quoteStorage.GetTickersHistoryStarts();
                }
                catch (Exception ex)
                {
                    tickerFirstRecord = new Dictionary <string, DateSpan>();
                    Logger.Error("GetServerTickerHistoryStart() - ошибка получения истории", ex);
                }
                finally
                {
                    lastUpdated.Touch();
                }
            }
            DateSpan span;

            return(!tickerFirstRecord.TryGetValue(ticker, out span)
                ? DateTime.Now.Date.AddDays(-355)
                : span.start);
        }
        public Account GetActualAccount(bool updateOrders = false)
        {
            var lastHit   = lastTimeAccountReceived.GetLastHitIfHitted();
            var deltaTime = lastHit.HasValue ? (DateTime.Now - lastHit.Value).TotalMilliseconds : int.MaxValue;
            var isActual  = deltaTime < AccountActualInterval;

            if (isActual)
            {
                return(Account);
            }

            // обновить информацию по счету
            ActualizeAccount();

            // опционально - обновить сделки и посчитать Equity
            if (updateOrders)
            {
                ActualizeOrders();
            }

            // вернуть акаунт
            return(Account);
        }
Example #15
0
        private void OnQuotesReceived(string[] names, QuoteData[] quotes)
        {
            var nowTime = DateTime.Now.AddDays(offsetHours);

            // лок на запись в словарь свечей
            if (!lockCandles.TryEnterWriteLock(LockTimeout))
            {
                Logger.Error("OnQuotesReceived - таймаут записи");
                return;
            }

            try
            {
                if (!lockCandlesM1.TryEnterWriteLock(LockTimeout))
                {
                    Logger.Error("OnQuotesReceived - таймаут записи (m1)");
                    return;
                }

                try
                {
                    // обновить свечи
                    foreach (var packerDic in packers)
                    {
                        var timeframeCode = packerDic.Key;
                        var isM1          = timeframeCode == barSettingsCodeM1;

                        for (var i = 0; i < names.Length; i++)
                        {
                            var          name = names[i];
                            CandlePacker packer;
                            packerDic.Value.TryGetValue(name, out packer);
                            if (packer == null)
                            {
                                continue;
                            }
                            var newCandle = packer.UpdateCandle(quotes[i].bid, nowTime);
                            if (newCandle != null)
                            {
                                candles[timeframeCode][name].Add(newCandle);
                                if (isM1)
                                {
                                    candlesM1[name].Add(newCandle);
                                }
                            }
                        }
                    }
                }
                finally
                {
                    lockCandlesM1.ExitWriteLock();
                }
            }
            finally
            {
                lockCandles.ExitWriteLock();
            }

            // если пришло время выгрузить m1 в файл... выгрузить
            var timeSaved = lastTimeCandlesSaved.GetLastHitIfHitted();

            if (timeSaved.HasValue)
            {
                if ((DateTime.Now - timeSaved.Value).TotalSeconds > flushCandlesIntervalSec)
                {
                    FlushCandlesInFiles(); // таки выгрузить
                    lastTimeCandlesSaved.Touch();
                }
            }
            else
            {
                lastTimeCandlesSaved.Touch();
            }
        }
Example #16
0
        public static float GetMarkupAbs(string groupCode, string ticker, out AccountGroup.MarkupType markType)
        {
            //Logger.InfoFormat("Markup: GetMarkupAbs({0}, {1})", groupCode, ticker);
            markType = AccountGroup.MarkupType.NoMarkup;
            // пришло время обновить словарь?
            var lastTimeUpdate  = lastTimeDicIsUpdated.GetLastHitIfHitted();
            var milsSinceUpdate = lastTimeUpdate == null
                                      ? int.MaxValue
                                      : (DateTime.Now - lastTimeUpdate.Value).TotalMilliseconds;

            if (milsSinceUpdate > MaxMilsBetweenUpdate)
            {
                //Logger.InfoFormat("Markup: Updating dic");
                // таки обновить словарь
                var dicMarkup = DictionaryManager.Instance.GetMarkupByGroup();
                //Logger.InfoFormat("Markup: Dic is updated - {0} records", dicMarkup.Count);
                if (!locker.TryEnterWriteLock(LockTimeout))
                {
                    Logger.ErrorFormat("AcccountMarkupDictionary - write timeout ({0} ms)", LockTimeout);
                }
                else
                {
                    markups = dicMarkup.ToDictionary(m => m.GroupCode, m => m);
                    locker.ExitWriteLock();
                }
            }

            GroupMarkup mark;

            // безопасно прочитать данные
            if (!locker.TryEnterReadLock(LockTimeout))
            {
                Logger.ErrorFormat("AcccountMarkupDictionary - read timeout ({0} ms)", LockTimeout);
                return(0);
            }
            try
            {
                markups.TryGetValue(groupCode, out mark);
            }
            finally
            {
                locker.ExitReadLock();
            }

            if (mark == null)
            {
                return(0);
            }
            //Logger.InfoFormat("Markup: got value ({0}, {1})", mark.DefaultSpread, mark.MarkupType);
            if (mark.MarkupType == AccountGroup.MarkupType.NoMarkup)
            {
                return(0);
            }
            markType = mark.MarkupType;

            float spread;

            if (mark.spreadByTicker.TryGetValue(ticker, out spread))
            {
                return(spread);
            }

            // посчитать спред из пунктов
            return(mark.DefaultSpread == 0
                       ? 0
                       : DalSpot.Instance.GetAbsValue(ticker, mark.DefaultSpread));
        }