Перешел на 4.0.21, запускаю тест на истории и наблюдаю радикальноотличающийся график эквити. Перебрал несколько прошлых сборок: 4.0.17, 4.0.18, 4.0.19, 4.0.20 график примерно одинаковый.



и текущая

😳 Ну все думаю, накрылся мой грааль.😀
Запускаю тестовые примеры 4.0.20 и 4.0.21 графики примерно одинаковые(для ускорения тестирования период взят 1месяц)

😳
Ковыряние в своем коде результатов не дало. Причина нашлась после изучения отчетов. При сравнении аналогичных входов на 4.0.20 и 4.0.21 вход всегдабыл примерно на 100п. хуже. Почему 100п, у меня стояло проскальзывание в 100п.
Меняю в тестовых примерах вход с помощью котирования
// если произошло пересечение
if (_isShortLessThenLong != isShortLessThenLong)
{
// если короткая меньше чем длинная, то продажа, иначе, покупка.
var direction = isShortLessThenLong ? OrderDirections.Sell : OrderDirections.Buy;
// создаем заявку
var order = this.CreateOrder(direction, Security.GetMarketPrice(direction), Volume);
// регистрируем заявку (обычным способом - лимитированной заявкой)
// RegisterOrder(order);
// регистрируем заявку (через котирование)
var strategy = new MarketQuotingStrategy(order, new Unit(), new Unit());
ChildStrategies.Add(strategy);
// запоминаем текущее положение относительно друг друга
_isShortLessThenLong = isShortLessThenLong;
}
на вход по рынку с проскальзыванием
// если произошло пересечение
if (_isShortLessThenLong != isShortLessThenLong)
{
// если короткая меньше чем длинная, то продажа, иначе, покупка.
var direction = isShortLessThenLong ? OrderDirections.Sell : OrderDirections.Buy;
var slip = Security.MinStepSize * 20;//проскальзование 100п.
var price = isShortLessThenLong
? Security.GetMarketPrice(direction) - slip
: Security.GetMarketPrice(direction) + slip;
// создаем заявку
var order = this.CreateOrder(direction, price, Volume);
// регистрируем заявку (обычным способом - лимитированной заявкой)
RegisterOrder(order);
// регистрируем заявку (через котирование)
//var strategy = new MarketQuotingStrategy(order, new Unit(), new Unit());
//ChildStrategies.Add(strategy);
// запоминаем текущее положение относительно друг друга
_isShortLessThenLong = isShortLessThenLong;
}
Картинка примерно не изменилась.

Ок, ставлю проскальзывание в 10 000п.

