Ejemplo n.º 1
0
        public void CopyCheckNull(ThreadSafeTimeStamp source)
        {
            if (source == null)
            {
                return;
            }
            var sourceStamp = Interlocked.CompareExchange(ref source.lastHit, 0, 0);

            Interlocked.Exchange(ref lastHit, sourceStamp);
        }
Ejemplo n.º 2
0
 public void CopyCheckNull(ThreadSafeTimeStamp source)
 {
     if (source == null) return;
     var sourceStamp = Interlocked.CompareExchange(ref source.lastHit, 0, 0);
     Interlocked.Exchange(ref lastHit, sourceStamp);
 }
Ejemplo n.º 3
0
 public void Copy(ThreadSafeTimeStamp source)
 {
     var sourceStamp = Interlocked.CompareExchange(ref source.lastHit, 0, 0);
     Interlocked.Exchange(ref lastHit, sourceStamp);
 }
Ejemplo n.º 4
0
        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;
        }
Ejemplo n.º 6
0
        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();
        }
Ejemplo n.º 7
0
 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;
 }
Ejemplo n.º 8
0
        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;
        }
Ejemplo n.º 9
0
 private UserSettings()
 {
     lastTimeModified = new ThreadSafeTimeStamp();
 }
Ejemplo n.º 10
0
        public void Copy(ThreadSafeTimeStamp source)
        {
            var sourceStamp = Interlocked.CompareExchange(ref source.lastHit, 0, 0);

            Interlocked.Exchange(ref lastHit, sourceStamp);
        }