private void PollRoutine() { lastTimeMessageReceived.Touch(); while (!isStopping) { Thread.Sleep(200); var isOk = !IsTimeout() && (IsConnected(tcpClient.Client) || connectionIsInProcess); if (isOk) { continue; } logNoFlood.LogMessageFormatCheckFlood(LogEntryType.Info, MsgDisconnected, 1000 * 60 * 30, "TcpReceiverClient:Disconnected"); try { tcpClient.Close(); tcpClient = new TcpClient(); tcpClient.BeginConnect(addresses, port, ConnectCallback, null); lastTimeMessageReceived.Touch(); connectionIsInProcess = true; } catch (Exception ex) { } } }
public void Update(List <T> values) { if (!locker.TryEnterWriteLock(lockTimeoutMils)) { return; } try { list = values; lastUpdated.Touch(); } finally { locker.ExitWriteLock(); } }
public DailySchedule( Action <object> actionOnObj, int minMilsBetweenCheck, object passedObject, int hourStart, int hourEnd, int minuteStart, int minuteEnd, string logMessageThenExecuted) { minMilsBetween = minMilsBetweenCheck; this.passedObject = passedObject; actionOnPassedObject = o => { if (DateTime.Now.Hour < hourStart || DateTime.Now.Hour > hourEnd || DateTime.Now.Minute < minuteStart || DateTime.Now.Minute > minuteEnd) { return; } var lastTime = lastTimeDailyRoutineExecuted.GetLastHitIfHitted(); if (lastTime.HasValue && lastTime.Value.Date == DateTime.Now.Date) { return; } if (!string.IsNullOrEmpty(logMessageThenExecuted)) { Logger.Info(logMessageThenExecuted); } try { actionOnObj(o); } finally { lastTimeDailyRoutineExecuted.Touch(); } }; }
public void ThreadSafeTimeStampTest() { var timeSt = new ThreadSafeTimeStamp(); var method = new WaitCallback(s => { for (var i = 0; i < 4; i++) { timeSt.Touch(); Thread.Sleep(200); var delta = (DateTime.Now - timeSt.GetLastHit()).TotalMilliseconds; } }); ThreadPool.QueueUserWorkItem(method); ThreadPool.QueueUserWorkItem(method); }
public override List<string> OnQuotesReceived(string[] names, CandleDataBidAsk[] quotes, bool isHistoryStartOff) { var events = new List<string>(); if (tickers.Length == 0 || isHistoryStartOff) return events; if (lastTrade == null) { lastTrade = new ThreadSafeTimeStamp(); lastTrade.Touch(); } // секунд с последнего трейда... var timeSince = (DateTime.Now - lastTrade.GetLastHit()).TotalSeconds; if (timeSince < tradeIntervalSec) return events; lastTrade.Touch(); // затребовать все сделки со своим magic List<MarketOrder> orders; GetMarketOrders(out orders, true); var sides = tickers.ToDictionary(t => t, t => 1); if (orders != null) foreach (var order in orders) { if (sides.ContainsKey(order.Symbol)) sides[order.Symbol] = -order.Side; // закрыть старую сделку CloseMarketOrder(order.ID); } // открыть новые сделки foreach (var tickerSide in sides) { var newOrd = new MarketOrder { Symbol = tickerSide.Key, Side = tickerSide.Value, AccountID = robotContext.AccountInfo.ID, Magic = Magic, Volume = FixedVolume, ExpertComment = "SimpleTradeMachine" }; var rst = robotContext.SendNewOrderRequest(protectedContext.MakeProtectedContext(), RequestUniqueId.Next(), newOrd, OrderType.Market, 0, 0); } return events; }
private void LoadWorkspace(bool wasInitiated = false) { if (!loadChartsEvent.WaitOne(timeoutLockSaveMs)) { Logger.Error("Таймаут на загрузке конфигурации (LoadWorkspace)"); return; } terminalIsLoaded = false; loadChartsEvent.Reset(); // запретить авто-сохранение LoadEnabledTimeframes(); // инициализировать контекст запросов if (!wasInitiated) { UserSettings.Instance.SaveSettings(); CurrentProtectedContext.Instance.Initialize(UserSettings.Instance.TerminalId); } // главное окно ScaleWindowOnStart(); // статусная панель StatusPanelHeight = UserSettings.Instance.StatusBarHeight; splitContainerStatus.SplitterDistance = splitContainerStatus.Width* UserSettings.Instance.StatusSplitterPositionRel / 100; // документ - объекты графиков var docObjects = LoadObjectsDoc(); // документ - настройки индюков var docIndi = LoadIndicatorSettingsXmlDoc(); // шаг 6.5 - подкачка котировок if (wasInitiated) { StartupForm.Reset(); SplashScreen.ShowSplash(StartupStage.LoadingWorkspace); } SplashScreen.UpdateState(StartupStage.LoadingWorkspace); // подкачать недостающие котировки PreloadChildChartsQuotes(docIndi); // дочерние формы - графики EnsureTabPages(); var chartInfList = UserSettings.Instance.ChartSetsList.ToList(); var chartNumber = 1; foreach (var chartInf in chartInfList) { SplashScreen.UpdateState(string.Format( Localizer.GetString("MessageLoadingNChartFmt"), chartNumber++, chartInfList.Count)); using (new TimeLogger("LoadChildChart")) LoadChildChart(chartInf, docObjects, docIndi, null, null, false); } // загружаем остальные окна nonChartWindows = UserSettings.Instance.WindowSetsList; using (new TimeLogger("ShowFirstBookmarkChildren")) ShowFirstBookmarkChildren(); // обработать новости using (new TimeLogger("news")) { NewsStorage.Instance.LoadNews(); List<News> lstNews; Logger.Info("Новости прочитаны из кэша"); NewsStorage.Instance.ReadNews(null, out lstNews); if (lstNews != null) if (lstNews.Count > 0) OnNewsReceived(lstNews.ToArray()); Logger.Info("Новости обработаны"); } // логиним клиента если стоит опция авторегистрации if (AccountStatus.Instance.ServerConnectionStatus == ServerConnectionStatus.Connected && !string.IsNullOrEmpty(UserSettings.Instance.Login) && !string.IsNullOrEmpty(UserSettings.Instance.Account)) { var pwrd = UserSettings.Instance.GetPasswordForLogin(UserSettings.Instance.Login); if (!string.IsNullOrEmpty(pwrd)) { // Login to account server string authResultString; AuthenticationResponse response; bool success; using (new TimeLogger("news")) success = Authenticate(UserSettings.Instance.Login, pwrd, out response, out authResultString); if (!success) { MessageBox.Show(authResultString, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); return; } var account = UserSettings.Instance.Account.ToIntSafe(); // подключиться к счету if (account.HasValue && account.Value > 0) SelectAccount(account.Value); } } HistoryOrderStorage.Instance.HurryUpUpdate(); UpdateLastWorkspaceMenu(); // закрыть диалог загрузки терминала if (wasInitiated) SplashScreen.CloseSplashScreen(); ShowOrHideNavPanel(UserSettings.Instance.NavPanelIsVisible, false); // выставить флаг - терминал загружен terminalIsLoaded = true; loadChartsEvent.Set(); timeLastAutosave = new ThreadSafeTimeStamp(); timeLastAutosave.Touch(); }
public RequestStatus SendCloseRequest(MarketOrder order, PositionExitReason reason) { if (string.IsNullOrEmpty(order.ExpertComment)) { Logger.ErrorFormat("SignalDealer.SendCloseRequest({0}) - поле ExpertComment не заполнено", order.ID); //return RequestStatus.DealerError; } // получить цену var quote = QuoteStorage.Instance.ReceiveValue(order.Symbol); if (quote == null) return RequestStatus.NoPrice; var price = order.Side > 0 ? quote.GetPrice(QuoteType.Bid) : quote.GetPrice(QuoteType.Ask); // отправить сигнал var signal = new ManagerSignal {Id = order.ExpertComment, PriceClose = (decimal)price, Category = signalCategoryCode, Symbol = order.Symbol, Leverage = 0, Price = (decimal)order.PriceEnter, Side = order.Side}; var timeExec = new ThreadSafeTimeStamp(); timeExec.Touch(); if (!string.IsNullOrEmpty(order.ExpertComment) && !SendSignal(signal, false)) return RequestStatus.DealerError; var endTime = DateTime.Now - timeExec.GetLastHit(); Logger.InfoFormat("Время исполнения SendCloseRequest SendSignal: {0} секунд, {1} миллисекунд", endTime.TotalSeconds, endTime.TotalMilliseconds); timeExec.Touch(); // закрыть ордер немедленно var result = ServerInterface.CloseOrder(order, (decimal) price, reason); endTime = DateTime.Now - timeExec.GetLastHit(); Logger.InfoFormat("Время исполнения SendCloseRequest - CloseOrder: {0} секунд, {1} миллисекунд", endTime.TotalSeconds, endTime.TotalMilliseconds); return result ? RequestStatus.OK : RequestStatus.ServerError; }
public RequestStatus SendNewOrderRequest(Account account, MarketOrder order, OrderType orderType, decimal requestedPrice, decimal slippagePoints) { order.TimeEnter = DateTime.Now; order.State = PositionState.Opened; // подставить текущую цену var quote = QuoteStorage.Instance.ReceiveValue(order.Symbol); if (quote == null) return RequestStatus.NoPrice; order.PriceEnter = order.Side > 0 ? quote.ask : quote.bid; // проверить проскальзывание if (slippagePoints != 0) { var slippageAbs = DalSpot.Instance.GetAbsValue(order.Symbol, slippagePoints); var delta = Math.Abs(order.PriceEnter - (float)requestedPrice); if (delta > (float)slippageAbs) return RequestStatus.Slippage; } if (account.Balance <= 0) { Logger.ErrorFormat("SendNewOrderRequest (счет {0}) - баланс счета равен 0", account.ID); return RequestStatus.DealerError; } // получить уникальный Id сигнала, он же - Magic для ордера // посчитать плечо, пересчитав объем в валюту депо bool areEqual, inverse; var baseTicker = DalSpot.Instance.FindSymbol(order.Symbol, true, account.Currency, out inverse, out areEqual); if (!areEqual && string.IsNullOrEmpty(baseTicker)) { Logger.ErrorFormat("SendNewOrderRequest - неизвестный сивол пересчета базовой валюты ({0})", order.Symbol); return RequestStatus.DealerError; } var rateDepo = 1f; if (!areEqual) { var baseQuote = QuoteStorage.Instance.ReceiveValue(baseTicker); if (baseQuote == null) { Logger.ErrorFormat("SendNewOrderRequest - нет котировки {0} для пересчета базовой валюты", baseQuote); return RequestStatus.DealerError; } rateDepo = inverse ? 1/quote.ask : quote.bid; } var volumeDepo = order.Volume * rateDepo; var leverage = (decimal) volumeDepo / account.Balance; // отправить сигнал var signal = new ManagerSignal { Id = DateTime.Now.Ticks.ToString(), Price = (decimal)order.PriceEnter, Side = order.Side, Symbol = order.Symbol, Leverage = (decimal)leverage, Category = signalCategoryCode }; // !!! // переделал ID сигнала в запись поля expertComment вместо comment //order.Comment = signal.Id; order.ExpertComment = signal.Id; // отправка сигнала успешна?) var timeExec = new ThreadSafeTimeStamp(); timeExec.Touch(); if (!SendSignal(signal, true)) return RequestStatus.DealerError; int posID; // сохранить ордер (и уведомить клиента) var endTime = DateTime.Now - timeExec.GetLastHit(); Logger.InfoFormat("Время исполнения SendNewOrderRequest SendSignal: {0} секунд, {1} миллисекунд", endTime.TotalSeconds, endTime.TotalMilliseconds); timeExec.Touch(); var result = ServerInterface.SaveOrderAndNotifyClient(order, out posID); endTime = DateTime.Now - timeExec.GetLastHit(); Logger.InfoFormat("Время исполнения SendNewOrderRequest - SaveOrderAndNotifyClient: {0} секунд, {1} миллисекунд", endTime.TotalSeconds, endTime.TotalMilliseconds); return result ? RequestStatus.OK : RequestStatus.SerializationError; }