Управление стаканом котировок
Atom
30.03.2010


Добрый день, Михаил! Как-то заметил, что стакан котировок отображается
не совсем правильно - цена почему-то не снижается сверху вниз по всей
глубине, а начинается с мимнимальной котировки и повышается сверху
вниз по "биду", а в месте где начинается "аск" "переворачивается и
снова начинается с самой маленькой котировки "аск" и так повышается до
самого низа. Думал отсортировать данные на этапе прихода данных:

this.Trader.ProcessWellKnownDdeData += (name, dict) =>
// узнаем, что пришедшие данные отвечают за стакан
if (name.Contains("stock"))
// первичная сортировка по цене
IEnumerable<Quote> _curquotes = (IEnumerable<Quote>)dict;
_curquotes = _curquotes.OrderBy(t => t.Price);
... и т.д.

но это ни к чему не привело. Подскажите, пожалуйста, как правильно
отсортировать данные?

Еще здесь был как-то уже вопрос про доступ к отдельным значениям
котировок в стакане, но объяснения я так и не нашел. Как же все-такии
это можно сделать (получить значение той или иной котировки в стакане
для анализа)?

Теги:


Спасибо:


<< < 2 3 4 5 6  > >>
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
Ответить


Спасибо. Наверное, следовало догадаться. :)
В форуме где-то был аналогичный вопрос и как я понял, Ваши классы -
менеджеры считают позиции только внутри дня. Т.е. они используют
только внтуридневные данные "всех сделок" и "моих сделок"?

Спасибо:
<< < 2 3 4 5 6  > >>

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

loading
clippy