/// <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); }
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); }
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()); } }
/// <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); }
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(); } }
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); }
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(); } }
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)); }