Постов с тегом "c#": 144

c#


#пора_граммировать [7] ... авторизация на сайте МосБиржи #headers

— заходим на адрес https://passport.moex.com и регистрируемся. 
   запоминаем логин и пароль.
   подтверждаем почту.

— вместо login:password вбиваем свои данные
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

#учусьучить





#пора_граммировать [6] ... авторизация на сайте МосБиржи #cookie

— заходим на адрес https://passport.moex.com и регистрируемся.
   запоминаем логин и пароль.
   подтверждаем почту.

— вместо login:password вбиваем свои данные
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
...

#учусьучить

#пора_граммировать [5] ... цена последней сделки по Si с биржи.

Для получения последней сделки нужно изменить порядок запроса на обратный добавив
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();
            }            
        }
    }
}


( Читать дальше )

#пора_граммировать [4] тики с сайта МосБиржи, ну и минутки тоже :)

Если закинуть вот такую строчку в браузер, то получим тики по SiZ7 текущей сессии
https://iss.moex.com/iss/engines/futures/markets/forts/securities/SiZ7/trades.json
— если добавить 
?start=0&limit=100
то начиная с первой сточки (номер ноль) получим только первые 100 сделок:
https://iss.moex.com/iss/engines/futures/markets/forts/securities/SiZ7/trades.json?start=0&limit=100
следующие 100 сделок:
?start=100&limit=100
Минутки получить можно так:
http://iss.moex.com/iss/engines/futures/markets/forts/boards/RFUD/securities/SiZ7/candles.json?from=2017-11-08&till=2017-11-08&interval=1&start=0
Если заменить .json --> .csv, то скачивается файл:

http://iss.moex.com/iss/engines/futures/markets/forts/boards/RFUD/securities/SiZ7/candles.json?from=2017-11-08&till=2017-11-08&interval=1&start=0
Программный пример:
using System;
using System.Net;
using System.IO;

namespace GetDataSmpl
{
    class Program
    {
        static void Main(string[] args)
        {   
            string link = "https://iss.moex.com/iss/engines/futures/markets/forts/securities/SiZ7/trades.json?start=0&limit=10";
            string dataLine; 
            int count = 0;           
            using (WebClient wc = new WebClient())
            {  
                Stream stream = wc.OpenRead(link);
                StreamReader sr = new StreamReader(stream);                
                while ((dataLine = sr.ReadLine()) != null) {
                    if (count >= 14 && count <= 23) Console.WriteLine(dataLine);
                    count +=1;
                }                        
                stream.Close();             
            }                
        }
    }
}


( Читать дальше )

#пора_граммировать [3] делаем C# сразу для/на Windows <==> Linux

Нетрудно сделать версию консольной проги по стандарту  2.0 для запуска на Windows или Linux:

— каталог Debug наполнялся содержанием при
dotnet run

Для релиза:

— в каталоге проекта делаем

   для win7:
dotnet publish -c Release -r win7-x64
   для Ubuntu 14.04:
dotnet publish -c Release -r ubuntu.14.04-x64

полный список платформ Windows, Linux, MacOS X

Забираем релизы в каталоге Release проекта.




#учусьучить

Изучение TRANSAQ или QLua

Есть желание изучить TXmlConnector и QLua библиотеки для создания около рыночного проекта. Кто так же только думает об этом, но не нашел единомышленников, как говорится велком )) а т.к. перехожу на новый (для себя) язык программирования C#, то приветствуются к участию так же новички в программировании и желающие изучить тему кодинга и алготрейдинга на C# ))

Мост NinjaTrader -> OEC Trader 2

По мотивам прошлого поста.

Выбрал два пути для реализации: TCP/IP и RabbitMQ. Сейчас в процессе выбора между, но пока что флоп в пользу первого решения. От хелоуворлда текстовиков я отказался, хотя ninjatrader оказывается напрямую предлагает часть функционала реализовывать через файлы. (0_о)

Почему TCP/IP — потому что коллега пообещал на пальцах показать как это работает.
Почему RabbitMQ — ну уж ооооочень хорошо описан, для филологов.

Есть еще масса массовых масс решений. Именно в такой формулировке. Но… или задротные, или оверкил, или недоступные пока что моему левелу. Но судя по отзывам коллег, для моей реализации оба решения подходят идеально.

Кстати, похвалили за код. Типа опрятный, обложенный тестами, описанный, задокументированный… Прям аж приятно. ) Стоит напомнить, что я всерьез взялся за вожжи мягко говоря недавно. )

Вот еще бы кто подсказал простой путь к сердцу OEC API (надо при получении ответа на GET открывать/закрывать ордера, вся математика в NT). ))) Коннектор там запилить я смог, а вот ордерпостилка не получается, не смотря на примеры…

Мост NinjaTrader -> OEC Trader

Господа кодеры, прошу идейного совета, но с практическими направлениями. Есть задача портировать генерируемые стратегией в NT трейды на OEC Trader. Т.к. я сишарплю, а парни за стенкой ноудджиесят, получить у них качественный совет не получилось.

Текущее решение сделано в режиме хелоуворлда — пишем генерируемые трейды StreamWriter'ом в ТХТ, потом слушаем ТХТ файл FileSystemWatcher'ом и торгуем в ОЕС.

Когда работает одна стратежка, то все выглядит чин-чин, но ессно когда одновременно работают 2+ стратежки, то при вызове StreamWriter по концу часа несколькими идеями код матерится (файл блаблабла занят другим процессом). Делать многопоточный кастыль для передачи трейдов через ТХТ? Мне кажется это некошерно… Смотрю в сторону WCF… Но там не нашел применимых примеров. Там только калькуляторы, которые я не могу в мозгу перевернуть в то, что мне нужно.

Так вот вопрос — абстрагируясь от NT и ОЕС (они умеют обычный C# без проблем), что лучше выбрать для решения задачи? Если аргументы в пользу ТХТ+Thread, то я готов подвинуться религией. Если в сторону WCF, то пните в нормальный пример. Не калькулятор, а где через службу одна прога отправляет что-то как команду, а вторая прога глотает как команду.

( Читать дальше )

....все тэги
UPDONW
Новый дизайн