Биржевые технологии в действии :: farique's blog
Below are the 10 most recent journal entries recorded in the "Фарик" journal:[<< Previous 10 entries]
12:00 am
[Link] |
Header Добро пожаловать!
В этом журнале будет много написано о различных математических методах, используемых для торговли на бирже, о программировании торговых роботов, нейронных сетях, мат статистики и other shit.
Приветствую обоснованную критику!
Если добавились в друзья - отписывайтесь в комменты!
Current Music: Wu-Tang Clan – Diesel Fluid (feat. Method Man, Trife Diesel and Cappadonna) Tags: header
|
12:28 pm
[Link] |
Прямое подключение. Dark pool. Интерфейсы 15 и 15А
Небольшая заметка для тех, кто работал с прямым подключением ММВБ.
В связи с айсберг заявками интрефейс 15 проапдейтился до 15А. Появились 10 символов (тип int, имя HIDDEN) для указания скрытых лотов. (Новость еще ноябрьская).
"Темная" ликвидность (aka dark pool) появится 12 декабря 2011 года, в связи с этим появляется режим ”Крупные лоты” (EQDP). Нового интерфейса не будет.
Current Music: Styles P - Harsh (feat. Busta Rhymes & Rick Ross) Tags: dark pool, mtesrl.dll, интерфейс 15A, ммвб, прямое подключение
|
10:31 am
[Link] |
Пару слов о прямом подключении к ММВБ Для прямого подключения у ММВБ есть Micex Bridge, что по факту говорит о том, что нам предоставлена длл-ка mtesrl.dll для подключения к серверам ММВБ. Почитать можно по адресу http://www.micex.ru/services/technicalaccess/bridge
В библиотеке описаны функции, и, как это уже неудивительно, везде присутствую указатели. Скажу честно, мук с ними было много...но об этом когда-нибудь...в другой раз, в общем.
Данные представлены в виде таблиц. Принцип работы с таблицами: открыл таблицу, прочел данные, закрыл или открыл, прочел, обновил нужное кол-во раз, закрыл. При обновлении некоторые таблицы приходят целиком, а у некоторых приходит только обновление.
Все таблицы имеют разную структуру. Структуру можно получить отдельной функцией. Мы получаем типы, названия полей таблицы (так же мы получаем описание перечисляемых типов и транзакций). "Как круто, – сначала подумал я, – если структура таблиц поменяется, то в приложении не нужно будет ничего менять". Но не тут-то было. Если поменяется транзакция, надо будет менять вызов. В общем, идея хорошая, по факту – только больше трудозатрат.
В библиотеке не реализована колбэк функция, все происходит в синхронном режиме. В этом конечно есть некоторый плюс, но есть и минус. Обновлять данные приходится "ручками". Есть еще "камень", а точнее особенность длл-ок. Нельзя вызвать функцию, пока другая функция выполняется. Это еще добавило работы.
Продолжение следует...
Current Music: Kanye West – Dark Fantasy Tags: dll, micex bridge, mtesrl, ммвб, прямое подключение
|
12:14 pm
[Link] |
Математическое обоснование диверсификации. Относительно недавно повторял теорию вероятности и наткнулся на, так называемый, "биржевой парадокс". Решил поделиться. Вырезал из книги «Теория вероятностей и математическая статистика. Базовый курс с примерами и задачами», А. И. Кибзун, Е. Р. Горяинова, А. В. Наумов, А. Н. Сиротин. Под редакцией А. И. Кибзуна. Москва, 2002, Физмат Лит.
Биржевой парадокс. Рассмотрим любопытный экономический пример. Пусть имеется начальный капитал К, который требуется увеличить. Для этого имеются две возможности: вкладывать деньги в надежный банк и покупать на бирже акции некоторой компании. Пусть и — доля капитала, вкладываемая в банк, а v — доля капитала, расходуемая на приобретение акций. Очевидно, что 0 ≤ u+v ≤ 1. Предположим, банк гарантирует b х 100% > 0 годовых, а акции приносят X х 100% годовых. Так как предполагается, что банк абсолютно надежен, то b является неслучайной величиной. Стоимость акций, как правило, меняется в течение года, т. е. X является случайной величиной. Допустим, что приобретение акций в среднем более прибыльно, чем вложение средств в банк, т. е. тX = М[Х] > b > 0. Но при этом имеется ненулевая вероятность того, что акции обесценятся и мы потеряем все деньги, вложенные в акции, Р{Х ≤ -1} = > 0. Таким образом, мы можем надеяться, что через год капитал составит величину К1=К(1+bu+Xv), которая является случайной. Рассмотрим также ожидаемое через год среднее значение капитала:
 Поставим задачу распределить капитал таким образом, чтобы максимизировать средний доход за год:
 Нетрудно найти решение этой простой задачи линейного программирования. Так как по условию задачи тX > b > 0, то, очевидно, все деньги нужно вкладывать в акции, которые в среднем более прибыльны, чем вложение в банк, т. е. u0 = 0, v0 = 1. При такой стратегии среднее значение капитала через год будет максимально:
 Выясним, к чему приведет такая стратегия управления капиталом, если применять ее многократно. Пусть Xi, i = , — ежегодный прирост капитала за счет приобретения акций. Предположим, что СВ Xi, i = , независимы. Пусть ui = 0, vi, = 1, i = , т. е. ежегодно покупаются только акции, которые в среднем более прибыльны, чем вложение в банк, М[Хi] = тX > b > 0. Тогда среднее значение капитала через п лет составит величину
 Так как по предположению mX > 0, то 1 + mX > 1. Поэтому при п →∞ получаем Кп →∞. Образно говоря, при таком управлении капиталом можно стать неограниченно богатым «в среднем». Посмотрим, что происходит с вероятностью нашего разорения при выбранной стратегии
 где событие Ai {Xi :1 + Xi ≤ 0} характеризует разорение в i-й год, а событие Вп А + ... + Ап — возможность разорения хотя бы один раз за п лет. Рассмотрим противоположное событие . Находим
 Так как СВ Xi независимы, то независимы также события Ai, i = . Поэтому имеем
 Но по предположению Р(Аi) = Р{Хi ≤ -1} = > 0, т. е. с ненулевой вероятностью можно потерять весь капитал в каждый i -й год. Поэтому . Отсюда следует, что
 А следовательно, , при п →∞, т. е. вероятность разорения при выбранной стратегии стремится к единице. И это несмотря на то, что средний доход стремится к бесконечности. В этом и состоит биржевой парадокс, к которому мы пришли, решив покупать лишь одни акции, пренебрегая возможностью получения в банке хоть и небольшой, но зато гарантированной, прибыли. Это значит, что не следует «складывать все яйца в одну корзину». На практике, чтобы избежать этого парадокса, используют так называемую логарифмическую стратегию, которая определяется из следующего условия:
 т. e. из условия максимизации средней скорости роста капитала. В частности, иногда предполагают, что СВ Y 1 + X имеет логнормальное распределение . При логарифмической стратегии капитал распределяется, как правило, в некоторых пропорциях между покупкой акций и вложением в банк. Следует также отметить, что рассмотренный пример хорошо иллюстрирует особенность поведения случайной последовательности
 при п →∞. В отличие от детерминированной последовательности случайная последовательность может сходится в разных смыслах и к разным значениям. В данном примере если ui > 0 и vi= 1, то Zn → ∞ в среднем и в то же время Zn → 0 по вероятности.
