Тестирование на истории 4.0.21 вход по рынку всегда по худшей цене.

Тестирование на истории 4.0.21 вход по рынку всегда по худшей цене.
Atom
3/10/2012
Moadip


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

и текущая

[blink] Ну все думаю, накрылся мой грааль.[biggrin]

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

[blink]

Ковыряние в своем коде результатов не дало. Причина нашлась после изучения отчетов. При сравнении аналогичных входов на 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п.

Т.е. вход по рынку происходит не по лучшей возможной цене, а по худшей и с максимальным проскальзыванием.




Thanks:


1 2 3  >
pyhta4og

Avatar
Date: 3/10/2012
Reply


Вопросы:

  1. Проскальзывание ставите MarketEmulator.Settings.Slippage=100?
  2. Используете в стратегии только маркет-ордера?
  3. Тестируете со генерируемыми стаканами ?
  4. Тестируете с настоящими стаканами ?
Thanks:

Moadip

Avatar
Date: 3/10/2012
Reply


pyhta4og: Вопросы:

  1. Проскальзывание ставите MarketEmulator.Settings.Slippage=100?
  2. Используете в стратегии только маркет-ордера?
  3. Тестируете со генерируемыми стаканами ?
  4. Тестируете с настоящими стаканами ?
  1. Нет, проскальзывание ставиться внутри стратегии. Про класс MarketEmulator вообще не знал. В примерах по тестированию использование данного класса не нашел. Можно небольшой пример как его применять?
  2. Да, только маркет ордера. 3.4. Тест на генерируемых стаканах.
Thanks:

pyhta4og

Avatar
Date: 3/10/2012
Reply


Moadip:

pyhta4og: Вопросы:

  1. Проскальзывание ставите MarketEmulator.Settings.Slippage=100?
  2. Используете в стратегии только маркет-ордера?
  3. Тестируете со генерируемыми стаканами ?
  4. Тестируете с настоящими стаканами ?
  1. Нет, проскальзывание ставиться внутри стратегии.

это как? В моем понятии проскальзывание это то что происходит на бирже а не выставляется внутри стратегии. Например MarketEmulator.Settings.Slippage - это то, насколько по более худшей цене по сравнению с последняя сделка произойдет исполнение маркет-ордера

Про класс MarketEmulator вообще не знал. В примерах по тестированию использование данного класса не нашел. Можно небольшой пример как его применять?

см. EmulationTrader.MarketEmulator и документацию

  1. Да, только маркет ордера.

с 4.0.20->4.0.21 ничего с матчингом маркетордеров не менялось, для того чтобы выяснить есть ли ошибка в тестере надо по логам по ордерно разбитраться.

3.4. Тест на генерируемых стаканах.

Thanks:

Moadip

Avatar
Date: 3/10/2012
Reply


это как? В моем понятии проскальзывание это то что происходит на бирже а не выставляется внутри стратегии.

Естественно что проскальзывание происходит на бирже. Допустим есть лучший бид/оффер 900/910, я хочу продать по рынку. Посылаю лимитку на продажу по 800, т.е. устанавливаю для стратегии порог в 100п на проскальзывание. Моя заявка может исполнится как по 900, так и допустим по 850, т.е. по лучшему биду в текущий момент. Если же на момент когда моя заявка будет на бирже лучший бид будет меньше 800, скажем 790, то я встану в стакан лимиткой на продажу по 800. Это я и называю учитывать/выставлять проскальзывание внутри стратегии.

Например MarketEmulator.Settings.Slippage - это то, насколько по более худшей цене по сравнению с последняя сделка произойдет исполнение маркет-ордера

Это то как работает алгоритм данного свойства? Т.к. в моем понимании проскальзывание это не то, насколько по более худшей цене пройдет исполнение моей заявки по сравнению с последней. А то, по какой цене исполнится моя заявка, относительно той цены, которую я увидел в стакане на момент отправления заявки.

Thanks:

pyhta4og

Avatar
Date: 3/10/2012
Reply


это как? В моем понятии проскальзывание это то что происходит на бирже а не выставляется внутри стратегии.

Естественно что проскальзывание происходит на бирже. Допустим есть лучший бид/оффер 900/910, я хочу продать по рынку. Посылаю лимитку на продажу по 800, т.е. устанавливаю для стратегии порог в 100п на проскальзывание. Моя заявка может исполнится как по 900, так и допустим по 850, т.е. по лучшему биду в текущий момент. Если же на момент когда моя заявка будет на бирже лучший бид будет меньше 800, скажем 790, то я встану в стакан лимиткой на продажу по 800. Это я и называю учитывать/выставлять проскальзывание внутри стратегии.

Понял вас. Но в таком случае вы пользуетесь лимитными заявками, а не маркетордерами. Поскольку ввсе-таки выставляете цену в 800.

В итоге, вы утверждаете что теперь кидаете селл-заявку ниже рынка на 100 пунктов и она всегда исполняется по этой самой худщей цене, даже если есть бид гораздо лучше?

