суббота, 12 декабря 2009 г.

Ecng.Trading 1.4

Обновление! Выложил новую версию 1.4.1

В новой версии (скачивать отсюда) появились стоп-заявки. Вернее, они были и до этого, но не существовала их полная поддержка: отсутствовал функционал по экспорту через DDE, не было возможности отменять и снимать стоп-заявки. Теперь все это есть:

1. Стоп-заявки регистрируются, изменяются и снимаются через те же методы (здесь и далее будет идти речь об интерфейсе ITrader), что и обычные: RegisterOrder, ReRegisterOrder и CancelOrder.
2. Чтобы получить все стоп-заявки, можно вызвать свойство StopOrders. В принципе, можно это сделать и через свойство Orders, где хранятся как обычные, так и стоп-заявки. Но в этом случае придется отфильтровывать самостоятельно.
3. События NewStopOrders и ChangedStopOrders вызываются при появлении новых стоп-заявок, или когда они изменяются (активизируются, снимаются).
4. Метод GetDerivedOrder позволяет получить заявку, которая была создана стоп-заявкой (вызывать можно только для тех стоп-заявок, для которых Order.DerivedOrderId не равен null). Производная заявка появляется в системе тогда, когда активизируется стоп. Метод полезен тогда, когда необходимо узнать, какие из сделок были созданы в рамках стоп-заявки. Напрямую это узнать невозможно, так как стоп-заявки не существуют физически на биржах, и есть только связь между обычной заявкой и сделкой.

Традиционно, скриншоты с изменениями DDE (коснулось не только таблицы стоп-заявок, но и обычных):



Обновленный info.wnd файл лежит в архиве.

Как создавать и работать со стоп-заявками, я показал с своем примере, который расширил функционально:



Изменения коснулись и алгоритма котирования, который появился в версии 1.3 под названием MarketOrderRegistry. Идея мне понравилась, а вот реализация нет. Да так, что хотелось вырвать из блога пост и бросить его в печку. Что не понравилось и что переделал:

1. Название MarketOrderRegistry не отражает саму идею котирование. Поэтому теперь класс называется QuotingAlgo.
2. Котирование происходило только в одном режиме - рыночная цена. Теперь их четыре: по рыночной цене (причем эта опция так же разбивается на три под-опции), по последней сделке, по лучше цене, по лучшему объему. За подробностями в документацию по QuotingTypes.
3. Не была сделана парадигма торговых заданий, которую я придерживаюсь с самого начала. Теперь все задания котирования выделены отдельным классом QuotingTask. И этих самых тасков (=заданий) можно создавать неограниченное количество.