Tags: мат статистика, теория вероятности, умное
|
11:31 pm
[Link] |
Delphi и Transaq Connector Всем привет! Давно не писал. Простите, сейчас времени очень мало... и еще в последнее время занимаюсь прямым подключением к ММВБ.
В общем, как давно обещал: в кратце расскажу, как использовать Transaq Connector в Delphi Очень просто: (пишем в Delphi 2010)
1) Описываем функции DLL-ки:
function SetCallback(pCallback: Tcallback): boolean; stdcall; external 'txmlconnector.dll'; function SendCommand(pData: PAnsiChar): PAnsiChar; stdcall; external 'txmlconnector.dll'; function FreeMemory(pData: PAnsiChar): boolean; stdcall; external 'txmlconnector.dll';
2) Описываем функцию для отправки команды и получения результата:
function sendCmd(command: string): string; var cmd, ans: PAnsiChar; begin cmd := PAnsiChar(AnsiToUtf8(command)); ans := SendCommand(cmd); Result := Utf8ToAnsi(ans); FreeMemory(ans); end;
3) Описываем колбэк функцию:
function funcCallBack(pData: PAnsiChar): PAnsiChar; var str: string; begin str := Utf8ToAnsi(pData); FreeMemory(pData); //Делаем что угодно с str end;
4) Перед отправкой команд устанавливаем колбэк функцию:
SetCallback(funcCallBack);
5) Отправляем команды var cmd, ans: string; begin cmd := '<command id="..."/>'; ans := sendCmd(cmd); //работаем с ans как со строкой end;
6) Пишем робота, торгуем и зарабатываем )))
Удачной торговли!
Current Music: Yelawolf – Throw It Up (feat. Gangsta Boo & Eminem) Tags: delphi, dll, transaq connector
|
02:22 am
[Link] |
Обновление AlfaMetaApp версия 0.2 beta Обновил AlfaMetaApp. Добавил: прогресс бар, отображение процентов и блокировку кнопки на время экспортирования.

