//Инициализируем котирование
        private void InitializationQuoting()
        {
            //Используем котирование, которое работает только на лимитных заявках
            _quoting = new Quoting(this, (int)Parameter(6))
            {
                MaxFrequencyMovingOrder = TimeSpan.FromSeconds((int)Parameter(7)),
                MaxQuotingTime          = TimeSpan.FromSeconds((int)Parameter(8)),
                UseModifyOrder          = false
            };

            //Выводим в лог события возникающие в процессе котирования
            _quoting.PositionChanged       += position => MessageToLog($"Quoting: New position ({position})");
            _quoting.Stopped               += () => MessageToLog("Quoting stopped");
            _quoting.MaxQuotingTimeExpired += MessageToLog;
            _quoting.Errors   += MessageToLog;
            _quoting.Complete += (a1, a2) => MessageToLog("Quoting complete");

            _quoting.OrderChanged += (price, volume) =>
            {
                MessageToLog($"Quoting: Order changed ({price} | {volume})");

                //Визуализируем на графике место, где заявка была переставлена
                _quotingOrderChanged.Add(_lastTime, (double)(price + GetSecurity().Tick * 20), $"Quoting: Order changed ({price} | {volume})");
            };
        }
Ejemplo n.º 2
0
        private void ProcessCandle(Candle candle)
        {
            try
            {
                //Добавляем новую свечку для расчетов в индикаторы
                //Добавляем до проверки актуальности данных, так как возможна предзагрузка исторических данных
                var top    = _top.Add(candle.ClosePrice);
                var bottom = _bottom.Add(candle.ClosePrice);

                //Проверка актуальности данных
                if (!GetRealTimeData())
                {
                    return;
                }

                //Если индикаторы не сформированы, то ничего не делаем
                if (!_top.IsFormed || !_bottom.IsFormed)
                {
                    return;
                }

                //Текущая позиция по выбранному коннектору и инструменту
                var position = GetTradeInfo().Position;

                if (candle.ClosePrice <= bottom && position <= 0)
                {
                    var limitOrder = new Order
                    {
                        Type      = OrderType.Limit,
                        Direction = Direction.Buy,
                        Volume    = position < 0 ? -position : _volume, //Закрываем полностью позицию или открываем новую
                        Price     = candle.ClosePrice
                    };

                    _customValuesBuy.Add(candle.CloseTime, (double)(limitOrder.Price + GetSecurity().Tick * 25), $"BUY ORDER\nTime: {candle.CloseTime.ToString("dd.MM.yyyy HH:mm:ss.fff")}\nVolume: {limitOrder.Volume}");

                    //Отправляем лимитную заявку на регистрацию
                    RegisterOrder(limitOrder);
                }

                if (candle.ClosePrice >= top && position >= 0)
                {
                    var limitOrder = new Order
                    {
                        Type      = OrderType.Limit,
                        Direction = Direction.Sell,
                        Volume    = position < 0 ? -position : _volume,
                        Price     = candle.ClosePrice
                    };

                    _customValuesSell.Add(candle.CloseTime, (double)(limitOrder.Price - GetSecurity().Tick *25), $"SELL ORDER\nTime: {candle.CloseTime.ToString("dd.MM.yyyy HH:mm:ss.fff")}\nVolume: {limitOrder.Volume}");

                    //Отправляем лимитную заявку на регистрацию
                    RegisterOrder(limitOrder);
                }
            }
            catch (Exception ex)
            {
                ExceptionMessage(ex, "ProcessCandle");
            }
        }