суббота, 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. И этих самых тасков (=заданий) можно создавать неограниченное количество.

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

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

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

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

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

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

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

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

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

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

    честно говоря немного побаиваюсь по поводу того, что некоторые данные могут не туда улететь. Рефлектор конечно в помощь, в большинстве случаев там все равно понятно что написано - имена классов и публичных методов остались нормальными ;)

    библиотечку обязательно потестирую, спасибо за неё :)

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

    ОтветитьУдалить
  7. Антон,

    познавательная ссылка http://demotivation.ru/sqlik6fj6wx5pic.html о безопасности своих данных.

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

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

    ОтветитьУдалить
  9. Mika.

    Помогите пожалуйста разобраться.

    Обновленный info.wnd файл загружаю.

    Проект Sample стартую. Далее "Подключиться", "Вывод по DDE".

    Но список Инструментов не загружается. Ошибок нет. Но и данных тоже.

    Переповерил все 100 раз.

    Попробовал и Учебном и в реалном QUIK-e. не пашет. Только в окошке Портфеля видны данные, все осталюные таблицы в программе пусты.

    В коде ничего не менял, в QUIK-e тоже.

    Спасибо заранее

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

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

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

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

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

    Screenshot

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

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

    ОтветитьУдалить
  14. Вот что выводит QuikTrader.DdeError

    String was not recognized as a valid DateTime.

    StackTrace
    at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)
    at System.Convert.ToDateTime(String value, IFormatProvider provider)
    at System.String.System.IConvertible.ToDateTime(IFormatProvider provider)
    at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
    at Ecng.Common.Converter.To(Object value, Type destinationType)
    at Ecng.Common.Converter.To[T](Object value)
    at Ecng.Trading.QuikWrapper.QuikTrader.(String , IList`1 )
    at .()

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

    Спасибо

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

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

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

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

    ОтветитьУдалить
  17. Этот комментарий был удален автором.

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

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

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

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

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

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

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

    ОтветитьУдалить
  21. Здравствуйте. Скажите пожалуйста, как с помощью ваших библиотек я могу определить стоимость одного пункта для фьючерса ртс(или других инструментов, торгующихся на фортс)?

    ОтветитьУдалить
  22. Vladimir31,

    Библиотека одна - Ecng.Trading. Стоимость пункта цены Security.MinStepSize.

    ОтветитьУдалить
  23. Да, но Security.MinStepSize возвращает минимальный шаг цены в единицах самой цены, т.е. для фьючерса РТС например она вернет видимо 5. Мне бы хотелось получить стоимость пункта в рублях(в данный момент для фьючерса РТС это порядка 0,64 рубля). Стоимость пункта для фьючерса РТС считается как 0.02*Курс$ЦБ. Есть ли какие то свойства или методы вашей библиотеки, позволяющие получить данную стоимость или позволяющие получить актуальный курс доллар/рубль по ЦБ? И еще один похожий вопрос : как можно получить размер гос.обеспечения?

    ОтветитьУдалить
  24. Vladimir31,

    1. Если найдете, как вывести курс (а еще лучше сразу цену за пункт) в таблице инсрументов, то можно получить эти данные через ProcessDde (http://stockmarketdotnet.blogspot.com/2009/11/ecngtrading-13.html). Если в Квике нет - значит это невозможно получить и через библиотеку, так как она опирается только на торговые программы, и больше ни на что. Как вариант, можно подключить в программу веб сервис http://www.cbr.ru/dailyinfowebserv/dailyinfo.asmx (если Вы программируете на .NET).

    2. Так же как в пункте 1 http://stockmarketdotnet.blogspot.com/2009/11/ecngtrading-13.html. Добавить еще одну таблицу с колонками ГО покупателя и продавца.

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

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

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

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

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

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

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

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

    Случайно завалялся (я под WinForms писал мало, так что отдельной библиотеки уже нет):

    public class SyncBindingSource : BindingSource
    {
    private readonly Form _form;

    public SyncBindingSource(Form form)
    {
    if (form == null)
    throw new ArgumentNullException("form");

    _form = form;
    }

    protected override void OnListChanged(ListChangedEventArgs e)
    {
    if (_form != null && _form.InvokeRequired)
    _form.Invoke(new Action(OnListChanged), e);
    else
    {
    base.OnListChanged(e);
    }
    }
    }

    ОтветитьУдалить
  30. Здравствуйте.
    Спасибо за библу и блог, для меня оказался очень полезным.

    Почему то возникает ошибка при запуске "Экспорта DDE" вылетает тут:
    this.Trader.StartDde();
    с ошибкой
    "Значение не может быть неопределенным.
    Имя параметра: window"

    такая же ошибка и при закрытие программы при вызове
    this.Trader.StopDde();

    т.е. я так понимаю типо в библе нет метода без параметров.

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

    но так и не смог сделать заявку
    валится тут:

    this.Trader.RegisterOrder(order);

    с ошибкой:
    Код ошибки WrongSyntax Сообщение ACCOUNT=77777; CLIENT_CODE=XXX; TYPE=L; TRANS_ID=1; CLASSCODE=QJSIM; SECCODE=LKOH; ACTION=NEW_ORDER; OPERATION=B; QUANTITY=1; PRICE=1716; EXECUTION_CONDITION=PUT_IN_QUEUE;

    подскажите в какую сторону рыть :)

    ОтветитьУдалить
  31. Aleks,

    А у Вас точно все таблицы имеют теже названия, что на рисунках? Эта ошибка говорит о том, что по названию не была найдена таблица. Чтобы было проще начинать работать с библиотекой я вложил в архив файл info.wnd. Это файл настроек Квика.

    Заявка не регистрируется. Может быть дело в неправильном номере счета?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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