Качаем http://www.farique.com/files/dev/AlfaMetaApp_v0.2b.zip
В версии 0.3 будет добавлена возможность указывать сразу несколько инструментов
Current Music: Drake – Find Your Love Tags: alfametaapp, dev, metastock, Альфа-Директ
|
11:34 pm
[Link] |
Потоки и Transaq Connector. Заголовок этого поста мог быть и таким: "Визуальные изменения при поступлении данных через callback функцию от Transaq Connector", но как-то некрасиво))
Если вы работаете с Transaq Connector и хотите, чтобы приходящие от коннектора данные сразу обрабатывались – вам надо настроить callback функцию. Сделать это нетрудно. Но тут есть одно но: если Вы хотите, чтобы при этом изменялись визуальные элементы (элементы формы), то решение "в лоб" не пойдет. Дело в том, что все элементы формы были созданы в одном потоке, а сейчас другой поток пытается изменить их. Чтобы все сделать правильно, мы должны попросить форму изменить их (элементы формы). Для этого используются методы Invoke или BeginInvoke формы. Различия в том, что Invoke вызывается синхронно, а BeginInvoke асинхронно. При использовании WPF используются аналогичные методы только уже объекта Dispatcher.
Надеюсь, этот пост вам поможет при разработке ;)
Вот картинка (информации почти никакой не несет, но зато привлекает внимание))):

И кстати, если у вас будут создаваться события при поступлении новых данных, и вы будете обрабатывать их в форме, все равно это не решит проблемы.
Этот пост в комоне - http://www.comon.ru/user/farique/blog/post.aspx?index1=54628
Current Music: Jay-Z and Kanye West — Illest Motherfucker Alive Tags: c#, dll, transaq connector, потоки
|
10:36 pm
[Link] |
AlfaMetaApp Удобный экспорт из Альфа-Директа в Metastock Если кто-нибудь когда-нибудь выгружал данные из терминала Альфа-Директа в MetaStock, то он должен знать, что существуют ограничения на период выгружаемых данных. А именно:
"Примечание: в настоящее время действует ограничение на максимальную глубину загрузки истории за один раз для графиков в зависимости от периодичности – для 1-минутных графиков это неделя, для 5-минутных – месяц, для 15-минутных – 3 месяца, 30-минут – полгода, 1-час – год, daily- и выше графики – история загружается без ограничений. Например, если нужно загрузить 1-минутную историю за 2 недели – нужно сделать 2 запроса, по 1 неделе каждый (смотри раздел Принудительный запрос данных с сервера)." (взято из мануала к Альфа-Директу). Вручную по 100 раз переставлять даты можно, но не нужно. Сделал приложение для удобного экспорта данных в Metastock.
 http://www.farique.com/files/dev/AlfaMetaApp_v0.1b.zip AlfaMetaApp Версия 0.1b Скачиваем, запускаем терминал Альфа-Директ, запускаем приложение, выбираем площадку, вводим код инструмента, выбираем период и вводим даты. Ждем кнопку и радуемся.
Уже знаю, какие улучшения стоит сделать, но пока времени нет.
Current Music: Jay-Z and Kanye West — Niggas in Paris Tags: alfametaapp, dev, metastock, Альфа-Директ
|
07:31 pm
[Link] |
Города в стакане Недавно видел такую картину. Это Газпром. Это у меня так со зданиями какого-то старинного города ассоциируется. А вам так не кажется?

