← 返回

что с PositionManager?

Всем привет!

Попробовал создать стратегию и вроде все получилось, но не могу получить размер позиции Стратегия обрабатывается по приходу новых сделок

 
protected override void OnStarting()
        {
            this
                .When(Security.SecurityNewTrades())
                .Do(MakePosition);
	
            base.OnStarting();
        }

В процедуре MakePosition такой код


        ...
        var _myPosition = Trader.GetPosition(Portfolio, Security);
        	if (_myPosition != null)
        	{
	        Console.WriteLine("Position current value: {0}", _myPosition.CurrentValue);
		Console.WriteLine("Position begin value: {0}", _myPosition.BeginValue);
		Console.WriteLine("Position blocked value: {0}", _myPosition.BlockedValue);        		
        	}


	if (lastTrade.Volume > 3)
            {
                var condition = true;
                var conditionDirection = (first > last);
                if (condition && !_gotPosition)
                {
                    var direction = conditionDirection ? OrderDirections.Buy : OrderDirections.Sell;
                    var order = this.CreateOrder(direction, Security.GetMarketPrice(direction), Volume);
		   RegisterOrder(order);
		   _gotPosition = true;
                }
            }

PositionManager.Position всегда показывает 0. Покопавшись на форуме нашел что можно получить позицию из трейдера, но Trader.GetPosition() у меня всегда возвращает null, даже когда проходит не одна сделка, а несколько. Пришлось заводить переменную _gotPosition чтобы понять что позиция есть. Чуть не забыл, проверял на фьюче сбера.

本主题对您有帮助吗?

分享主题

评论 (4)

登录创建账户, 登录或注册以发表评论

Alexander
Alexander

Какой шлюз? Покажите скриншот квика если это квик где будет видно что позиция != 0 и при этом распечатайте для какого конкретно инструмента пытаетесь взять позу.

Johny Cash
Johny Cash 作者

Да, это QuikTrader. Версия стокшарпа 4.1 из дев ветки, на 4.0.23 пробовал, тоже самое.


 public void MakePosition()
        {
            var lastTrade = Security.LastTrade;
            
            ...            

            [b]if (PositionManager.Position != 0)
                _gotPosition = true;[/b]            
            var _myPosition = Trader.GetPosition(Portfolio, Security);
        	if (_myPosition != null)
        	{
				Console.WriteLine("Position current value: {0}", _myPosition.CurrentValue);
				Console.WriteLine("Position begin value: {0}", _myPosition.BeginValue);
				Console.WriteLine("Position blocked value: {0}", _myPosition.BlockedValue);        		
        	}


			if (lastTrade.Volume > 3)
            {
                var condition = true;
                var conditionDirection = (first > last);
                if (condition && !_gotPosition)
                {
                    var direction = conditionDirection ? OrderDirections.Buy : OrderDirections.Sell;
                    var order = this.CreateOrder(direction, Security.GetMarketPrice(direction), Volume);
					RegisterOrder(order);
					_gotPosition = true;
                }
            }
        }

И еще момент, может это поможет решению, когда пытался регистрировать через MarketQuotingStrategy то в логах не проходило состояние State=Done, хотя до этого приходили состояния None и Active.

Alexander
Alexander

у вас и GetPosition возвращает null и PositionManager возвращает 0? Что говорит verifier? Скиньте скриншот всего квика тогда

Johny Cash
Johny Cash 作者

Пардон, это мой косяк, не экспортировал таблицу позиций по деривативам. Посыпаю голову пеплом...