using System; using System.Net; using System.Text; namespace AuthMoexSmpl { class Program { static void Main(string[] args) { string authLink = "https://passport.moex.com/authenticate"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(authLink); request.ContentType = "text/plain; charset=utf-8"; request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes("login:password")); //свои данные request.PreAuthenticate = true; request.CookieContainer = new CookieContainer(); HttpWebResponse response = request.GetResponse() as HttpWebResponse; for(int i=0; i < response.Headers.Count; ++i) Console.WriteLine("\nHeader Name:{0}, Value :{1}",response.Headers.Keys[i],response.Headers[i]); } } }
D:\devel\net\AuthMoexSmpl>dotnet run Header Name:Cache-Control, Value :no-store, must-revalidate, no-cache, ma Header Name:Connection, Value :close Header Name:Date, Value :Fri, 10 Nov 2017 19:53:12 GMT Header Name:Pragma, Value :no-cache Header Name:ETag, Value :"xxxxxx" Header Name:Server, Value :nginx Header Name:Set-Cookie, Value :MicexPassportCert=xxxxxxx; domain=.moex.com; path=/, _passport_se m xxxxx; path=/; HttpOnly Header Name:Status, Value :200 OK Header Name:X-Runtime, Value :713 Header Name:X-Moex-Passport-Certificate, Value :xxxxxx Header Name:X-Powered-By, Value :Phusion Passenger 4.0.57 Header Name:Access-Control-Allow-Credentials, Value :true Header Name:Access-Control-Expose-Headers, Value :X-MicexPassport-Marker
using System; using System.Net; using System.Text; namespace AuthMoexSmpl { class Program { static void Main(string[] args) { string authLink = "https://passport.moex.com/authenticate"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(authLink); request.ContentType = "text/plain; charset=utf-8"; request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes("login:password")); // вносим свои данные request.PreAuthenticate = true; request.CookieContainer = new CookieContainer(); HttpWebResponse response = request.GetResponse() as HttpWebResponse; foreach (Cookie cook in response.Cookies) { Console.WriteLine("Cookie:"); Console.WriteLine("{0} = {1}", cook.Name, cook.Value); Console.WriteLine("Domain: {0}", cook.Domain); Console.WriteLine("Path: {0}", cook.Path); Console.WriteLine("Port: {0}", cook.Port); Console.WriteLine("Secure: {0}", cook.Secure); Console.WriteLine("When issued: {0}", cook.TimeStamp); Console.WriteLine("Expires: {0} (expired? {1})", cook.Expires, cook.Expired); Console.WriteLine("Don't save: {0}", cook.Discard); Console.WriteLine("Comment: {0}", cook.Comment); Console.WriteLine("Uri for comments: {0}", cook.CommentUri); Console.WriteLine("Version: RFC {0}" , cook.Version == 1 ? "2109" : "2965"); Console.WriteLine ("String: {0}", cook.ToString()); } } } }
D:\devel\net\AuthMoexSmpl>dotnet run Cookie: _passport_session = xxxxxxxxxxxxxxxxxxxxxxxxxxxxx Domain: passport.moex.com Path: / Port: Secure: False When issued: 11.11.2017 01:55:42 Expires: 01.01.0001 00:00:00 (expired? False) Don't save: False Comment: Uri for comments: Version: RFC 2965 ...
reversed=1и оставить только строчку номер 15 в запросе
limit=1получим запрос вида
https://iss.moex.com/iss/engines/futures/markets/forts/securities/SiZ7/trades.json?reversed=1&limit=1Вариант автоматизации упрощенно:
using System; using System.Net; using System.IO; using System.Text; namespace GetLastPrice { class Program { static void Main(string[] args) { string newLine; string[] lastLine; string link = "https://iss.moex.com/iss/engines/futures/markets/forts/securities/SiZ7/trades.json?reversed=1&limit=1"; int count = 0; for (;;) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(link); request.ContentType = "text/plain; charset=utf-8"; HttpWebResponse response = request.GetResponse() as HttpWebResponse; using (Stream responseStream = response.GetResponseStream()) { StreamReader sr = new StreamReader(responseStream, Encoding.UTF8); while ((newLine = sr.ReadLine()) != null) { if (count == 14) { if (newLine =="") break; else { lastLine = newLine.Split(","); Console.WriteLine("Volume is " + lastLine[6] +" at Price " + lastLine[5]); } } count++; } } count = 0; response.Close(); } } } }
dotnet run
dotnet publish -c Release -r win7-x64для Ubuntu 14.04:
dotnet publish -c Release -r ubuntu.14.04-x64
Первая часть
Вторая часть
Третья часть
Всем привет.
Вот мы и закончили свой проект перевода своих торговых решений на операционную систему Linux. За шесть месяцев было написанно с нуля все что нужно для нашего стиля торговли и контроля рисков. Поставленные и решенные задачи:
— Иметь унифицированный терминал для торговли разных бирж
— Иметь сервер рискменеджера для контроля рисков
— Независить от платформы клиента(трейдера), виндовс, линукс, андроид, макос и тд.
— Возможность одновременной торговли на одном счете нескольких трейдеров\роботов
Весь комплекс прошел боевое тестирование и успешно внедрен в повседневную работу. Всем кто следил за проектом и поддерживал, огромное спасибо!
Ну и небольшое видео как это было:
Первая часть
Вторая часть
Всем привет.
Прошло чуть больше месяца как мы стартанули переписывать все ПО под новую концепцию. Как вы помните основные посылы были следующие:
— Написать нативный кроссплатформеный сервер для проптрейдинговой деятельности
— Написать Веб простейшую торговую платформу для проптрейдинговой деятельности
Давайте немного поясним, что мы имеем ввиду под проптрейдинговой деятельностью. В данном контексте мы понимаем это следующим образом:
Лицо или группа лиц которая хочет торговать с одного аккаунта Квика и иметь при этом рискменеджера. Т.е. по сути, Квик является датафидом и исполнителем заявок. Он подключается к нашему серверу и работаетает с ним. Клиенты — проптредеры подключаются через вебклиента к нашему серверу и совершают сделки в рамках своих лимитов, которые контролирует сервер. Такая своеобразная возможность дать в ДУ без предоставления доступа к счету и приэтом 100% контролировать риски трейдеров. Сервер на нашей стороне. Тредеров добавляем сами, и каждому выставляем лимит потерь на день и рабочий сайз. В итоге трейдер не может за день потерять больше чем лимит.
Буквально вчера закончили тесты первой альфаверсии с минимальным функционалом.
— Сервер: принимает и раздает стакан и часовой чарт, принимает и отсылает информацию по ордерам, мониторит риски трейдеров.
— ВебКлиент: принимает и отображает стакан и часовой чарт, выставляет и снимает ордера, принимает информацию по ним.
На данный момент платформа работает стабильно, поэтому переводим всех своих трейдеров на нее. Дальше уже будем дорабатывать остальной функционал.
Если интересно, ставьте плюсы, будем постить дальнейший ход дел )
Конструктивная критика и предложения приветствуются.
Всем профитов!
Ну и скриншот текущего клиента:
Первая часть.
Всем привет.
Ну что, расскажем что в итоге у нас получилось и к чему пришли и идем. Первое с чем надо было определиться это сам дистрибутив. Перепробовали кучу. Требования были следующие:
— Легковесный
— Версии LTS или стабильный
Просмотрели:
Arch Linux — Всем понравился, но слишком много проблем может возникать при апдейтах и «минимальных» чихах. Нет времени на устранение этих проблем.
CentOS — Понравилась, но как то не зашла.
Debian — Как не странно вообще не пошла у нас. Даже не стали копать.
Linux Mint — Слишком «тяжелая» овер 9ГБ в установке
Linux Ubuntu и ежесней Kubuntu и тд — Слишком «тяжелая» овер 9ГБ в установке
Slackware — Понравилась всем, но тяжелая, так же овер 9ГБ в установке
Ubuntu Server — Вот это подошло на 100%. Легкая, до 700МБ в установке. Легко настраивается. Хорошее сообщество. LTS и тд. Вобщем как основу оси выбрали ее.
Выбор DE — Графической среды. Тут у нас было сразу два фаворита 1)