Current Music: Kanye West – Bad News Tags: gazp, газпром, города, привод, стакан, тики
|
04:39 pm
[Link] |
LINQ to XML. Разбираем xml данные от Transaq Connector
Когда я изучал C#, то LINQ показался мне жалкой попыткой ms создать альтернативу SQL. Ну, возможно, от части так оно и есть – не суть. Это очень удобное средство для парсинга, например, тех же xml (да и вообще выборки любых данных).
Посмотрим на работу с Transaq Connector. Разбрем статус сервера, сделки и стакан. Вот, допустим, в нашей программе мы получили данные string data. Это данные от сервера в формате строки в виде xml
Добавляем XDocument для чтения: XDocument aXmlDoc = XDocument.Load(new System.IO.StringReader(data));
Потом иф-ами или свитчем обрабатываем корень: if (aXmlDoc.Root.Name == "server_status") { // ... } if (aXmlDoc.Root.Name == "alltrades") { // ... } И так далее.
Рассмотрим простой пример. Статус сервера передается сообщением вида: <server_status id="ID сервера" connected="true/false/error" recover="true/атрибут отсутствует"/>
C# код: // Разбираем статус if (aXmlDoc.Root.Name == "server_status") { if (aXmlDoc.Root.Attribute("recover") == null) // если атрбитут recover отсутствует { switch (aXmlDoc.Root.Attribute("connected").Value) //читаем значение { case "true": //...если connected = true break; case "false": //...если connected = false break; case "error": //...если connected = error break; } } else { //если атрбитут recover присутствует } }
Пока никакого LINQ, но зато стала понятна работа с XDocument. Рассмотрим получение сделок по инструменту: (string secid - это код инструмента).
// Разбираем сделки if (aXmlDoc.Root.Name == "alltrades") { // А вот и LINQ. Для работы с результатами используется переменная trades var trades = from trade in aXmlDoc.Descendants("trade") //получаем элементы узла trade where trade.Attribute("secid").Value == secid // отбираем сделки только нужного инструмента select new { price = Double.Parse(trade.Element("price").Value.Replace('.', PointChar)), // получаем и парсим значение элемента price quantity = trade.Element("quantity").Value, // получаем значение элемента quantity tradeno = trade.Element("tradeno").Value // получаем значение элемента tradeno }; foreach (var trade in trades) { // обрабатываем данные. Доступ к полям через точку. Например, trade.price } }
Правада похоже на SQL?) Здесь мы получили все элементы из узла trade и добавили нужные поля этих элементов. По дефолту поле будет в формате String, но я их парсил в нужный мне формат. Перед парсингом точка заменяется на char PointChar, это переменная содержит символ - разделить дробной части в числе. В данном примере я парсил только цену, просто потому что количество потом не использовал. Количество так же можно парсить с помощью Int32 (будет далее). Все данные выборки теперь доступны через переменную trades. С помощью foreach можно обработать эти данные.
Теперь рассмотрим получение стакана:
//Разбираем стакан if (aXmlDoc.Root.Name == "quotes") { //LINQ var quotes = from quote in aXmlDoc.Descendants("quote") where quote.Attribute("secid").Value == secid // только нужный инструмент select new { price = Double.Parse(quote.Element("price").Value.Replace('.', PointChar)), buy = quote.Element("buy") == null ? 0 : Int32.Parse(quote.Element("buy").Value.Replace('.', PointChar)), sell = quote.Element("sell") == null ? 0 : Int32.Parse(quote.Element("sell").Value.Replace('.', PointChar)) }; foreach (var quote in quotes) { //разбираем значения } }
В первый раз транзак отдает весь стакан, потом присылает только изменения. В buy и sell передается кол-во на покупку или продажу по заданной цене. Если это заявки на покупку, то элемент sell просто будет отсутстовать. Тут я воспользовался конструкцией a?b:c для того, чтобы получать 0 (нули) в количестве.
Вот так просто с помощью LINQ to XML можно парсить входящие данные. Этот же пост на комоне – http://www.comon.ru/user/farique/blog/post.aspx?index1=52315
Tags: .net, c#, linq, transaq connector, xml
|
[<< Previous 10 entries] |
|