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


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

Код

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 ); // Не равны


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

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


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

Теги:


Спасибо:




3 Ответов
Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 08.01.2011
Ответить


aerv Перейти

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


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

aerv

Фотография
Дата: 09.01.2011
Ответить


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

Это мне понятно, мне непонятно:
как в своем коде указать стратегии, что она уже имеет позицию по бумаге и должна ее дальше "вести", в соответствии с заложенной в стратегии логикой.
Я ожидал нечто подобное:
Код
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 мне кажется наиболее правильным. Для вычисления текущей позиции нужно будет лишь к вычисленному по трейдам числу прибавлять это значение. Так, пожалуй, и сделаю.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 09.01.2011
Ответить


aerv Перейти

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


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


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy