//Инициализируем котирование 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})"); }; }
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"); } }