Например MarketEmulator.Settings.Slippage - это то, насколько по более худшей цене по сравнению с последняя сделка произойдет исполнение маркет-ордера

Это то как работает алгоритм данного свойства? Т.к. в моем понимании проскальзывание это не то, насколько по более худшей цене пройдет исполнение моей заявки по сравнению с последней. А то, по какой цене исполнится моя заявка, относительно той цены, которую я увидел в стакане на момент отправления заявки.

Смотрите, есть режим эмуляции без стакана вообще. Это когда нет генераторов и нет данных о стакане. В этом конкретном случае заявки помеченные как маркетные (НЕ лимитные!) исполняются по LastTrade плюс Slippage если заявка на покупку или LastTrade минус Slippage если на продажу.

Если есть какие-то стаканы, генерированные или записанные то и маркетные ордера и лимитированные филяться о встречные заявки и свойство Slippage фактически не используется

Thanks: Moadip

Moadip

Avatar
Date: 3/10/2012
Reply


Но в таком случае вы пользуетесь лимитными заявками, а не маркетордерами.

Может я чего то не знаю, но насколько мне известно на фортс нет рыночных заявок. Если надо войти по рынку, то выставляется лимитка с заведомо большей/меньшей ценой, чтобы купить/продать. Касательно S# знаю только два способа как подать заявку.


        void GoLong(decimal vol)
        {
            var order = new Order
            {
                Portfolio = Portfolio,
                Price = Security.BestAsk.Price + Security.MinStepSize * _instrSlippage, ////////////// проскальзывание
                Security = Security,
                Volume = vol,
                Direction = OrderDirections.Buy,
            };
            RegisterOrder(order);
        }


        var order = StrategyHelper.CreateOrder(this, OrderDirections.Buy, Security.GetMarketPrice(OrderDirections.Buy), Volume);
        RegisterOrder(order);

Возможно Security.GetMarketPrice(OrderDirections.Buy) считается "рыночным" ордером?

В итоге, вы утверждаете что теперь кидаете селл-заявку ниже рынка на 100 пунктов и она всегда исполняется по этой самой худщей цене, даже если есть бид гораздо лучше? Именно! Это и показано на скриншотах выше.

Смотрите, есть режим эмуляции без стакана вообще. Это когда нет генераторов и нет данных о стакане. В этом конкретном случае заявки помеченные как маркетные (НЕ лимитные!) исполняются по LastTrade плюс Slippage если заявка на покупку или LastTrade минус Slippage если на продажу.

Если есть какие-то стаканы, генерированные или записанные то и маркетные ордера и лимитированные филяться о встречные заявки и свойство Slippage фактически не используется А вот за это спасибо. Такие нюансы в справке не написаны.

UPD: Отвечаю сам на свой вопрос "рыночные" это BuyAtMarket и SellAtMarket. Но с реализацией данных методов я не совсем согласен(посмотрел рефлектором) Т.к. с помощь их не всегда можно войти по "рынку".

Thanks:

Mikhail Sukhov

Avatar
Date: 3/12/2012
Reply


Moadip: UPD: Отвечаю сам на свой вопрос "рыночные" это BuyAtMarket и SellAtMarket. Но с реализацией данных методов я не совсем согласен(посмотрел рефлектором) Т.к. с помощь их не всегда можно войти по "рынку".

На РТС нет маркетных заявок. Так что хоть как-то входить. Не по планкам же.

Thanks:

JackSparrow

Avatar
Date: 3/12/2012
Reply


Mikhail Sukhov:

Moadip: UPD: Отвечаю сам на свой вопрос "рыночные" это BuyAtMarket и SellAtMarket. Но с реализацией данных методов я не совсем согласен(посмотрел рефлектором) Т.к. с помощь их не всегда можно войти по "рынку".

На РТС нет маркетных заявок. Так что хоть как-то входить. Не по планкам же.

Так вопрос утыкается в то что если есть цена более лучшая чем указанная то сделка закрывается по ней. Это, на фортсе, будет принцип входа по маркету. Тоже самое что по краю стакана ударить.

Thanks:

Mikhail Sukhov

Avatar
Date: 3/13/2012
Reply


JackSparrow: Так вопрос утыкается в то что если есть цена более лучшая чем указанная то сделка закрывается по ней. Это, на фортсе, будет принцип входа по маркету. Тоже самое что по краю стакана ударить.

Сейчас речь о тестере? С тестером это не ко мне. Я ответил насчет того, почему XXXAtMarket так сделан.

Thanks:

Alexander

Avatar
Date: 3/13/2012
Reply


В итоге, вы утверждаете что теперь кидаете селл-заявку ниже рынка на 100 пунктов и она всегда исполняется по этой самой худщей цене, даже если есть бид гораздо лучше? Именно! Это и показано на скриншотах выше.

Фикс залит на codeplex. Возьмите свежие библиотеки из ветки dev и протестируйте. Только учитывайте то, что архив с котировками (RIU9@RTS) был также обновлён.

Thanks:
1 2 3  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy