Как подхватить в стратегии текущий размер позиции

Как подхватить в стратегии текущий размер позиции
Atom
1/7/2011


После успешного старта стратегии обнаруживаю разницу

Code

var pos = _trader.Positions.First(p => p.Security == _security);
int tp = pos != null ? pos.CurrentValue : 0; // = 1
int sp = _strategy.PositionManager.Position; // = 0
Assert.AreEqual( tp, sp ); // Не равны


Как сделать, чтобы стратегия "подхватила" текущую позицию по бумаге?
Возможны (нужны) два варианта:
Code

// Сегодня были сделки
_trader.MyTrades.Count(t=> t.Trade.Security == _security) > 0
// Сделки были когда-то давно
_trader.MyTrades.Count(t=> t.Trade.Security == _security) == 0


Научите меня, пожалуйста, как поступить или поправьте, если ошибаюсь.
А может просто, в стратегии использовать не _strategy.PositionManager.Position, а _strategy.Trader.Positions
?

Tags:


Thanks:


Mikhail Sukhov

Avatar
Date: 1/9/2011
Reply


aerv Go to

Научите меня, пожалуйста, как поступить или поправьте, если ошибаюсь.
А может просто, в стратегии использовать не _strategy.PositionManager.Position, а _strategy.Trader.Positions
?


Сразу поправлю. Strategy.Position - это позиция по стратегии. А Trader.Positions - это позиции по бумагам. Стратегий по одной и той же бумаге может быть несколько. Если у Вас не так, используйте Trader.Positions. Если же все таки так, то надо самостоятельно где-то в своем коде восстанавливать текущую позицию.
Thanks:

aerv

Avatar
Date: 1/9/2011
Reply


Mikhail Sukhov Go to
Стратегий по одной и той же бумаге может быть несколько. Если у Вас не так, используйте Trader.Positions. Если же все таки так, то надо самостоятельно где-то в своем коде восстанавливать текущую позицию.

Это мне понятно, мне непонятно:
как в своем коде указать стратегии, что она уже имеет позицию по бумаге и должна ее дальше "вести", в соответствии с заложенной в стратегии логикой.
Я ожидал нечто подобное:
Code
var pos = _trader.Positions.FirstOrDefault(p => p.Security.Code == _secCode);
_strategy = new SmaStrategy();
_strategy.PositionManager.Init( pos != null ? pos.CurrentValue : 0 );
// Или
_strategy.PositionManager.StartPosition = pos != null ? pos.CurrentValue : 0;

но так нельзя, подскажите, пожалуйста, как можно.
Сохраненной информации о старых трейдах по этой бумаге у меня, допустим, нет.
Закрывать позицию вручную в терминале и потом открыть с помощью стратегии, конечно можно, но это не подходящий вариант для меня.

Можно, наверное, MyTrade создать и добавить в Trades, но что-то не пойму как, да и способ это кривой.
Вариант со _strategy.PositionManager.StartPosition мне кажется наиболее правильным. Для вычисления текущей позиции нужно будет лишь к вычисленному по трейдам числу прибавлять это значение. Так, пожалуй, и сделаю.
Thanks:

Mikhail Sukhov

Avatar
Date: 1/10/2011
Reply


aerv Go to

Можно, наверное, MyTrade создать и добавить в Trades, но что-то не пойму как, да и способ это кривой.
Вариант со _strategy.PositionManager.StartPosition мне кажется наиболее правильным. Для вычисления текущей позиции нужно будет лишь к вычисленному по трейдам числу прибавлять это значение. Так, пожалуй, и сделаю.


Наиболее правильный будет как раз не менять существующий алгоритм подсчета, а подсунуть псевдо-данные для вычисления, произведя некоторую эмуляцию... Сделайте наследник от QuikTrader и в нем принудительно вызовите метод GetMyTrade. Этот метод возвращается сделку, и если она отсутсвует, то создает ее. Создавать объекты Order и MyTrade можно через new, внутри нет никакого специального подсчета.
Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy