ddd888
|
Дата: 13.04.2010
Да, что хорошо в Ваших уклончивых ответах - они стимулируют процесс познания. :)) Хоролшо бы еще разобраться как это сделать. :) До сих пор это слово - Debug - меня очень сильно пугало своей темной непостижимостью. Наверное, по нему где-то и проходит водораздел между настоящими программистами и любителями. :)
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 14.04.2010
Ставится точка останова - F9. Запускается программа из студии через F5. Все, работаете в программе до тез пор, пока не сработает точка. Далее, на переменной мышкой и в контекстном меню выбираете нужное действие.
|
|
Спасибо:
|
|
|
|
|
ddd888
|
Дата: 14.04.2010
Спасибо, оказывается эта техника и называется Debug. :) Все оказалось не так страшно. Я и раньше этим пользовался. Правда, почему-то на точке останова программа не всегда останавливается. Или я что-то не учитываю ...
Есть такой вопрос. Стал переходить на 1.8. Выглядит еще более интересным и навороченным вариантом и поэтому не стал лениться и теперь все новые коды перевожу из 1.7 в 1.8. Вручную, правда, всегда есть риск что-то забыть. Существует ли какой-то алгоритм автоматического внесения изменений?
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 14.04.2010
Автоматическое внесение изменений - это VS 2008 + руки. Это не шутка. Хотя все не так страшно. Я перевел свои разработки практически за день + день тестирование.
Не увидел Вашего поста про ссылка на Security. Можете выделить в простое приложение и прислать если не будет работать. Как вариант, взять SampleConsonle
|
|
Спасибо:
|
|
|
|
|
ddd888
|
Дата: 15.04.2010
|
|
|
|
Да, за день я тоже управился с переводом своих кодов и уже добавил кучу новых. :) С ссылкой на Security все в порядке - там все работает. А сейчас плотно работаю с классом Strategy и возникает такая проблема: в моей стратегии на основе Strategy после подачи сигнала к покупке, делаю следующее:
// создаем заявку var order = base.CreateOrder(OrderDirections.Buy, this.Price, base.Volume); // регистрируем ее (обычным способом лимитированной заявкой) base.Trader.RegisterOrder(order); // добавляем зарегистрированную заявку в стратегию base.AddOrder(order);
т.е. все почти как в Вашем примере. Проверяю затем позицию:
Console.WriteLine(base.PositionManager.Position.ToString() + " | "+ this.PositionManager.Position.ToString());
и в итоге даже после совершения сделки там стоит "0". Почему так происходит? Как правильно отследить совершенную сделку?
Потом почему-то Strategy начинает самопроизвольно делать "отмену ордеров", которых и так нет, что приводит к появлению непрекрающегося потока сообщений об исключении от квика: "нельзя отменить заявку". Что может подавать такие заявки, base.AddOrder(order);?
Если включить сюда try{}catch{}, то такие сообщения исчезают.
Нет ли возможности узнать подробнее "устройство" класса Strategy?
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 16.04.2010
1. А точно код base.PositionManager.Position вызывается после появления в программе сделки? если вызывать в NewMyTrades? 2. Strategy - это абстрактный класс, не имеющий торговой реализации. Он ни регистрирует, ни снимает заявки. Думаю, работает какой-то другой код. try-catch что оборачивали?
|
|
Спасибо:
|
|
|
|
|
ddd888
|
Дата: 16.04.2010
|
|
|
|
1. Код base.PositionManager.Position стоит в методе OnProcess(). Как я понял этот метод исполняется всякий раз с установленным интервалом (у меня 1 сек). Если он исполняется, то ведь и base.PositionManager.Position должен при каждой итерации воспроизводить то значение, которое у него устанавлено данным экземпляром стратегии? Может, я неправильно понимаю смысл слов "появления в программе сделки", но мое понимание, на основании предложенных примеров, такое: а) появление в программе сделки = запуск NewMyTrades, а) после запуска своей стратегии OnStrategyPropertyChanged меняет соответствующие свойства экземпляра стратегии, в т.ч. и свойства PositionManager.Position, которое должно обновляться после совершения сделки, б) _manager.Register(_strategy); запускает менеджер (правда, пока совсем не понимаю, что он конкретно делает, но я старался максимально придерживаться предложенного примера, поэтому оставил его в коде).
2. try-catch обернул первоначально base.Trader.RegisterOrder(order); и base.AddOrder(order); но сейчас понял, что отмену заявок скорее вызывает этот метод:
base.Orders.Where(o => o.State == OrderStates.Active).ForEach(base.Trader.GuarantyCancelOrder);
но ведь после совершения сделки в рамках стратегии в квике OrderStates.Active должен меняться соответственно? Т.е. если сделка фактически совершилась, то ведь кол-во активных заявок в стратегии должно каждый раз обнуляться? А получается, что это не так - в "активе" остается накопленное кол-во ОТПРАВЛЕННЫХ заявок, а это, как я понимаю, не то, для чего создаваось свойство OrderStates.
Мне кажется нужны более подробные объяснения работы класса, чтобы им можно было безопасно пользоваться. Или, как вариант, может, проще просто привести его код? :)
|
|
Спасибо:
|
|
|
|
|
ddd888
|
Дата: 20.04.2010
В инстуркции для примера у Вас написано: "Для учета общей прибыли- убытка (P&L) в торговом роботе необходимо использовать дочерние классы от BasePnLManager". В случае со стратегией - все понятно из примера. А как использовать другие дочерние классы? Например, как с помощью SecurityPnLManager рассчитать прибыль-убыток для конкретного инструмента?
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 20.04.2010
var manager = new SecurityPnLManager(security, trader); manager.PnLChanged += ...
|
|
Спасибо:
|
|
|
|
|
ddd888
|
Дата: 20.04.2010
Спасибо. Наверное, следовало догадаться. :) В форуме где-то был аналогичный вопрос и как я понял, Ваши классы - менеджеры считают позиции только внутри дня. Т.е. они используют только внтуридневные данные "всех сделок" и "моих сделок"?
|
|
Спасибо:
|
|
|
|