Для большинства трейдеров свечные графики различного таймфрейма это и есть рынок, там скрывается все - и тренд и боковик и хитрый маркет мэйкер с глобальным кукловодом. Начнем с простых фактов, за одну сессию 2012.11.07 на фьючерсе Ri ядро биржи обработало 10 449 043 транзакций или примерно 12 000 транзакций в минуту, одна свечка самого \"высоко частотного\" минутного таймфрема скрывает за собой огромное количество более элементарных действий. Поэтому мы спустимся на самый низкий уровень того, что происходит на бирже и начнем оттуда. Можно долго рассказывать про то как устроена биржа, про промежуточные сервера и другие части \"транспортной\" инфракстуры, какие задержки они вносят при путешествии заявки, но в конце пути любая заявка попадает в ядро биржие, где непосредственно происходит то ради чего все собственно и затевалось - сведение(matching). И на этом уровне, в смысле формата данных и производимых элементарных действий, FORTS мало чем отличается от той же CME или любой другой современной биржи. Входной поток состоит из заявко двух типов, на вставку(insert) и отмену(cancel). Бьете вы по рынку или выставляете заявку в глубь стакана - для ядра нет разницы, все это в конечном итоге преобразуется в заявку на вставку, которой присваивается свой уникальный идентификатор. Другой тип заявок - на отмену, позволяет убрать часть(или всю) предшествующей заявки на вставку. Ядро принимая на входе поток состоящий из заявок на вставку и отмену, создает поток сведенных сделок, каждая сведенная сделка связана с двумя заявками участвующих в сделке. Исходя из полученного потока, затем строятся стаканы, и тиковые данные(сведенные сделки), которые рассылаются пользователям(к примеру на RTS срезы стаканов строятся с периодичностью 30 миллисекунд), и лишь затем тики преобразуются в красивые свечки, отображаемые на экране. Поток данных содержащий заявки на вставку, отмену и сведенные сделки, на FORTS называется Full Order Log. Рассмотрим более подробно формат данных Full Order Log. Возьмем для примера маленький, кусочек: QUOTE TYPE TIMESTAMP SESSION ORDER_ID STATUS ACTION PRICE VOL DEAL_ID DEAL_PRICE \u003c- A .... \u003c- B \u003c- C \u003c- D QUOTE - содержит название инструмента, TYPE - направление заявки (+1 - bid, -1 - ask), TIMESTAMP - временная метка в микросекундах, SESSION - идентификатор сессии, ORDER_ID - идентификатор заявки, STATUS - флаги заявки, ACTION - тип заявки (0 - отмена, 1 - вставка, 2 - сведенная сделка), PRICE - цена, VOL - объем заявки, DEAL_ID - идентификатор сделки, DEAL_PRICE - цена сделки. На примере выше показан цикл жизни заявки, вставка заявки c идентификатором 9368447586 в поток (A), вставка встречно заявки (C), первая сторона сведенной сделки (B) и вторая сторона (D). Теперь, немного разобравшись в формате данных, можно приступить к статистическому анализу. Всего за сессию было произведено 10 449 043 транзакций, из них 4 990 732 на вставку, и 4 362 829 на отмену, а сведено сделок - 1 095 482. То есть \"в среднем по больнице\" на каждую сделку приходилось 4 перестановки. Следующий вопрос, который возникает - каким образом данная активность распределена по объемам. Для этого посчитаем следующие факторы - количестов вставок и отмен для заданного объема, отношение отмененых заявок к выставленным, чем меньше это соотношение тем больше количество сделок сведено на каждую вставленную заявку, тогда умножив соотношение на количество вставленных заявок, мы получим количество проторгованных заявок для данного объема заявки. В результате получим следующую табличку, отсортированную по столбцу проторгованного объема(для анализа использовался python + scipy): cancel_count cancel_volume insert_count insert_volume ratio trade_volume 1176407 1 1452121 1 0.810130 275714 272998 5 327113 5 0.834568 270575 1257775 2 1369794 2 0.918222 224038 39698 10 55877 10 0.710453 161790 432361 4 470513 4 0.918914 152608 668395 3 718625 3 0.930103 150690 15002 20 20662 20 0.726067 113200 1455 50 3608 50 0.403271 107650 453 100 1404 100 0.322650 95100 201295 8 212359 8 0.947900 88512 21651 15 27185 15 0.796432 83010 99168 6 110608 6 0.896572 68640 1989 30 4107 30 0.484295 63540 4926 25 7438 25 0.662275 62800 1025 200 1310 200 0.782443 57000 37216 12 41715 12 0.892149 53988 68 500 172 500 0.395349 52000 17857 7 25274 7 0.706536 51919 cancel_volume, insert_volume - объем в заявке на вставку или отмену, cancel_count - количество отмен, insert_count - количество вставок, ratio - соотношение, trade_volume - оценка проторгованного объема в контрактах. Как видно, объемы заявок на вставку, можно условно разделить на две группы, small-volume traders с диапазоном объема 1-10 - высокочастотные трейдеры и скальперы, и всех остальных, как видно во второй группе, значения проторгованного объема кучкуются вокруг \"психологических\" уровней заявок - 15, 20, 25, 30, 50, 100, 200, 500. код на питоне Продолжение следует...
Спасти скальпера или тестирование на Full Orders Log. Скальпинг - это стратегия, подразумевающая быстрый вход на импульсе, снятие прибыли(скальпа трендового движения) и выход, до момента возврата цены к средней. Инструментами рядового скальпера являются стакан, скальперский привод, а также (поводыри) западные индексы и природные ресурсы от которых зачастую зависят цены базового актива, и в следствии цены на фьючерсы, которыми скальперы и торгую. Это знают все. У меня есть свое мнение на эту тему, так как лично я и сам торговал в пропе. Инструментами правильного скальпера должны стать не привод и не поводыри, они пригодятся - это само собой, но главным объектом внимания, любого трейдера должны стать не графики, или приводы - а исследования рынка. Обратите внимание на засилье различных курсов по скальпингу в последнее время. Такие курсы зачастую предоставляют помимо базовых принципов, стартегии, которые уже не работают, или перестанут работать в ближайшее время, потому что на таких маленьких таймфреймах - рынок меняется намного быстрее, чем, например на часовках. А самые безбашенные авторы и вообще не проводили никаких изысканий в этой области. Я призываю трейдеров, которые собираются пройти один из таких курсов, какие бы копейки он не стоил - \"научиться ловить рыбу самим\" вместо того, чтобы брать ее непонятно у кого и непонятно какого качества! Но, ближе к делу! Каким инструментарием может пользоваться новоявленный исследователь: Инструменты для исследовательской работы Excel - это очень полезная программа и я лично ей пользуюсь, но исключительно, как дополнение к более продвинутому софту. Я знал людей, которые пробовали даже тестировать стратегии в Excel.. Мое мнение - это не серьезно, не понимаю, как в нем можно протестировать какую-то стратегию, но как помощник - самое то! Мат-lab - это профессиональный инструмент математиков, как и excel он платен , но лицензия на него стоит не дешево. На нем можно тестировать все что угодно, были бы данные. И стратегии на индикаторах и мани-менеджмент. Однако из-за его дороговизны, необходимости изучать еще один язык программирования и нужды прописывать все что уже и так есть в системах для тестирования стратегий, считаю такие усилия неоправданными. Лично я использую его, когда не хватает функционала у Excel, для расчетов. Wealth и подобные программы, специально созданные для тестирования стратегий. Я пробовал тестировать тиковые стратегии. Мне есть что написать по этому поводу: - Тики можно сжать до любых свечек, 2-10 или 47 секундных. Здесь мы уже можем подсчитать проскальзывание и комиссию. Проблема в том, что такого медленного тестирования вам не захочется. Когда программа сжимает тики и без того медленное тестирование превращается в 5-ти дневное ожидание, когда за час до окончания теста у Вас или перегревается компьютер, или один маленький перепад напряжения и все тесты насмарку, а они ведь могут оказаться и отрицательными! - Часто наши любимые, в иных случаях программы, Wealth-lab и т.д., начинают тормозить и подвисать. Конечно, вам нужны достаточно хороший компьютер, но я говорю про ситуации даже когда у Вас больше 16GB оперативной памяти. - Это все еще тестирование на свечках. Это значит, что мы не видим стакан. А для скальпера - это критично! Программа не видит, как \"живет\" рынок. И это еще одна причина по которой скептики отказываются от исследований. - Тиковых данных по фьючерсу на индекс РТС когда я его тестировал, в блокнот у меня помещалось только 3 месяца сделок. Их нужно было скачать по одному дню(только так, по-другому никак ее было скачать нельзя ), затем самостоятельно склеить. StockSharp - я узнал об этом способе проведения исследований от человека, которые предоставлял такие курсы по скальпингу, про которые я писал в начале. Оказалось, что он тестирует скальперские стратегии в StockSharp, но не на свечках а на ордер логе. Full orders log — это список всех заявок с полной информацией по каждой заявке. Еще его называют анонимным ордер логом (анонимная рыночная информация), т.к. из всей информации о заявке в нем не доступен только номер счета клиента, пославшую эту заявку. Как вы понимаете, эта информация конфиденциальна. Ордер лог, это самый глубокий и детальный уровень информации, который доступен трейдеру. Источник Тестирование на ордер логе, тоже не является панацеей, рынок все также меняется, а тестирование все такое же медленное. Но ничего лучше еще не придумали, здесь мы получаем всю полноту информации, тестирование на стакане, а стакан для скальпера - самое важное. Также, пользуясь инструментарием StockSharp можно скачать ордер лог, или тиковые данные и уже из них создать свечки любого тайм-фрейма! Для чего нам это нужно? Когда нам не приходится сжимать тики в 10-ти секундные свечки в самом Wealth-lab - тестирование проходит намного быстрее и сама программа \"чувствует\" себя лучше, не тормозит и не зависает. Поэтому кому не нужно супер точное тестирование - этот вариант для вас! Главное уделять внимание исследовательской работе и ваши результаты улучшаться! Ресурсы для проведения исследования Качественные данные. Есть 2 новости хорошая и плохая. Плохая - то что скорее всего данные ордер лога вам найти не удастся. Качественные данные можно, конечно купить напрямую у RTS - но это будет неоправданно дорого.Хорошая новость заключается в том, что для тестирования скальперских стратегий много истории не нужно. подключение плаза - это обязательное условие скальпинга, так что считаем, что оно у нас есть по определению. Так что, ничего нам не мешает записать ордер лог с плазы. Особенно радует тот факт, что к плазе можно подключить одновременно и программу для записи ордер лога и скальперский привод. Так что можем и торговать и записывать данные одновременно. Софт для записи называется S#.Data. Единственным его назначением является записывать данные сохранять их в специальном формате и преобразовывать одни данные в другие. Благодаря ему, из ордер лога можно вытащить и стаканы и тиковые данные, из тиковых данных можно сделать свечки любого таймфрейма. Ордер лог - самый полный пакет данных, поэтому кроме как записью с плазы получить синтезировать его никак нельзя. Также, можно записать сделки и стаканы с обычного Quik, но они будут рассинхронизированы, а для скальперов - стакан имеет важное, если не первостепенное значение. Тестирование без стакана возможно, но оно более грубое и лишено важных преимуществ. S#.Data выглядит вот так: S#.Data Порядок действий для записи лога заявок Как пользоваться S#.Data: Как пользоваться S#.Data Как создать инструмент: Как создать инструмент Как настроить плазу: Как настроить плазу Как запустить приложение: Запустить приложение Тестер стратегий. Когда вы записали данные считайте, что половину дела вы уже сделали. Осталось всего-навсего написать свой привод для тестирования и саму стратегию. =) Под меня написанный тестер, он простой, без визуализации, специально под тот шаблон стратегий, к которому я привык. Статистика в динамике выгружается автоматически в Excel. Здесь я взял шаблон, что давали, на обучении и пользуюсь им практически без его доработки. Он симпатичен на вид и есть графики эквити и проскальзывания. Шаблон тестера выглядит так. Шаблон тестера стратегий Для примера взял трендовую стратегию пробоя полос Боллинджера. Визуальное представление стратегии С точки зрения самого процесса, тестирование на ордер логе практически ничем не отличается от обычного, главное не забыть вписать: Trader.RegisterOrderLog(security); Регистрируем Ордер лог UseOrderLog = true, Использовать Ордер лог Условия тестирования: Условия тестирования Почему я не учитываю комиссию. Все просто, частенько приходится тестировать стратегии, для которых наиболее выгодным вариантом будет Fix комиссия. Такую услугу предлагает практически каждый брокер, но цены разные, поэтому просто вычитаю ее из прибыли. В любом случае, вы можете посчитать комиссию, как общее количество закрывающих сделок умножить на вашу нынешнюю комиссию на круг и вычесть ее из общего результата . Хотя данная \"стратегия\" всего лишь пример - это не готовая стратегия, которую можно было бы торговать. Статистика и эквити протестированной нами стратегии с 15-ого по 25-ое января 2013, в расчете на 1 контракт. Результаты тестирования стратегии Просадки впечатляют, но положительное мат. ожидание - на лицо. Проскальзывание - 0, потому что и на вход и на выход использовалось лимитное котирование. Время. Как я писал ранее, тестирование на ордер логе требует больше времени, из-за того что оно в точности повторяет все события, происходящие на рынке. Лично я решил для себя эту проблему, используя несколько компьютеров для тестирования. Также, я использую методику, которая называется тестирование под управлением пользователя. По сути это ручная генетическая оптимизация. Такой подход экономит машинное время, но мне приходится тратить больше моего личного времени на проведение оптимизации. Также я часто использую прикидочные тесты в Wealth-lab. Для того, чтобы результаты тестирования в Wealth-la были близки к тестам в StockSharp при входах, например котированием, нужно использовать специальный компоненты EnterAtPrice и ExitAtPrice. С помощью них, входы происходят по точно определенной цене на том баре, который мы укажем. Ориентировочно по этим ценам мы и войдем в рынок котированием. Эти компоненты позволяют нам тестировать входы на а не на , что намного точнее. Тестируйте свои стратегии, проверяйте по 3 раза код, чтобы не переделывать тесты! Пользуйтесь только лучшими инструментами, будьте исследователями, но не забывайте торговать! Код стратегии: namespace BollingerTrendStrategy { using System; using Ecng.Common; using Ecng.ComponentModel; using Stops; using StockSharp.Algo; using StockSharp.Algo.Candles; using StockSharp.Algo.Indicators; using StockSharp.Algo.Indicators.Trend; using StockSharp.Algo.Strategies; using StockSharp.BusinessEntities; using StockSharp.Algo.Candles.Compression; using StockSharp.Algo.Indicators; using StockSharp.Algo.Indicators.Misc; using StockSharp.Algo.Indicators.Trend; /// /// Стратегия по полосам Болинджера, пробойная. /// internal class BollingerTrendStrategy : Strategy { private BollingerBands _bands; private CandleSeries _series; /// /// Событие отрисовки новой свечки и значения индикатора. /// public event Action Draw; protected override void OnStarted() { //создаем серию свечек и индикатор this._series = Security.TimeFrame(TimeSpan.FromSeconds(60)); this._bands = new BollingerBands { Length = 64 }; //указываем период, за который должны формироваться свечки для данной серии this._series.WorkingTime = new WorkingTime { Times = new { new Range(TimeSpan.FromHours(10), TimeSpan.FromHours(19)), } }; //подписываемся на событие окончания формирования свечек по серии //а так же на событие изменения свечек, чтобы можно было перерисовывать график в реалтайм режиме this._series .WhenCandlesFinished() .Do(Process) .Apply(this); //запускаем процесс формирования свечек this .GetCandleManager() .Start(this._series); base.OnStarted(); } /// /// Основной алгоритм. /// /// Свечка. private void Process(Candle candle) { //пересчитать значение индикатора для новой свечки this._bands.Process(candle); //вызываем событие отрисовки свечки и индикатора на графике this.Draw.SafeInvoke(candle, this._bands); //если состояние свечки не Finished, значит сработало событие //изменения свечки и нет необходимости принимать решение о входе или выходе из позиции if (candle.State != CandleStates.Finished) return; //получаем таймфрейм свечек var timeFrame = (TimeSpan)this._series.Arg; //получаем время начала последней свечки с учетом текущего времени var time = timeFrame.GetCandleBounds(Security).Min - timeFrame; bool SignalLong; //Переменная для входа в лонг bool SignalShort; //Переменная для входа в шорт SignalLong = candle.ClosePrice \u003e this._bands.UpBand.GetCurrentValue(); SignalLong \u0026= Position=0; if (this._bands.IsFormed) { //При пробитии канала нет открытой позиции или открыта длинная позиция - Long, предварительно продав if (SignalLong \u0026\u0026 doNotEnter \u003e Security.GetMarketTime().TimeOfDay \u0026\u0026 Security.GetMarketTime().TimeOfDay \u003e isItMorning) { if (Position == 1) { //sell ChildStrategies.Add(new LimitQuotingStrategy(OrderDirections.Sell, 1,_bands.UpBand.GetCurrentValue())); //RegisterOrder(this.SellAtMarket()); } if (ChildStrategies.Count == 0) { //RegisterOrder(this.BuyAtMarket()); ChildStrategies.Add(new LimitQuotingStrategy(OrderDirections.Buy, 1, _bands.UpBand.GetCurrentValue())); } } //При пробитии канала нет открытой позиции или открыта короткая позиция - Short, предварительно откупив if (SignalShort \u0026\u0026 doNotEnter \u003eSecurity.GetMarketTime().TimeOfDay \u0026\u0026 Security.GetMarketTime().TimeOfDay \u003e isItMorning) { if (Position == -1) { //buy ChildStrategies.Add(new LimitQuotingStrategy(OrderDirections.Buy, 1,_bands.LowBand.GetCurrentValue())); //RegisterOrder(this.BuyAtMarket()); } if (ChildStrategies.Count == 0) { //sell ChildStrategies.Add(new LimitQuotingStrategy(OrderDirections.Sell, 1, _bands.LowBand.GetCurrentValue())); //RegisterOrder(this.SellAtMarket()); } } } } } } Спасибо за внимание!