Избранное трейдера Андрей
Здравствуйте дорогие друзья!
Поздравляю все мужчин с праздником!!!
Я переписал свой анализатор опционных позиций из экселя на C#. Пишу в visual studio 2010.
Кстати я только начал изучать этот язык и это моя первая программа на этом языке. Так что мы с Тимофеев вроде как коллеги по цеху ;)
Начну со слов благодарности:
1. Евгению, за его комментарий, собственно именно оно заставило меня задуматься о том что все равно придется все переписывать с экселя, рано или поздно, пусть уж лучше рано.
Вот его комментарий «А вы подумайте, что дальше будет еще больше написанного, и тогда еще больше будете переписывать.». Хотя помню в первой версии программы он меня пытался отговорить от написания своего анализатора. Как хорошо, что я не податлив на чужое мнение. И то что я проделал такой путь ни грамма не жалею, наоборот есть еще большее желание развивать свой софт.
2. Всем тем кто согласился тестировать сырую версию моего анализатора, за их терпение и подсказки. Их было 4 человека Сергей, Дмитрий, Дмитрий и Максим (они знают про кого я говорю).
3. Есть еще один человек которому я благодарен, его к сожалению нет на смарт-лабе. Это профессиональный программист, на сайте MQL5 он известен как «Dmitriy Skub». Он мне периодически подсказывал по самому коду программы.
Собственно рассказывать особо нечего про программу, я её постарался сделать подобной экселю с тем же функционалом, только вот дизайн сделал так как мне хочется, в экселе я так сделать не мог.
Просто приведу пару скриншотов программы:
Доска:
Диаграмма:
Статья из блога www.jonathankinlay.com поможет лучше понять работу вашей торговой стратегии и повысить ее производительность в будущем.
Построение прибыльной стратегии только половина успеха, трейдеру еще необходимо понимание так называемой альфы стратегии и риска. Это значит, что нужно определить факторы, обуславливающие прибыльность алгоритма и, в идеале, создать модель так, что их относительный вклад может быть вычислен. Более продвинутый путь — это конструирование мета-модели, которая будет предсказывать прибыльность и давать рекомендации, каким образом должна торговать стратегия в следующий период.
Производительность стратегии
Давайте посмотрим, как это работает на практике. В нашем случае будем использовать следующую внутридневную стратегию на фьючерсах E-mini:
Общая производительность стратегии довольна высока. Среднемесячная прибыль за период с апреля по октябрь 2015 года почти 8 000 долларов на контракт, за вычетом комиссии, со стандартным отклонением всего 5 500 долларов. Годовой коэффициент Шарпа около 5.0. На платформе с хорошим исполнением стратегия может масштабироваться до 10-15 контрактов, с годовой прибылью от 1 до 1.5 миллионов долларов.
Если говорить образно. То, чтобы отправить сообщение на сервер, нам просто нужно сформировать нужную строку со всеми данными и отправить ее на биржу. Ну например:
8=FIX.4.4;9=78;35=A;49=FG;56=tgFhcfx901U05;34=1;52=20160212-11:42:51.812;98=0;108=3000;141=Y;10=047;
Если быть внимательным, то мы увидим, что кол-во символов в строке у нас 100, а в заголовке сообщения мы передаем, что 78 (9 = 78). По правилам протокола FIX, длину сообщения нужно считать без учета концовки и первых двух полей заголовка. А именно:
С длиной сообщения разобрались. Теперь про разделитель. Пока в моем скрине это ";". В документациях западных написано что это символ SOH. Чтобы однозначно ответить на этот вопрос, я запустил прилагаемого клиента биржи и сниффером стал перехватывать сообщения между клиентом и биржей. Кстати, программа ведет логи, и их общение выглядит так (зеленое — передача запроса на биржу, красное — ответ от биржи)://Получаем ip сервера
IPAddress ipAddr = IPAddress.Parse(server);
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, port);
//Создаем заголовк
HeaderMessage msHeader = new HeaderMessage
{
BeginString = «FIX.4.4»,
MsgType = «A», //Тип сообщения на установку сессии
SenderCompID = "",
TargetCompID = «FG»,
MsgSeqNum = 1
};
//Создаем сообщение на подключение onLogon
LogonMessage msLogon = new LogonMessage
{
EncryptMethod = 0,
HeartBtInt = 3000,
ResetSeqNumFlag = true
};//Вычисляем длину сообщения
msHeader.BodyLength = msHeader.GetHeaderSize() + msLogon.GetMessageSize();
//Создаем концовку сообщения
TrailerMessage msTrailer = new TrailerMessage(msHeader.ToString() + msLogon.ToString());//Формируем полное готовое сообщение
string fullMessage = msHeader.ToString() + msLogon.ToString() + msTrailer.ToString();
Console.WriteLine(«Сообщение для отправки {0}»,fullMessage);//Создаем сокет для подключения
sSender = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
//Подключаемся
sSender.Connect(ipEndPoint);
Console.WriteLine(«Сокет соединился с {0} », sSender.RemoteEndPoint.ToString());
byte[] msg = Encoding.UTF8.GetBytes(fullMessage);
//Отправляем сообщение
int bytesSent = sSender.Send(msg);
Console.WriteLine(«Отправил {0} байт», bytesSent.ToString());
//Получаем ответ от сервера
byte[] bytes = new byte[1024];
int bytesRec = 0;
bytesRec = sSender.Receive(bytes);
Console.WriteLine(«Ответ от сервера: {0}», Encoding.UTF8.GetString(bytes, 0, bytesRec));