Т.е. вход по рынку происходит не по лучшей возможной цене, а по худшей и с максимальным проскальзыванием.
Kommentare (23)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
Вопросы:
это как? В моем понятии проскальзывание это то что происходит на бирже а не выставляется внутри стратегии. Например MarketEmulator.Settings.Slippage - это то, насколько по более худшей цене по сравнению с последняя сделка произойдет исполнение маркет-ордера
Про класс MarketEmulator вообще не знал. В примерах по тестированию использование данного класса не нашел. Можно небольшой пример как его применять?
см. EmulationTrader.MarketEmulator и документацию
с 4.0.20->4.0.21 ничего с матчингом маркетордеров не менялось, для того чтобы выяснить есть ли ошибка в тестере надо по логам по ордерно разбитраться.
3.4. Тест на генерируемых стаканах.
Естественно что проскальзывание происходит на бирже. Допустим есть лучший бид/оффер 900/910, я хочу продать по рынку. Посылаю лимитку на продажу по 800, т.е. устанавливаю для стратегии порог в 100п на проскальзывание. Моя заявка может исполнится как по 900, так и допустим по 850, т.е. по лучшему биду в текущий момент. Если же на момент когда моя заявка будет на бирже лучший бид будет меньше 800, скажем 790, то я встану в стакан лимиткой на продажу по 800. Это я и называю учитывать/выставлять проскальзывание внутри стратегии.
Это то как работает алгоритм данного свойства? Т.к. в моем понимании проскальзывание это не то, насколько по более худшей цене пройдет исполнение моей заявки по сравнению с последней. А то, по какой цене исполнится моя заявка, относительно той цены, которую я увидел в стакане на момент отправления заявки.
Естественно что проскальзывание происходит на бирже. Допустим есть лучший бид/оффер 900/910, я хочу продать по рынку. Посылаю лимитку на продажу по 800, т.е. устанавливаю для стратегии порог в 100п на проскальзывание. Моя заявка может исполнится как по 900, так и допустим по 850, т.е. по лучшему биду в текущий момент. Если же на момент когда моя заявка будет на бирже лучший бид будет меньше 800, скажем 790, то я встану в стакан лимиткой на продажу по 800. Это я и называю учитывать/выставлять проскальзывание внутри стратегии.
Понял вас. Но в таком случае вы пользуетесь лимитными заявками, а не маркетордерами. Поскольку ввсе-таки выставляете цену в 800.
В итоге, вы утверждаете что теперь кидаете селл-заявку ниже рынка на 100 пунктов и она всегда исполняется по этой самой худщей цене, даже если есть бид гораздо лучше?
Смотрите, есть режим эмуляции без стакана вообще. Это когда нет генераторов и нет данных о стакане. В этом конкретном случае заявки помеченные как маркетные (НЕ лимитные!) исполняются по LastTrade плюс Slippage если заявка на покупку или LastTrade минус Slippage если на продажу.
Если есть какие-то стаканы, генерированные или записанные то и маркетные ордера и лимитированные филяться о встречные заявки и свойство Slippage фактически не используется
И если это свойство ограничивает, то как ввести в тестирование на истории проскальзывание при сделках по рынку ?
Может я чего то не знаю, но насколько мне известно на фортс нет рыночных заявок. Если надо войти по рынку, то выставляется лимитка с заведомо большей/меньшей ценой, чтобы купить/продать. Касательно S# знаю только два способа как подать заявку.
Возможно Security.GetMarketPrice(OrderDirections.Buy) считается "рыночным" ордером?
UPD: Отвечаю сам на свой вопрос "рыночные" это BuyAtMarket и SellAtMarket. Но с реализацией данных методов я не совсем согласен(посмотрел рефлектором) Т.к. с помощь их не всегда можно войти по "рынку".
На РТС нет маркетных заявок. Так что хоть как-то входить. Не по планкам же.
Так вопрос утыкается в то что если есть цена более лучшая чем указанная то сделка закрывается по ней. Это, на фортсе, будет принцип входа по маркету. Тоже самое что по краю стакана ударить.
Сейчас речь о тестере? С тестером это не ко мне. Я ответил насчет того, почему XXXAtMarket так сделан.
Фикс залит на codeplex. Возьмите свежие библиотеки из ветки dev и протестируйте. Только учитывайте то, что архив с котировками (RIU9@RTS) был также обновлён.
EmulationTrader.MarketEmulator.Settings.Slippage это максимальное проскальзование. Т.е. если Slippage = 100, то проскальзование будет браться случайным образом от 0 до 100.
Цитата из справки
Если же используются стаканы, то проскальзывание можно сэмулировать с помощью периода обновления стакана, я так делаю.
Допустим появился сигнал на вход, входим в шорт по рынку, стакан последний раз генерировался по 1000, bid/offer 990/1010, но последний тик уже 1020, bid/offer 1010/1030 и мы должны войти по 1010, но т.к. стакан генерируется с каким то периодом, то мы войдем по худшей цене по 990.
Возможен и другой вариант, если последний тик 980, то получается мы войдем по лучшей цене. Т.е. может эмулируется как положительное так и отрицательное проскальзывание. Это то как я понимаю работу тестера, возможно и не правильно.
Опять же, все зависит от стратегии, если вход может быть только скажем по закрытию 1 мин. свечки, то это не подойдет. А если вход возможен на каждом тике, то да. Ну если только обновление стакана поставить раз в 2 минуты.🙂
Самое интересное что стакан не обновляется чаще чем 1 раз в секунду, установлено экспериментальным путем.
_trader.DepthGenerators[security] = new TrendMarketDepthGenerator(security) ;
и
это синонимы ?
А какой закон распределения этого проскальзывания? равномерно в интервале от 0 до 100? или от -100 до 100? или неравномерно? Есть ли способ установить фиксированное проскальзывание на каждую сделку?
Для тех рынков где нет рыночных заявок - синонимы. где есть - нет, т.к. второй вариант создаст именно рыночную заявку, а первый вариант - нет, будет по стакану смотреть.
Установил EmulationTrader.MarketEmulator.Settings.Slippage в 10 пипсов, стаканов нет и не генерирую. При этом сделки this.SellAtMarket(Volume) исполняются по LastPrice. Версия 0,22. Баг?
Проблема которая была в 4.0.21 никуда не делась в 4.0.22, также как и в 4.0.23. Из за этого похоже и не работает slippage.
Смотрите на 4.1
Попробуем в ближайшие пару недель. Есть ещё что хочется сделать для 4.1. Код первичнее документации
Версия 4.1.5 Тестирую стратегию в EmulationTrader при UseMarketDepth = false. При этом лимитные заявки по заведомо лучшей цене исполняются по цене заявки, а не по цене последней сделки. ТО есть если послать лимитку на покупку фьючерса ртс по 1000000, то сделка пройдет по цене 1000000. При этом параметр EmulationTrader.MarketEmulator.Settings.Slippage на результат не влияет. Задача состоит в том, чтобы совершать сделки по LastPrice с фиксированным проскальзыванием против меня, например, 10 пипсов. Раньше (версии 4.0.х) для этого я входил лимитником с ценой на 1000 пипсов хуже, что обеспечивало мгновенную сделку по LastPrice с проскальзыванием, указанным в EmulationTrader.MarketEmulator.Settings.Slippage. Можно ли получить такую же функциональность в 4.1.5?
Если исполняется по цене заявки, логичный workaround для тестирования выставлять заявку по LastPrice плюс проскальзывание - вероятно результат будет более ожидаем.
"Если исполняется по цене заявки, логичный workaround для тестирования выставлять заявку по LastPrice плюс проскальзывание - вероятно результат будет более ожидаем"
Обновился до версии 20971 из транка, все работает как надо! Спасибо =)