Обновление! Выложил новую версию 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. И этих самых тасков (=заданий) можно создавать неограниченное количество.
Подписаться на:
Комментарии к сообщению (Atom)
Привет, а исходники библиотеки увидеть можно ?
ОтветитьУдалитьЕсли библиотеки не достаточно для Ваших задач, давайте обсудим, что мешает ее использовать такую, какая она есть сейчас?
ОтветитьУдалитьВ версии 1.3 я просто мог закрыть таблицу "Все сделки" и Trader.StartDde() не выдавал ошибок.
ОтветитьУдалитьА в версии 1.4 это невозможно?
У меня выдает ошибки.
HaMMeR,
ОтветитьУдалитьКакие именно?
HaMMeR,
ОтветитьУдалитьИнтересно. Вообще, конечно, метод экспорта рассчитан на то, что будут запускаться нужные окна. Так как Вы вызываете метод без параметров, то на запуск идут все окна. Вам нужно вызывать перегруженный метод StartDde(DdeTables), где можно указать только те окна, которые нужно экспортировать. И такое поведение сохранялось всегда.
Но, что стоит отметить, порядок выбора того, что нужно экспортировать, а что нет, должен зависеть от простых правил: информацию об инструментах необходимо экспортировать хоть раз, иначе ничего другое не будет появляться (инструменты, это основа), мои сделки не могут появиться в QuikTrader, пока не появились заявки.
> Если библиотеки не достаточно для Ваших задач, давайте обсудим, что мешает ее использовать такую, какая она есть сейчас?
ОтветитьУдалитьчестно говоря немного побаиваюсь по поводу того, что некоторые данные могут не туда улететь. Рефлектор конечно в помощь, в большинстве случаев там все равно понятно что написано - имена классов и публичных методов остались нормальными ;)
библиотечку обязательно потестирую, спасибо за неё :)
Добрый день)
ОтветитьУдалитьВидел ваши сообщения на форуме квика - тоже заинтересовала возможность прямого получения данных через winros. Не могли бы вы подсказать что знаете по этой теме?)
icq 264 540 285, mail nn1317@yahoo.com
Ваших координат я нигде не нашел (обычно почту указывают в начале кода программы;), поэтому пишу сюда.
Антон,
ОтветитьУдалитьпознавательная ссылка http://demotivation.ru/sqlik6fj6wx5pic.html о безопасности своих данных.
nn1317,
ОтветитьУдалитьПрямой возможностью winros я бы не назвал. Связываться с этой утилитой не захотел, потому что не видел в ней никаких преимуществ.
Mika.
ОтветитьУдалитьПомогите пожалуйста разобраться.
Обновленный info.wnd файл загружаю.
Проект Sample стартую. Далее "Подключиться", "Вывод по DDE".
Но список Инструментов не загружается. Ошибок нет. Но и данных тоже.
Переповерил все 100 раз.
Попробовал и Учебном и в реалном QUIK-e. не пашет. Только в окошке Портфеля видны данные, все осталюные таблицы в программе пусты.
В коде ничего не менял, в QUIK-e тоже.
Спасибо заранее
HaMMeR,
ОтветитьУдалитьстандартная процедура - попробуйте запускать экспорт ручками, из квика. и только их. что происходит в этом случае?
и только инструменты.
ОтветитьУдалитьСделал все как вы посоветовали и заметил следующее.
ОтветитьУдалитьесли в инструментах есть Акции то инструменты не выводятся.
Screenshot
А если толко фьючерсы, то кажится все нормально.
Screenshot
А что будет, если только акции? У меня этот вариант работает нормально (в принципе, как и все другие, но пока остановимся на этом).
ОтветитьУдалитьНа первом скрине только акции. Инструменты не выводятся.
ОтветитьУдалитьЧто выводит QuikTrader.DdeError?
ОтветитьУдалитьВот что выводит 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 .()
После изменения Региональных настоек системы кажится все начало работать.
ОтветитьУдалитьСпасибо
Добрый день, большой респект за труды!
ОтветитьУдалитьХотел бы предложить разработать совместно готовую программу для облегчения жизни трейдеров на основе ваших работ, которая позволяла бы быстро открывать, закрывать позции, автоматически выставлять стоп лоссы, таргеты и выводить позиции в безубыток при определенной прибыли...
Как уважаемый администратор на это смотрит?
Также очень хотелось бы пообщаться в ICQ или Skype. Мой емэйл для связи если заинтересует Andreifx@mail.ru
С уважением, Андерй
Этот комментарий был удален автором.
ОтветитьУдалитьЗдравствуйте, с наступающим!
ОтветитьУдалитьЯ Вам отправил емэйл, но пока молчок...я наверное бы хотел попросить Вас сделать привод как бы на заказ(за деньги). Если Вы такой тип сотрудничества рассматриваете, буду очень рад.
И вопрос наверное делитанский: скажите пожалуйста, файл info.wnd какие функции выполняет? Для чего он нужен?
Спасибо и еще раз с наступающим!
andreifx,
ОтветитьУдалитьСпасибо. Нашел в спаме. Отвечу письмом.
andreifx,
ОтветитьУдалитьinfo.wnd - это файл настроек таблиц в Квике. В документации от Квика написано подробнее, что в него входит. Я его вкладываю в архив для того, чтобы сразу правильно настроить необходимые таблицы для экспорта через ДДЕ.
Здравствуйте. Скажите пожалуйста, как с помощью ваших библиотек я могу определить стоимость одного пункта для фьючерса ртс(или других инструментов, торгующихся на фортс)?
ОтветитьУдалитьVladimir31,
ОтветитьУдалитьБиблиотека одна - Ecng.Trading. Стоимость пункта цены Security.MinStepSize.
Да, но Security.MinStepSize возвращает минимальный шаг цены в единицах самой цены, т.е. для фьючерса РТС например она вернет видимо 5. Мне бы хотелось получить стоимость пункта в рублях(в данный момент для фьючерса РТС это порядка 0,64 рубля). Стоимость пункта для фьючерса РТС считается как 0.02*Курс$ЦБ. Есть ли какие то свойства или методы вашей библиотеки, позволяющие получить данную стоимость или позволяющие получить актуальный курс доллар/рубль по ЦБ? И еще один похожий вопрос : как можно получить размер гос.обеспечения?
ОтветитьУдалить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. Добавить еще одну таблицу с колонками ГО покупателя и продавца.
Спасибо за ответ, буду разбираться.
ОтветитьУдалитьДобрый день.
ОтветитьУдалитьПодскажите пожалуйста событие NewMyTrades генерируется при появлении собственных рыночных сделок или вообще любого типа ордеров(market,limit,stop)?
И еще, событие NewOrders генерируется при появлении новых данных в стакане, так?
andreifx,
ОтветитьУдалитьNewMyTrades - это событие генерируется, когда происходят собственные сделки по любым типам ордеров. Проще говоря, когда появляется строчка в таблице Мои Сделки.
NewOrders - когда появляется строчка в таблице Заявки, или когда программа регистирует заявку через RegisterOrder.
Стакан - это совокупность всех заявок (как собственных, так и чужих). Чужие заявки биржа не дает просматривать.
Спасибо за ответ!
ОтветитьУдалитьПродолжаю разбираться, возник очередной вопрос касательно Ecng.Xaml(из демо примера), а точнее метода
public static void Sync(...) данного класса.
Я так понял используется для синхронизации IEnumerable коллекции с ListView например, но использование данного класса(Ecng.Xaml) к сожалению возможно только в WPF приложениях(при подключении Ecng.Xaml в Windiws Forms выдает ошибку ). У вас случайно нету варианта данного класса или исходника этого метода для работы в обычных windows forms ?
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);
}
}
}
Здравствуйте.
ОтветитьУдалитьСпасибо за библу и блог, для меня оказался очень полезным.
Почему то возникает ошибка при запуске "Экспорта 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;
подскажите в какую сторону рыть :)
Aleks,
ОтветитьУдалитьА у Вас точно все таблицы имеют теже названия, что на рисунках? Эта ошибка говорит о том, что по названию не была найдена таблица. Чтобы было проще начинать работать с библиотекой я вложил в архив файл info.wnd. Это файл настроек Квика.
Заявка не регистрируется. Может быть дело в неправильном номере счета?
1) Я ваш файл загружал, правда сразу закрывал таблицу "Все сделки" ща попробовал вроде без ошибок отработало всё... но если честно эта ошибка меня не сильно волнует, хотя было бы логично сделать проверку, мол если какие то окна отсутствуют просто их пропускать (если конечно это не влияет на дальнейшую работоспособность, а если мешают, то выводить сообщение)
ОтветитьУдалить2) меня больше интересует невозможность создания заявки :) номер счёта же по идее не участвует в запросе... я так думаю косяк в формате даты... (я дебагом глянул, там дата ваще какая то левая, типо 10.10.1970) тока я не могу разобраться из-за чего етот косяк...
1. Сделки еще как влияют. Если Вы хотите кастомизированную логику - QuikTrader.StartDde(DdeTables) и QuikTrader.StartDde(string). В том то и дело, что это библиотека упрощения работы с торговой программой. И каждый роботовод сам должен обрабатывать свои собственные особенности системы. Иначе - только сужение возможностей роботов, что мне делать не хочется вообще.
ОтветитьУдалить2. При регистрации заявки должен передаваться идентификатор счета... Как и откуда Вы получили эту дату?
1) ок, терь всё понятно стало полностью
ОтветитьУдалить2) когда ошибка вылетает он мне перечиляет:
ACCOUNT=77777; CLIENT_CODE=XXX;
где 77777 это номер моего счёта (его я изменил), а вот там где XXX должно тоже что нить быть?
Просто по идее, я же руками ничего не ввожу кроме цены и количества лота, т.е. данные типа номер счёта и время берётся уже из вашей программы... может проблема в региональных настройках?!
CLIENT_CODE - это необязательный параметр, который я заполняю обычным XXX.
ОтветитьУдалитьЯ не совсем понял, про какую дату идет речь? Где Вы ее увидели в примере?
я когда дебагом объект order смотрел там есть параметр time он у меня был 01.01.1970, но скорее всего тут не в дате дело, а в чом - мне не понятно.
ОтветитьУдалитьв версии 1.5 ошибка повторилась
http://depositfiles.com/files/dfe8mc00e
ОтветитьУдалитьhttp://depositfiles.com/files/nlvtt9ckh
ссылки на скрины ошибки
А другие примеры работают? Например, SampleConsole? По всей видимости особенность брокерских настроек. Попробуйте задать вопрос на форуме Квик. Она обычно знают, как у их клиентов сконфигурирована система.
ОтветитьУдалитьдругие примеры не пробывал пока ещё...
ОтветитьУдалитья использую Quick-Junior с тестовым рынком может из-за этого и проблемы
Mika я был бы вам очень признателен и благодарен, еслиб вы помогли пофиксить эту ошибку для Quick-Junior, так как мне как новичку очень удобно работать с тестовой биржей
ОтветитьУдалитьВы правы, я использовал вместо счёта логин в КВИКЕ *wall*
ОтветитьУдалитьСейчас поставил счёт - всё работает.
Спасибо.