protected sealed override void QuotingProcess()
        {
            try
            {
                if (!OrderSynchronizer.IsAnyOrdersInWork &&
                    PositionSynchronizer.IsPosAndTradesEven)
                {
                    Quote bestQuote = MarketDepth.GetSuitableBestLimitQuote(QuotingSide);

                    if (bestQuote == null)
                    {
                        return;
                    }

                    decimal price  = Security.ShrinkPrice(bestQuote.Price + QuotePriceShift);
                    decimal volume = Math.Abs(Volume) - Math.Abs(Position);

                    if (volume <= 0 || price <= 0)
                    {
                        return;
                    }

                    if (IsLimitPriceAcceptableForQuoting(price))
                    {
                        var order = this.CreateOrder(QuotingSide, price, volume);

                        order.WhenRegistered(Connector)
                        .Do(() => ProcessNicePriceOrder(order))
                        .Once()
                        .Apply(this);

                        OrderSynchronizer.PlaceOrder(order);
                    }
                    else if (IsLimitOrdersAlwaysRepresent && StopQuotingPrice > 0)
                    {
                        var order = this.CreateOrder(QuotingSide, StopQuotingPrice, volume);

                        order.WhenRegistered(Connector)
                        .Do(() => ProcessBadPriceOrder(order))
                        .Once()
                        .Apply(this);

                        OrderSynchronizer.PlaceOrder(order);
                    }
                }
            }
            catch (Exception ex)
            {
                this.AddErrorLog(ex);
                PrimaryStopping();
            }
        }
 private void ProcessBadPriceOrder(Order order)
 {
     Security.WhenMarketDepthChanged(Connector)
     .Do(md =>
     {
         if (OrderSynchronizer.IsAnyOrdersInWork &&
             IsBestQuoteMyQuote(order, MarketDepth.GetSuitableBestLimitQuote(QuotingSide)) &&
             IsTradingTime())
         {
             try
             {
                 OrderSynchronizer.CancelCurrentOrder();
             }
             catch (InvalidOperationException ex)
             {
                 IncrMaxErrorCountIfNotScared();
                 this.AddWarningLog("MaxErrorCount was incremented");
                 this.AddErrorLog(ex);
             }
         }
     })
     .Until(() => !OrderSynchronizer.IsAnyOrdersInWork || IsStrategyStopping())
     .Apply(this);
 }
Exemplo n.º 3
0
        private void AssignEnterRulesAndStart()
        {
            if (_enterStrategy == null)
            {
                throw new NullReferenceException("strategy, when was trying to assign enter rules");
            }

            Security.WhenMarketDepthChanged(Connector)
            .Do(md =>
            {
                if (_lastQuoterPrice == 0)
                {
                    return;
                }

                if (md.BestBid == null || md.BestAsk == null)
                {
                    return;
                }

                var bestQuote = md.GetSuitableBestLimitQuote(_enterStrategy.QuotingSide);

                if (_enterStrategy.QuotePriceShift != 0)
                {
                    if (_lastQuoterPrice != bestQuote.Price ||
                        md.BestPair.SpreadPrice != null && md.BestPair.SpreadPrice.Value <= _spread)
                    {
                        _lastQuoterPrice = 0;

                        _enterStrategy.SafeStop();
                    }
                }

                if (_enterStrategy.QuotePriceShift == 0 && CheckIfSpreadChangedOrItsParts(md.BestPair))
                {
                    _enterStrategy.SafeStop();
                }
            })
            .Until(() => !_isEnterActivated)
            .Apply(this);

            _enterStrategy.WhenOrderRegistered()
            .Do(o =>
            {
                _lastQuoterPrice = o.Price;
            })
            .Until(() => !_isEnterActivated)
            .Apply(this);

            _enterStrategy.WhenNewMyTrade()
            .Do(mt =>
            {
                var sign = 1;

                if (_enterStrategy.QuotingSide == Sides.Sell)
                {
                    sign = -1;
                }

                PositionAndMoneySyncIncrementation(mt.Trade.Volume * sign, mt.Trade.Volume * mt.Trade.Price * sign * -1);

                _leaveStrategy.SafeStop();
            })
            .Until(() => !_isEnterActivated)
            .Apply(this);

            _enterStrategy.PrimaryStrategyStopped += () =>
            {
                ChildStrategies.Remove(_enterStrategy);

                _isEnterActivated = false;
            };


            MarkStrategyLikeChild(_enterStrategy);
            ChildStrategies.Add(_enterStrategy);
        }