33 комментария:

  1. Привет, а исходники библиотеки увидеть можно ?

    ОтветитьУдалить
  2. Если библиотеки не достаточно для Ваших задач, давайте обсудим, что мешает ее использовать такую, какая она есть сейчас?

    ОтветитьУдалить
  3. В версии 1.3 я просто мог закрыть таблицу "Все сделки" и Trader.StartDde() не выдавал ошибок.

    А в версии 1.4 это невозможно?

    У меня выдает ошибки.

    ОтветитьУдалить
  4. HaMMeR,

    Интересно. Вообще, конечно, метод экспорта рассчитан на то, что будут запускаться нужные окна. Так как Вы вызываете метод без параметров, то на запуск идут все окна. Вам нужно вызывать перегруженный метод StartDde(DdeTables), где можно указать только те окна, которые нужно экспортировать. И такое поведение сохранялось всегда.

    Но, что стоит отметить, порядок выбора того, что нужно экспортировать, а что нет, должен зависеть от простых правил: информацию об инструментах необходимо экспортировать хоть раз, иначе ничего другое не будет появляться (инструменты, это основа), мои сделки не могут появиться в QuikTrader, пока не появились заявки.

    ОтветитьУдалить
  5. Добрый день)
    Видел ваши сообщения на форуме квика - тоже заинтересовала возможность прямого получения данных через winros. Не могли бы вы подсказать что знаете по этой теме?)
    icq 264 540 285, mail nn1317@yahoo.com
    Ваших координат я нигде не нашел (обычно почту указывают в начале кода программы;), поэтому пишу сюда.

    ОтветитьУдалить
  6. nn1317,

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

    ОтветитьУдалить
  7. HaMMeR,

    стандартная процедура - попробуйте запускать экспорт ручками, из квика. и только их. что происходит в этом случае?

    ОтветитьУдалить
  8. Сделал все как вы посоветовали и заметил следующее.

    если в инструментах есть Акции то инструменты не выводятся.
    Screenshot

    А если толко фьючерсы, то кажится все нормально.

    Screenshot

    ОтветитьУдалить
  9. А что будет, если только акции? У меня этот вариант работает нормально (в принципе, как и все другие, но пока остановимся на этом).

    ОтветитьУдалить
  10. На первом скрине только акции. Инструменты не выводятся.

    ОтветитьУдалить
  11. После изменения Региональных настоек системы кажится все начало работать.

    Спасибо

    ОтветитьУдалить
  12. Добрый день, большой респект за труды!

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

    Как уважаемый администратор на это смотрит?
    Также очень хотелось бы пообщаться в ICQ или Skype. Мой емэйл для связи если заинтересует Andreifx@mail.ru

    С уважением, Андерй

    ОтветитьУдалить
  13. Здравствуйте, с наступающим!
    Я Вам отправил емэйл, но пока молчок...я наверное бы хотел попросить Вас сделать привод как бы на заказ(за деньги). Если Вы такой тип сотрудничества рассматриваете, буду очень рад.

    И вопрос наверное делитанский: скажите пожалуйста, файл info.wnd какие функции выполняет? Для чего он нужен?

    Спасибо и еще раз с наступающим!

    ОтветитьУдалить
  14. andreifx,

    Спасибо. Нашел в спаме. Отвечу письмом.

    ОтветитьУдалить
  15. andreifx,

    info.wnd - это файл настроек таблиц в Квике. В документации от Квика написано подробнее, что в него входит. Я его вкладываю в архив для того, чтобы сразу правильно настроить необходимые таблицы для экспорта через ДДЕ.

    ОтветитьУдалить
  16. Спасибо за ответ, буду разбираться.

    ОтветитьУдалить
  17. Добрый день.
    Подскажите пожалуйста событие NewMyTrades генерируется при появлении собственных рыночных сделок или вообще любого типа ордеров(market,limit,stop)?
    И еще, событие NewOrders генерируется при появлении новых данных в стакане, так?

    ОтветитьУдалить
  18. andreifx,

    NewMyTrades - это событие генерируется, когда происходят собственные сделки по любым типам ордеров. Проще говоря, когда появляется строчка в таблице Мои Сделки.

    NewOrders - когда появляется строчка в таблице Заявки, или когда программа регистирует заявку через RegisterOrder.

    Стакан - это совокупность всех заявок (как собственных, так и чужих). Чужие заявки биржа не дает просматривать.

    ОтветитьУдалить
  19. Спасибо за ответ!
    Продолжаю разбираться, возник очередной вопрос касательно Ecng.Xaml(из демо примера), а точнее метода
    public static void Sync(...) данного класса.
    Я так понял используется для синхронизации IEnumerable коллекции с ListView например, но использование данного класса(Ecng.Xaml) к сожалению возможно только в WPF приложениях(при подключении Ecng.Xaml в Windiws Forms выдает ошибку ). У вас случайно нету варианта данного класса или исходника этого метода для работы в обычных windows forms ?

    ОтветитьУдалить
  20. 1) Я ваш файл загружал, правда сразу закрывал таблицу "Все сделки" ща попробовал вроде без ошибок отработало всё... но если честно эта ошибка меня не сильно волнует, хотя было бы логично сделать проверку, мол если какие то окна отсутствуют просто их пропускать (если конечно это не влияет на дальнейшую работоспособность, а если мешают, то выводить сообщение)

    2) меня больше интересует невозможность создания заявки :) номер счёта же по идее не участвует в запросе... я так думаю косяк в формате даты... (я дебагом глянул, там дата ваще какая то левая, типо 10.10.1970) тока я не могу разобраться из-за чего етот косяк...

    ОтветитьУдалить
  21. 1. Сделки еще как влияют. Если Вы хотите кастомизированную логику - QuikTrader.StartDde(DdeTables) и QuikTrader.StartDde(string). В том то и дело, что это библиотека упрощения работы с торговой программой. И каждый роботовод сам должен обрабатывать свои собственные особенности системы. Иначе - только сужение возможностей роботов, что мне делать не хочется вообще.

    2. При регистрации заявки должен передаваться идентификатор счета... Как и откуда Вы получили эту дату?

    ОтветитьУдалить
  22. 1) ок, терь всё понятно стало полностью

    2) когда ошибка вылетает он мне перечиляет:
    ACCOUNT=77777; CLIENT_CODE=XXX;
    где 77777 это номер моего счёта (его я изменил), а вот там где XXX должно тоже что нить быть?
    Просто по идее, я же руками ничего не ввожу кроме цены и количества лота, т.е. данные типа номер счёта и время берётся уже из вашей программы... может проблема в региональных настройках?!

    ОтветитьУдалить
  23. CLIENT_CODE - это необязательный параметр, который я заполняю обычным XXX.

    Я не совсем понял, про какую дату идет речь? Где Вы ее увидели в примере?

    ОтветитьУдалить
  24. я когда дебагом объект order смотрел там есть параметр time он у меня был 01.01.1970, но скорее всего тут не в дате дело, а в чом - мне не понятно.

    в версии 1.5 ошибка повторилась

    ОтветитьУдалить
  25. http://depositfiles.com/files/dfe8mc00e
    http://depositfiles.com/files/nlvtt9ckh
    ссылки на скрины ошибки

    ОтветитьУдалить
  26. А другие примеры работают? Например, SampleConsole? По всей видимости особенность брокерских настроек. Попробуйте задать вопрос на форуме Квик. Она обычно знают, как у их клиентов сконфигурирована система.

    ОтветитьУдалить
  27. другие примеры не пробывал пока ещё...
    я использую Quick-Junior с тестовым рынком может из-за этого и проблемы

    ОтветитьУдалить
  28. Mika я был бы вам очень признателен и благодарен, еслиб вы помогли пофиксить эту ошибку для Quick-Junior, так как мне как новичку очень удобно работать с тестовой биржей

    ОтветитьУдалить
  29. Вы правы, я использовал вместо счёта логин в КВИКЕ *wall*
    Сейчас поставил счёт - всё работает.
    Спасибо.

    ОтветитьУдалить