You are viewing [info]farique's journal

Биржевые технологии в действии :: farique's blog Below are the 10 most recent journal entries recorded in the "Фарик" journal:

[<< Previous 10 entries]

January 1st, 2020
12:00 am

[Link]

Header
farique's blog welcome
Добро пожаловать!

В этом журнале будет много написано о различных математических методах, используемых для торговли на бирже, о программировании торговых роботов, нейронных сетях, мат статистики и other shit.

Приветствую обоснованную критику!

Если добавились в друзья - отписывайтесь в комменты!

Current Music: Wu-Tang Clan – Diesel Fluid (feat. Method Man, Trife Diesel and Cappadonna)
Tags:

(Leave a comment)

December 5th, 2011
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: , , , ,

(Leave a comment)

November 24th, 2011
10:31 am

[Link]

Пару слов о прямом подключении к ММВБ
Для прямого подключения у ММВБ есть Micex Bridge, что по факту говорит о том, что нам предоставлена длл-ка mtesrl.dll для подключения к серверам ММВБ. Почитать можно по адресу http://www.micex.ru/services/technicalaccess/bridge

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

Данные представлены в виде таблиц. Принцип работы с таблицами: открыл таблицу, прочел данные, закрыл или открыл, прочел, обновил нужное кол-во раз, закрыл. При обновлении некоторые таблицы приходят целиком, а у некоторых приходит только обновление.

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

В библиотеке не реализована колбэк функция, все происходит в синхронном режиме. В этом конечно есть некоторый плюс, но есть и минус. Обновлять данные приходится "ручками". Есть еще "камень", а точнее особенность длл-ок. Нельзя вызвать функцию, пока другая функция выполняется. Это еще добавило работы.

Продолжение следует...

Current Music: Kanye West – Dark Fantasy
Tags: , , , ,

(Leave a comment)

November 19th, 2011
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. из условия максимизации средней скорости роста капитала. В частности, иногда предполагают, что СВ Y1 + X имеет логнор­мальное распределение . При логарифмической стратегии капитал распределяется, как правило, в некоторых пропор­циях между покупкой акций и вложением в банк.
Следует также отметить, что рассмотренный пример хорошо иллюстрирует особенность поведения случайной последовательности

при п →∞. В отличие от детерминированной последовательности случайная последовательность может сходится в разных смыслах и к разным значениям. В данном примере если ui > 0 и vi= 1, то Zn в среднем и в то же время Zn 0 по вероятности.

Tags: , ,

(Leave a comment)

November 18th, 2011
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: , ,

(2 comments | Leave a comment)

October 25th, 2011
02:22 am

[Link]

Обновление AlfaMetaApp версия 0.2 beta
Обновил AlfaMetaApp.
Добавил: прогресс бар, отображение процентов и блокировку кнопки на время экспортирования.

alfametaapp удобный экспорт Альфа-Директ metastock

Качаем http://www.farique.com/files/dev/AlfaMetaApp_v0.2b.zip

В версии 0.3 будет добавлена возможность указывать сразу несколько инструментов

Current Music: Drake – Find Your Love
Tags: , , ,

(8 comments | Leave a comment)

October 23rd, 2011
11:34 pm

[Link]

Потоки и Transaq Connector.
Заголовок этого поста мог быть и таким: "Визуальные изменения при поступлении данных через callback функцию от Transaq Connector", но как-то некрасиво))

Если вы работаете с Transaq Connector и хотите, чтобы приходящие от коннектора данные сразу обрабатывались – вам надо настроить callback функцию. Сделать это нетрудно. Но тут есть одно но: если Вы хотите, чтобы при этом изменялись визуальные элементы (элементы формы), то решение "в лоб" не пойдет. Дело в том, что все элементы формы были созданы в одном потоке, а сейчас другой поток пытается изменить их. Чтобы все сделать правильно, мы должны попросить форму изменить их (элементы формы). Для этого используются методы Invoke или BeginInvoke формы. Различия в том, что Invoke вызывается синхронно, а BeginInvoke асинхронно. При использовании WPF используются аналогичные методы только уже объекта Dispatcher.

Надеюсь, этот пост вам поможет при разработке ;)

Вот картинка (информации почти никакой не несет, но зато привлекает внимание))):
потоки transaq connector

И кстати, если у вас будут создаваться события при поступлении новых данных, и вы будете обрабатывать их в форме, все равно это не решит проблемы.

Этот пост в комоне - http://www.comon.ru/user/farique/blog/post.aspx?index1=54628

Current Music: Jay-Z and Kanye West — Illest Motherfucker Alive
Tags: , , ,

(Leave a comment)

10:36 pm

[Link]

AlfaMetaApp Удобный экспорт из Альфа-Директа в Metastock
Если кто-нибудь когда-нибудь выгружал данные из терминала Альфа-Директа в MetaStock, то он должен знать, что существуют ограничения на период выгружаемых данных. А именно:

"Примечание: в настоящее время действует
ограничение на максимальную глубину загрузки истории за один раз для графиков в
зависимости от периодичности – для 1-минутных графиков это неделя, для
5-минутных – месяц, для 15-минутных – 3 месяца, 30-минут – полгода, 1-час – год,
daily- и выше графики – история загружается без ограничений. Например, если
нужно загрузить 1-минутную историю за 2 недели – нужно сделать 2 запроса, по 1
неделе каждый (смотри раздел Принудительный запрос данных с
сервера
).
"
(взято из мануала к Альфа-Директу).

Вручную по 100 раз переставлять даты можно, но не нужно. Сделал приложение для удобного экспорта данных в Metastock.
AlfaMetaApp приложение для удобного экспорта из Альфа-Директ в 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: , , ,

(Leave a comment)

October 12th, 2011
07:31 pm

[Link]

Города в стакане
Недавно видел такую картину. Это Газпром. Это у меня так со зданиями какого-то старинного города ассоциируется. А вам так не кажется?


Current Music: Kanye West – Bad News
Tags: , , , , ,

(1 comment | Leave a comment)

October 3rd, 2011
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: , , , ,

(Leave a comment)

[<< Previous 10 entries]

Фарик.ком Powered by LiveJournal.com