И так, очередная версия. Это обновление предыдущей версии 2.0. Надеюсь этот вариант станет релизом, потому что я исправил все ошибки, о которых вы говорили в форуме. Те, кто сталкивался с проблемами 2.0, обязательно проверьте, все ли теперь работает правильно.
Естественно, руки потянулись и к изменениям, так как только баги фиксить не всегда интересно:
1. Сделал мега вещь. Называется Verifier. Проверяет правильность настроек Quik-а (таблицы, внешние транзакции, доступ к папке с Quik). Теперь, если что-то не работает, буду в первую очередь отсылать к этой утилите.
2. Для предыдущего пункта добавил метод QuikTrader.GetDdeSettingsResults.
3. Написал топик о том, как разрабатывать роботов, чтобы они работали как под Quik, так и под SmartCOM. В целях демонстрации перенес на SmartCOM пример со скользящими средними. Называется SampleSmartSMA:
4. Сделал downgrade для Quik API. Теперь QuikTrader поддерживает TRANS2QUIK и 1.1 и 1.0. Сам переход на 1.1 для QuikTrader не принес никаких плюсов, а минусов с проблемами старых Quik-ов хоть отбавляй.
5. Буквально неделю назад обнаружил, что Сталкер теперь работает через SmartTrader. По этому поводу добавил его адрес в SmartAddresses.
6. DdeTableColumn.Name теперь возвращает названия, как они есть в самом Quik.
7. Добавил конструктор без параметров new QuikTrader(). В этом случае Quik находится среди запущенных процессов через класс QuikFinder.
8. В CandleManager добавил методы проверок, зарегистрирована ли группировка свечек по признаку или еще нет. К примеру узнать в программе, зарегистрированы ли 5-минутки по инструменту РТС-6.10.
9. Сделал стакан MarketDepth потоковых. Это значит, что вызывая метод MarketDepth.SetQuote можно не задавать индекс глубины. Для этого сам стакан будет определять, какая это котировка (лучшая или нет), и тем самым вытеснять старые котировки.
10. Сделал метод создания разреженого стакана как это сделано в Quik - TraderHelper.Invert.
11. Для Exchange теперь можно задавать время работы.
четверг, 3 июня 2010 г.
понедельник, 17 мая 2010 г.
SmartTrader vs SmartCOM
Решил продублировать (+ разукрасить код) сообщение на форуме SmartCOM, где я показал основные преимущества SmartTrader перед SmartCOM. Вот список преимуществ (естественно, убрал преимущества самого S#, иначе получилось бы больше!):
Собственно, код на SmartTrader:
И аналогичный на SmartCOM:
Разница в количестве кода уже сама за себя говорит, и готова дополнить список преимуществ. Хотя на самом деле, это всего лишь преимущество использования объектной модели.
- Умеет отписываться от событий сам.
- Отслеживает позицию. Тоесть, нет необходимости писать проверки на Short и Cover
- Не показал в примере, но оно есть. В событиях SmartTrader можно выполнять долгую работу (что приведет к зависанию SmartCOM, если прога начнет что-то вычислять около минуты в событиях типа AddSymbol, UpdatePosition)
- Выдает событие последовательно. Тоесть, нет такой чехарды как UpdateOrder вызвался раньше чем OrderFailed (хотя, тут все зависит от глюков SmartCOM. У меня же обертка).
- Cохраняет заявки между сессиями. Что устраняет ошибку, когда при перезапуске SmartCOM теряет эту информацию.
- Предоставляет объектную модель. Тоесть, получив событие об успешной регистрации заявки, не нужно где-то рыскать по cookie для того чтобы определить инструмент, а достаточно вызвать Order.Security.
- Тоже не показал в примере. SmartTrader предотвращает дублирование информацию. NewSecurities для каждого инструмента вызывается только один раз, даже если Start/StopExport вызывается многократно.
Собственно, код на SmartTrader:
using (var trader = new SmartTrader(login, password))
{
trader.NewPortfolios += portfolios => portfolios.ForEach(trader.RegisterPortfolio);
trader.SecuritiesChanged += securities =>
{
if (lkoh == null)
{
// находим Лукойл и присваиваем ее переменной lkoh
lkoh = securities.FirstOrDefault(sec => sec.Code == "LKOH");
if (lkoh != null)
{
buyOrder = trader.RegisterOrder(new Order { Account = account, Price = lkoh.BestBid.Price, Security = lkoh, Volume = 1, Direction = OrderDirections.Buy });
sellOrder = trader.RegisterOrder(new Order { Account = account, Price = lkoh.BestAsk.Price, Security = lkoh, Volume = 1, Direction = OrderDirections.Sell });
}
}
};
trader.NewMyTrades += myTrades =>
{
foreach (var myTrade in myTrades)
{
var trade = myTrade.Trade;
Console.WriteLine("Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}",
trade.Id, trade.Price, trade.Security.Code, trade.Volume, trade.Time);
}
};
trader.Connected += trader.StartExport;
trader.Connect();
Console.WriteLine("Чтобы закончить, нажмите любую кнопку...");
Console.Read();
}
И аналогичный на SmartCOM:
private StServerClass server;
private int lkohPosition;
private string lkohSymbol;
private string portfolio;
private void OnAddSymbol(int row, int nrows, string symbol, string short_name, string long_name, string type, int decimals, int lot_size, double punkt, double step, string sec_ext_id, string sec_exch_name, DateTime expiry_date, double days_before_expiry)
{
if (short_name == "LKOH")
{
lkohSymbol = symbol;
server.ListenQuotes(symbol);
}
}
private void OnAddTrade(string portfolio, string symbol, string orderid, double price, double amount, DateTime datetime, string tradeno)
{
Console.WriteLine("Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}",
tradeno, price, symbol, amount, datetime);
}
private void OnUpdatePosition(string portfolio, string symbol, double avprice, double amount, double planned)
{
if (symbol == lkohSymbol)
lkohPosition = (int)amount;
}
private void OnUpdateQuote(string symbol, DateTime datetime, double open, double high, double low, double close, double last, double volume, double size, double bid, double ask, double bidsize, double asksize, double open_int, double go_buy, double go_sell, double go_base, double go_base_backed, double high_limit, double low_limit, int trading_status)
{
server.PlaceOrder(portfolio, lkohSymbol, lkohPosition >= 0 ? StOrder_Action.StOrder_Action_Buy : StOrder_Action.StOrder_Action_Cover, StOrder_Type.StOrder_Type_Limit, StOrder_Validity.StOrder_Validity_Day, bid, 1, 0, buyCookie);
server.PlaceOrder(portfolio, lkohSymbol, lkohPosition > 0 ? StOrder_Action.StOrder_Action_Sell : StOrder_Action.StOrder_Action_Short, StOrder_Type.StOrder_Type_Limit, StOrder_Validity.StOrder_Validity_Day, ask, 1, 0, sellCookie);
}
private void OnConnected()
{
server.GetSymbols();
server.GetPrortfolioList();
}
private List<string> _listenPortfolios;
private void OnAddPortfolio(int row, int nrows, string portfolioName, string portfolioExch)
{
server.ListenPortfolio(portfolioName);
_listenPortfolios.Add(portfolioName);
}
private void Test2()
{
server = new StServerClass();
try
{
server.AddSymbol += OnAddSymbol;
server.AddTrade += OnAddTrade;
server.AddPortfolio += OnAddPortfolio;
server.UpdateQuote += OnUpdateQuote;
server.UpdatePosition += OnUpdatePosition;
server.Connected += OnConnected;
server.connect("ip", login, password);
Console.WriteLine("Чтобы закончить, нажмите любую кнопку...");
Console.Read();
}
finally
{
foreach (var pf in _listenPortfolios)
server.CancelPortfolio(pf);
server.CancelQuotes(lkohSymbol);
server.disconnect();
server.AddPortfolio -= OnAddPortfolio;
server.UpdateQuote -= OnUpdateQuote;
server.AddSymbol -= OnAddSymbol;
server.AddTrade -= OnAddTrade;
server.UpdatePosition -= OnUpdatePosition;
server.Connected -= OnConnected;
Marshal.ReleaseComObject(server);
}
}
Разница в количестве кода уже сама за себя говорит, и готова дополнить список преимуществ. Хотя на самом деле, это всего лишь преимущество использования объектной модели.
среда, 12 мая 2010 г.
Сайт StockSharp.com
По адресу http://stocksharp.com доступен сайт проекта S#. Вот такой дизайн я себе выбрал:

Теперь все ссылки в одном месте. Плюс, доступна online версия документации. Буду ссылками на доку кидаться:

Если найдете баги на сайте или в документации - пишите, буду править.

Теперь все ссылки в одном месте. Плюс, доступна online версия документации. Буду ссылками на доку кидаться:

Если найдете баги на сайте или в документации - пишите, буду править.
вторник, 11 мая 2010 г.
Stock# 2.0
Сайт проекта располагается по адресу StockSharp.Com
Вот она - долгожданная версия 2.0. Сразу оговорка, пока это beta версия. Релиз будет после фидбеков о стабильности и корректности работы.
Прежде чем сказать, что появилось новое, хочу процитировать словами Нейла Армстронга новый релиз "Это один маленький шаг для человека и гигантский прыжок для человечества". В самом релизе появилось только одно важное, но бесспорно очень полезное нововведение - поддержка Smart. Это сделало Stock# тем, чем он разрабатывался с самого начала - платформо независимой библиотекой для разработки торговых программ (роботы, МТС, помощники - всего). Зачем все это нужно:
- Увеличивает комьюнити. Я думаю, не секрет, что пользователей на Quik в разы больше, чем на Smart. Тем не менее, Smart технически продвинутый. Итого, обмен знаниями привнесет плюсы обеим сторонам.
- Миграция. Ни Quik, ни Smart не идеален (идеала нет вообще). Жизнь - она ведь не стоит на месте. Поэтому и возникают потребности переходить с одной платформы на другую. Если это делать на Stock#, то переход будет менее затратным. Фактически, если все сделано правильно, то заменить в нескольких местах код робота. Если делать не на Stock#, то все будет, конечно же, значительно затруднительнее.
- Для тех, кто разрабатывает (и продает) роботов такая платформа расширяет клиентуру.
- Smart - это не последнее. Впереди планы и на другие платформы, что еще сильнее расширит предыдущие пункты.
- Добавил свойство ITrader.Portfolios. Данное свойство пока не поддерживается QuikTrader и сделано в первую очередь для SmartTrader.
- Теперь нет такого события как QuikTrader.DdeError. Вместо него есть ITrader.ProcessDataError. Я вынес в базовый интерфейс данное событие для унификации - в любом шлюзе есть ошибки.
- Опять же, для унификации добавил в ITrader методы StartExport и StopExport. Для QuikTrader оно вызывает запуск экспорта DDE. Для SmartTrader - подписка на COM события.
- Появилось событие ITrader.NewDataExported. Оно позволяет узнать, продолжает ли работать экспорт (если это Quik - то DDE экспорт, если Smart - то COM события). Кстати, Smart довольно часто любит тихо умирать, не говоря об этом никому. Данное событие позволяет реагировать программе (или человеку) на такую особенную ситуацию.
- Чтобы проще управлять событием ITrader.NewDataExported, ReConnectionManager может самостоятельно отслеживать ситуацию подвисания экспорта. Для этого у него есть метод SetExportTimeOut, где задается максимально допустимое время простоя. Если в течении него программе не придут новые значения, то ReConnectionManager расценивает такую ситуацию однозначно как зависания экспорта, и перезапускает экспорт через ITrader.ReStartExport.
- Добавил событие ITrader.Connected. Именно после данного события можно начинать работать с шлюзом (запускать экспорт, выставлять заявки и т.д.).
- Добавил событие ITrader.Disconnected. Оно нужно для ReConnectionManager, чтобы сигнализировать о корректном разрыве подключения, и предотвратить ненужное переподключение.
- Добавил событие ReConnectionManager.AttemptError. Оно позволяет узнать ошибку, которая произошла при неуспешной попытке восстановить соединение.
- Добавил метод ITrager.GetOrders(string account) для получения списка заявок по конкретному торговому счету.
- Добавил в QuikTrader поддержку одновременной работы с несколькими Quik. Я показал это в примере SampleFewQuik и в документации.
- Реализовывая предыдущий пункт, я сделал возможность задавать путь к библиотеке TRANS2QUIK.dll (полезно, когда есть несколько роботов). Если при создании QuikTrader по указанному пути не была найдена данная DLL, то она создается автоматически.
- Разрабатывая SmartTrader, я добавил свойство Security.Id. Для SmartTrader оно присылается SmartCOM, для QuikTrader оно генерируется из кода инструмента и его класса.
- Делая предыдущий релиз 1.8, я ввел понятие генерация идентификаторов транзакций. Я чуть модернизировал данный механизм. Теперь есть базовый класс TransactionIdGenerator. По умолчанию используется его реализация MillisecondTransactionIdGenerator, которое позволяет генерировать уникальные идентификаторы, особенно когда идет работа с несколькими Quik.
- С появлением SmartTrader и возможностью работать с несколькими Quik, появился класс MultiTrader. Мега удобная вещь. Позволяет работать с несколькими шлюзами как с одним единым подключением. Это позволяет реализовать в роботе концепцию, когда ему не нужно определять, в какую систему он отсылает заявку. Я показался в примере SampleQuikSmart и в документации как работать с данным классом.
- Добавил свойство Strategy.Name. Для удобства.
- Order.TransactionId теперь long, что устраняет ошибку с переполнением номера транзакции в Quik.
- Добавил свойство QuikTrader.MarketDepthDelimiter для изменения символа разделителя в заголовке окна стакана. По умолчанию, используется '-', но оно не всегда подходит.
- Реорганизовал конструкторы QuikTrader. Теперь часть параметров задается через соответствующие свойства.
- Ввел сущность Exchange. Показывает информацию по бирже (название + время работы).
- Расширил класс Security свойствами Trader и Exchange. Первое позволяет узнать, из какой торговой системы была получена информация по инструменту, второе - к какой бирже принадлежит инструмент.
- Добавил использование amCharts в примере работа с историческими данными SampleSmartCandles. До этого использовался Visifire. Разница на лицо (первая картинка - Visifire, вторая amCharts):


На сегодня все.
понедельник, 19 апреля 2010 г.
SmartCOM
Сейчас пытаю SmartCOM. Это собственно, главная фича будущего релиза. Потому как Stock# задумывалась как независимая от торговой платформы библиотека, а пока поддерживается только Quik. На данный момент делаю новые разработки уже и на SmartTrader (так будет называться реализация ITrader под Смарт). После этого, напишу документацию с примерами - и вот он новый релиз. Но пока могу поделиться первым впечатлением.
Оно не так радужно, как я предполагал в самом начале. Честно говоря, я разочарован (возможно, из-за того, что я ожидал несколько лучший результат, чем есть сейчас). Да, SmartCOM для роботописателей (в особенности на .NET) намного дружелюбнее, чем Quik. Те, кто начал программировать под Quik уже на S#, этого не понять. Поймут те, кто пытался скрестить ужа с ежом. Очень быстрый старт. Фактически, сев утром, уже в вечеру был готов SmartTrader. Это плюс, в теперь о минусах.
А минусы есть, причем очень и довольно жирные, которые не обойти никаким кодом:
1. Главный недостаток, который, фактически, закрыл возможность реализовать на Смарте одну из задумок - это отсутствие необходимых данных. Набор параметров, которые передает Смарт, очень мал. Я бы сказал, что ничего сложнее привода пока написать нельзя (пока, потому что сотрудники ITInvest грозятся расширить набор данных, поэтому жду).
2. Стабильность. SmartCOM падает так, что только успевай подхватывать. В много поточном режиме вообще виснет наглухо - только рестарт процесс помогает. За таким роботом нужен глаз да глаз. Плюс, что бывает нерегулярно, и что есть самое плохое - перестают прибывать события. Соединение тихо умирает, и робот может не узнать об этом вообще никогда. Поэтому, уже в новую версию я добавил событие ITrader.ConnectionTimeOut. Хм, доделанный к вечеру первого дня SmartTrader, до сих пор латаю заплатками.
3. Не логичность в некоторых подходах. Например, тики за текущую сессию получить невозможно, нужно роботу сторожить начало торговли (и не дай бог упасть из-за пункта 2). Или, из последнего - умирает соединение, если мониторить закрытый счет.
Но в целом, впечатление от SmartCOM, конечно же, положительное. Да и сотрудник под одноименным ником SmartCOM вызывает уважение. На форумах Quik-а такое не встретить. А стоило бы компании ARQA Technologies перенять опыт коллег-конкурентов.
Не уверен, до следующего релиза или после, но выложу результат сравнения в скорости, кто быстрее поставляет данные - Смарт или Квик.
Оно не так радужно, как я предполагал в самом начале. Честно говоря, я разочарован (возможно, из-за того, что я ожидал несколько лучший результат, чем есть сейчас). Да, SmartCOM для роботописателей (в особенности на .NET) намного дружелюбнее, чем Quik. Те, кто начал программировать под Quik уже на S#, этого не понять. Поймут те, кто пытался скрестить ужа с ежом. Очень быстрый старт. Фактически, сев утром, уже в вечеру был готов SmartTrader. Это плюс, в теперь о минусах.
А минусы есть, причем очень и довольно жирные, которые не обойти никаким кодом:
1. Главный недостаток, который, фактически, закрыл возможность реализовать на Смарте одну из задумок - это отсутствие необходимых данных. Набор параметров, которые передает Смарт, очень мал. Я бы сказал, что ничего сложнее привода пока написать нельзя (пока, потому что сотрудники ITInvest грозятся расширить набор данных, поэтому жду).
2. Стабильность. SmartCOM падает так, что только успевай подхватывать. В много поточном режиме вообще виснет наглухо - только рестарт процесс помогает. За таким роботом нужен глаз да глаз. Плюс, что бывает нерегулярно, и что есть самое плохое - перестают прибывать события. Соединение тихо умирает, и робот может не узнать об этом вообще никогда. Поэтому, уже в новую версию я добавил событие ITrader.ConnectionTimeOut. Хм, доделанный к вечеру первого дня SmartTrader, до сих пор латаю заплатками.
3. Не логичность в некоторых подходах. Например, тики за текущую сессию получить невозможно, нужно роботу сторожить начало торговли (и не дай бог упасть из-за пункта 2). Или, из последнего - умирает соединение, если мониторить закрытый счет.
Но в целом, впечатление от SmartCOM, конечно же, положительное. Да и сотрудник под одноименным ником SmartCOM вызывает уважение. На форумах Quik-а такое не встретить. А стоило бы компании ARQA Technologies перенять опыт коллег-конкурентов.
Не уверен, до следующего релиза или после, но выложу результат сравнения в скорости, кто быстрее поставляет данные - Смарт или Квик.
понедельник, 12 апреля 2010 г.
Stock# 1.8
Ага, опять не S# 2.0. Сам уже удивляюсь, что можно сделать в рамках одного Quik. Поистине, пределов для автоматизации не существует. Качаем-с.
- Главное нововведение в этой версии - асинхронные заявки. Я уже писал в своем посте о том, насколько они быстрее обычных. Поэтому, теперь QuikTrader умеет работать и в асинхронном режиме. Достаточно установить у него свойство IsAsyncMode в true. Более подробно, я написал в документации и показал в примере SampleAsyncTransaction. Кстати, последний выглядит как очень простой, но все же привод. Полезно будет посмотреть тем, кто хочет написать подобное. Но есть и ложечка дегтя. Котирование в асинхронном режиме работать не будет - проверено. Надо полностью переписывать стратегию. С большей вероятностью, это относится к тем стратегиям, которые уже написаны на базе S#.
- Добавил события ITrader.OrdersFailed и ITrader.StopOrdersFailed (опять же, для асинхронного режима). Как я уже написал, при синхронном режиме в случае неуспеха QuikTrader бросает исключение. Для асинхронного режима реализовать подобное невозможно, потому что информация по заявке может прийти в любое время. Поэтому, когда она придет, и будет означать не успешную регистрацию, будет вызвано данное событие.
- Для асинхронного режима было добавлено свойство QuikTrader.CurrentTransactionId. Первоначально, при создании QuikTrader, оно установлено в значение, равное количеству миллисекунд, прошедшее с начала дня. Для чего сделаны такие хитросплетения. Дело в том, что асинхронный режим, в отличие от синхронного режима, при определении заявки, переданной по DDE, основывается не на номере заявки (Order.Id), а на идентификаторе транзакции (Order.TransactionId). Чтобы обеспечить уникальность данного значение (а оно должно быть строго уникальным), то я сделал эту первоначальную инициализацию. Если у вас ведется какой-то собственный механизм генерации идентификаторов транзакции, то перед самым началом работы необходимо присвоить значение в QuikTrader.CurrentTransactionId. Если же ничего такого нет, то будет достаточно и стандартного поведения.
- В предыдущих версиях, в случае не успешной регистрации синхронным способом QuikTrader.RegisterOrder просто возвращал управление, и необходимо было проверять номер заявки (если он нулевой, значит регистрация не была произведена). Теперь, данный метод в синхронном режиме бросает исключение, которое содержит текстовое описание причины.
- Наконец-то пункт, не касающийся асинхронного режима... Для Strategy я сделал механизм генерации отчетов. Две реализации: XmlStrategyReport - генерация отчетов в формат Xml, и ExcelStrategyReport - генерация в Excel. Первый удобен, если нужно передавать данные между разными роботами. Или, к примеру, сохранять состояние между сессиями. Я уже писал об этом в пункте 6, что нужен механизм выставления первоначального состояния для стратегий, выходящих за границы интрадей трейдинга. Так вот, Xml формат - это идеальное решение.
ExcelStrategyReport необходим тогда, когда нужно в конце дня посмотреть, что же робот наторговал, и как именно. Построить графики, проанализировать результат. Особенность ExcelStrategyReport в том, что он умеет работать с файлом-шаблоном. Например, можно настроить в файле-шаблоне формулы, написать макросы, построить графики. А ExcelStrategyReport будет обновлять свежими данными, и весь отчет автоматически будет перестраиваться. Очень удобно.
- Добавил давно необходимый метод - ITrader.CancelOrders. Отменяет все активные заявки по определенной маске (инструмент, направление, счет и т.д.). Пригодился, к слову, и в примере SampleAsyncTransactions.
- Очень важный пункт. Устранил проблему с ошибкой в конструкторе QuikTrader, когда больше невозможно было пересоздать QuikTrader. На самом деле, это ошибка, скорее следствие неправильного дизайна архитектуры. Не нужно делать автоматическое подключение в конструкторе. Поэтому, теперь метод Connect нужно вызывать отдельно, когда требуется произвести подключение к Квику.
- Расширил поддержку РТС Стандарт. Вкратце, проблема с этой площадкой в S# в том, что коды инструментов не уникальны. Но уникальна комбинация код инструмента + класс инструмента. Поэтому, теперь в таких таблицах как Все Сделки, Мои Сделки, Заявки, Стоп-Заявки передается класс инструмента. Более того, теперь и стакан должен иметь новый заголовок КОД-КЛАСС, что так же решает проблему получения стаканов для РТС Стандарт.
- Чуть модифицировал предыдущее нововведение (пункт 12). Я переименовал событие QuikTrader.FormatTransactionString в QuikTrader.FormatTransaction, и которое теперь передает не просто строку, а TransactionBuilder. С ним форматировать строку транзакции намного удобнее.
- Добавил свойство Strategy.TotalWorkingTime, которое показывает, сколько проработала стратегия. Именно проработала, то есть время простоя, когда стратегия не была запущена, или была приостановлена не учитываются. Только рабочее. Теперь можно следить за операторами (без них роботов пока еще опасно оставлять), сколько они реально наработали за день, и сколько они заработали гонорару.
- Добавил еще один тип менеджера - менеджер задержки LatencyManager. Учитывает, как быстро торговая система принимает заявки от робота. Вкратце, при создании заявки в свойство Order.InitializationTime записывается время создания заявки на клиенте (рассчитывается текущее время, так что те, кто находится вне временной зоны с биржей, нужно принудительно в коде изменять временной сдвиг). Как только придет подтверждение регистрации заявки по DDE, менеджер возьмет реальное время Order.Time, и рассчитает общее время задержки. Теперь можно следить и за брокерами, и за интернет-провайдерами, и за теми, кто из них родом из Эстонии.
- В предыдущей версии я начал направление кастомизации DDE метаданных. В этой версии я еще больше его расширил, сделал его объектно-ориентированным. Появились классы DdeColumn и DdeColumnList. Последний имеет очень интересное поведение. При добавлении, вставки или удалении колонки он автоматически пересчитывает индексы всех остальных колонок. Подробнее, показал в документации в разделе Модификация стандартных таблиц.
- Продолжив реализовывать предыдущий пункт, я сделал QuikTrader.QuotesTable. Аналогично таким настройкам, как QuikTrader.SecuritiesTable, позволяет изменять настройки стакана. Стакан - это довольно интимное место, и многие привыкли использовать допустим биды сверху, офера снизу, наоробот и т.д. Так что, сделал S# чуть дружелюбнее к стакану.
- Order.Direction теперь по умолчанию экспортируется. Раньше я думал о том, что это создаст лишнюю нагрузку, но открыв для себя опцию "Формальные названия" и произведя ряд тестов, я убедился - нужно включать по умолчанию экспорт направления заявки у сделки.
- Добавил возможность (забытую первоначально мною, но о которой вспомнили здесь) возможность задавать комментарий при регистрации. Свойство Order.Comment существовало, но оно заполнялось только при DDE экспорте, но не использовалось в ITrader.RegisterOrder.
- Логи в котирование QuotingStrategy теперь пишутся на русском языке. Просто небольшое улучшение.
- К слову о логах. Появился стандартный класс-логгер, который пишет в файл. Называется StrategyLogger. Давно пора было его вынести из своих роботов в S#. Не было бы таких вопросов.
- Сделал класс Strategy наследником класса Disposable. Вот тут описано, что такое очищение ресурсов в рамках .NET. Не забывайте их подчищать, если хотите, чтобы робот "жил" долго.
- Переделал метод Order.Message в Order.Messages, который теперь есть не просто строка, а коллекция строк. Дело в том, что торговая система в течении жизни заявки может посылать несколько сообщений относительно одной и той же заявки (при регистрации, при снятии, при неудавшемся снятии и т.д.). Логично не перетирать старое значение, а добавлять при этом новое, что и было сделано.
- Буквально в самый последний момент исправил ошибку с датами, которая обсуждалась здесь. В кратце. Квик оставляет с таблице всех сделок (да и не только в ней) сделки с предыдущего дня - вечерней сессии. Экспорт DDE, реализованный в S#, не предоставлял возможность получения даты, и учитывал лишь время. Из-за этого, записи вчерашнего дня интерпретировались как сегодняшние. Например, сделка от "1 апреля 19:30" 2-го апреля имела бы дату "2 апреля 19:30". Не очень хорошо. Поэтому, теперь таблицы Все Сделки, Мои Сделки, Заявки, Стоп-Заявки теперь содержат колонку Дата.
понедельник, 29 марта 2010 г.
Для чего же нужен робот
Прочитав (и отписав, куда ж я без своего мнения) топики http://www.stockportal.ru/forum/index.php?showtopic=12851 и http://quoteforum.ru/index.php?showtopic=4190 (последний выглядит как жуткий стеб, так что воспринимайте данный топик с некой щепоткой скептицизма), я пришел в выводу, что роботы в торговле на российском рынке еще долгое время не смогут конкурировать с людьми.
И так, основные доводы и причины, почему трейдер хочет перевести или уже перевел свою торговлю на автоматизированную:
Видите уже себя? Ага, а теперь вот мое мнение на эти четыре пункта - ПОЛНАЯ БРЕХНЯ:
А теперь мое имхо, для чего нужно переводить торговлю на автоматизацию:
Как видно из моих причин, все они исходят от одного слова - «Надо». В отличие от тех самых первых причин, ведущих свое происхождение от слова «Хочу». Уже видна разница: «Хочу» и «Надо».
Итог. Когда вы почувствовали, что вот оно, желание автоматизировать, в первую очередь задайте себе вопрос, а действительно ли оно «Необходимо», или же вам просто «Хочется» попробовать, не зная четко преимуществ в результате, как и за счет чего они будут достигнуты.
И так, основные доводы и причины, почему трейдер хочет перевести или уже перевел свою торговлю на автоматизированную:
- Отсутствие эмоционального напряжения.
- Возможность освободить себя от торговли, отдав всю работу роботу.
- Увеличить доход путем увеличения количества сделок.
- Об этом говорят многие, уже есть и компании предлагающие свою услуги по автоматизации. Значит это популярно, а популярность не растет на пустом месте.
Видите уже себя? Ага, а теперь вот мое мнение на эти четыре пункта - ПОЛНАЯ БРЕХНЯ:
- Тоесть, себе вы доверить не можете торговлю, а роботу да? С учетом того, что робот торгует или с ошибками (если самописный), или с непонятной порой логикой (если купленный, особенно когда он разработан не профессиональными командами, а форумными завсегдатаями). Робот, чем у него сложнее логика и чем он быстродейственней (а в другом случае и создавать нет причин программу), требует все больше и больше внимания. И я сильно сомневаюсь, что видя, как робот начинает медленно сливать, вы не потянитесь в заветной кнопке Стоп.
- Прочитали первый пункт? Ну и как, готовы освободить себя, уйдя, допустим в магазин за покупками, вместо сидения за монитором? Это в лучшем случае, если при случившемся изменении на рынке робот просто выкинет ошибку и прекратит свою работу. В худшем - продолжит торговать дальше. И такое он вам наторгует...
- Делая 10 сделок за день, я получаю X денег. Делая 10 * 100 сделок в день я буду получать в 1000 раз больше. Логично с математической точки зрения. А вот в реальности или заплатите еще и за комиссию, или получите те же X денег.
- Действительно, говорят об этом многие. Меньше говорят те, кто от этого получил выгоду (поговорить то могут все), еще меньше скажут, что это было положительным решающим фактором для их бизнеса. На фоне популярности обсуждений естественно рождаются компании-разработчики. Такие компании, как правило, или предлагают свои услуги по созданию роботов, или продают готовый софт. Если вы выбрали разработку на заказ, то вам придется столкнутся с такими перипетиями разработки ПО на заказ, что вы еще не раз проклянете себя за данное решение.
Допустим, вы успешно пройдете путь создания своего робота, и в итоге получите ожидаемое. ВНИМАНИЕ, это еще не значит, что данный продукт принесет автоматически профит. Людям из компаний-разработчиков не интересны ваши гениальные стратегии, не приносящие ничего, кроме убытков. Им интересны ваш деньги, которыми вы будете оплачивать их жизнь.
Очень, очень сложно грамотно поставить процесс, и получить действительно полезную вещь. Вот вам ссылка на мое обсуждение - http://forex.kbpauk.ru/showflat.php/Cat/0/Number/289931/an/0/page/0#Post289931 (читать с поста Bell-а, к слову. "нанять программеров" забавная тема).
Если Вы захотели купить готового робота, то вот вам простое замечание. Стоящую стратегию никто вам продавать не будет (возможно, есть и исключения, но я их не встречал). Это если действительно ноу-хау, которое приносит деньги. А если и будут продавать, то это или ненужная разработка с сомнительным профитом, или обычная вспомогательная утилита, например, как привод. Кстати, последний может быть и полезен, но только это нисколько не робот, а лишь удобное расширение вашего терминала.
А теперь мое имхо, для чего нужно переводить торговлю на автоматизацию:
- Торговую стратегию невозможно реализовать ручным трейдингом. Например, высокочастотный трейдинг, сложный аналитический процесс и т.д.
- Минимизировать человеческий фактор. Например, когда идет с высокой частотой рутинная работа с копированием и вставкой параметров из одной программы в другую программу (например, одна вычисляет по формулам значения, другая по этим значениям и рынку анализирует, что сейчас необходимо делать).
Как видно из моих причин, все они исходят от одного слова - «Надо». В отличие от тех самых первых причин, ведущих свое происхождение от слова «Хочу». Уже видна разница: «Хочу» и «Надо».
Итог. Когда вы почувствовали, что вот оно, желание автоматизировать, в первую очередь задайте себе вопрос, а действительно ли оно «Необходимо», или же вам просто «Хочется» попробовать, не зная четко преимуществ в результате, как и за счет чего они будут достигнуты.
Подписаться на:
Сообщения (Atom)

