← Voltar

Гидра тормозит когда в позиции

Странный глюк: при тестировании захожу в позицию и скорость теста резко снижается, выхожу из позиции - опять скорость нормальная

Este tópico foi útil?

Compartilhar tópico

Comentários (16)

Entrar ou Criar conta, Faça login ou cadastre-se para deixar um comentário

Alexander
Alexander

Как связаны гидра с тестированием? Можно подробнее про последовательность действий и про наблюдаемые тормоза гидры

FiNick
FiNick Autor

Да, вопрос именно по тестированию, я думал оно связанно с гидрой)

  1. Тестирую медленную стратегию, которая работает с 15мин свечками, о приходе каждой 15 мин свечки сообщение в лог. Захожу в позу и 15 мин свечки начинают приходить медленно, выхожу из позы опять быстро. Я не вижу, чтобы какая-то часть моего кода так тормозила, даже если просто отключить стратегию и по кнопке заходить/выходить тормоза есть.

  2. Тестирую оч быструю стратегию, которая на каждый тик должна реагировать, стратегия реализована как событийная. В методе OnProcess() выдаю лог с ценой/временем последней сделки (this.Security.LastTrade). Ожидал увидеть все тики, с вместо этого лог выдает трейды с разницей 1-2екунды. Это так должно быть? Как тестировать быстрые стратегии?

Mikhail Sukhov
Mikhail Sukhov

FiNick: Да, вопрос именно по тестированию, я думал оно связанно с гидрой)

  1. Тестирую медленную стратегию, которая работает с 15мин свечками, о приходе каждой 15 мин свечки сообщение в лог. Захожу в позу и 15 мин свечки начинают приходить медленно, выхожу из позы опять быстро. Я не вижу, чтобы какая-то часть моего кода так тормозила, даже если просто отключить стратегию и по кнопке заходить/выходить тормоза есть.

  2. Тестирую оч быструю стратегию, которая на каждый тик должна реагировать, стратегия реализована как событийная. В методе OnProcess() выдаю лог с ценой/временем последней сделки (this.Security.LastTrade). Ожидал увидеть все тики, с вместо этого лог выдает трейды с разницей 1-2екунды. Это так должно быть? Как тестировать быстрые стратегии?

  1. Тестирование замедляется при матчинге заявок. Что вполне нормально, так как загрузка данных быстрее, чем загрузка данных + исполнение заявок.
  2. TF модель лучше вообще забыть. Она реагирует не на каждый тик, а со своим дифференциалом.
FiNick
FiNick Autor

Mikhail Sukhov: 2. TF модель лучше вообще забыть. Она реагирует не на каждый тик, а со своим дифференциалом.

Я и не использую TF модель, у меня событийная, стоит правило SecurityNewTrades. Так всетаки, EmulationTrader выдает все тики точно также, как это делал бы PlazaTrader или QuikTrader? Или из-за вопроса быстродействия большая часть тиков пропускается?

Mikhail Sukhov
Mikhail Sukhov

FiNick: Я и не использую TF модель, у меня событийная, стоит правило SecurityNewTrades.

OnProcess - это что?

FiNick
FiNick Autor

Mikhail Sukhov: OnProcess - это что? OnProcess это обработчик события прихода новых трейдов. У меня в стратегии включено правило:

this
    .When(this.Security.SecurityNewTrades())
    .Do(OnProcess);

Т.е. OnProcess должно вызываться на каждый тик. Внутри OnProcess пишу в лог цену и время последней сделки. Время между сделками получается достаточно большим, значит либо OnProcess не успевает обрабатывать все тики, либо EmulationTrader присылает не все тики.

Mikhail Sukhov
Mikhail Sukhov

FiNick: Т.е. OnProcess должно вызываться на каждый тик. Внутри OnProcess пишу в лог цену и время последней сделки. Время между сделками получается достаточно большим, значит либо OnProcess не успевает обрабатывать все тики, либо EmulationTrader присылает не все тики.

EmulationTrader.NewTrades что пишет?

FiNick
FiNick Autor

Mikhail Sukhov: EmulationTrader.NewTrades что пишет?

Короче я понял, NewTrades при срабатывании выдает обьект типа IEnumerable<MyTrade>, т.е. пачку трейдов, если раскрыть эту пачку трейдов то какраз получатся все тики(сравнивал с тем что гидра из квика накачала). По какому принципу тики упакованы в пачки не понятно, не по времени, и не по цене, как я вижу. Далее, OnProcess похоже вызывается ровно столько же раз сколько и NewTrades, причем если взять strategy.Security.LastTrade то мы какраз получим последний трейд последней пачки. Т.е. правило SecurityNewTrades срабатывает не на каждый тик, а по приходу последней пачки тиков, и вот интересно, оно внутрь пачки заглядывает, чтобы понять менялась ли цена, или только на последний трейд пачки смотрит.

Mikhail Sukhov
Mikhail Sukhov

S# какой версии?

FiNick
FiNick Autor

Mikhail Sukhov: S# какой версии?

StockSharp.Algo(и другие) версия 4.0.14.0 Данные качал гидрой с квика.

Mikhail Sukhov
Mikhail Sukhov

FiNick:

Mikhail Sukhov: S# какой версии?

StockSharp.Algo(и другие) версия 4.0.14.0 Данные качал гидрой с квика.

Не подтверждается. Можете это зарепродюсить на примере SampleHistoryTesting?

hobo
hobo

Mikhail Sukhov: Не подтверждается. Можете это зарепродюсить на примере SampleHistoryTesting? Наблюдаю тот же эффект: в стратегии сделки из EmulationTrader приходят частями. На картинке: что пришло в EmulationTrader, затем в стратегии видна лишь последняя сделка из пачки

На примере SampleHistoryTesting "зарепродюсил" на 4.0.19 (на 4.0.1 и релизном 4.0.14 тоже самое)


Стратегию изменил так:

namespace SampleHistoryTesting
{
	using System;

	using StockSharp.Algo;
	using StockSharp.Algo.Candles;
	using StockSharp.Algo.Indicators;
	using StockSharp.Algo.Indicators.Trend;
	using StockSharp.Algo.Strategies;
	using StockSharp.BusinessEntities;

	class SmaStrategy : Strategy
	{
		private readonly CandleManager _candleManager;
		private bool _isShortLessThenLong;

		private DateTime _nextTime;

		public SmaStrategy(CandleManager candleManager, SimpleMovingAverage longSma, SimpleMovingAverage shortSma, TimeSpan timeFrame)
			
		{
			_candleManager = candleManager;
			LongSma = longSma;
			ShortSma = shortSma;
		}

		public SimpleMovingAverage LongSma { get; private set; }
		public SimpleMovingAverage ShortSma { get; private set; }

		protected override void OnStarting()
		{
            this
                .When(this.Security.SecurityNewTrades())
                .Do(OnProcess);

			base.OnStarting();
		}

        void OnProcess()
        {
            var l = Security.LastTrade;
        }

	}
}

В MainWindow

1) Изменил security

			var security = new Security
			{
				Id = "RIH2@RTS", // по идентификатору инструмента будет искаться папка с историческими маркет данными
				Code = "RIH2",
				Name = "RTS-3.12",
				MinStepSize = 5,
				MinStepPrice = 2,
				Exchange = Exchange.Test,
			};

2) Изменил время тестирования на 1 февраля

			// в реальности период может быть другим, и это зависит от объема данных,
			// хранящихся по пути HistoryPath, 
			var startTime = new DateTime(2012, 2, 1);
			var stopTime = new DateTime(2012, 2, 2);

3) Подписался на новые сделки вот в этом месте

			_trader.StateChanged += () =>
			{

			};

            _trader.NewTrades += (tr) =>
                {

                };

			// устанавливаем в визуальный элемент ProgressBar максимальное количество итераций)
			TestingProcess.Maximum = (stopTime - startTime).Ticks;



Mikhail Sukhov
Mikhail Sukhov

hobo:

Mikhail Sukhov: Не подтверждается. Можете это зарепродюсить на примере SampleHistoryTesting? Наблюдаю тот же эффект: в стратегии сделки из EmulationTrader приходят частями. На картинке: что пришло в EmulationTrader, затем в стратегии видна лишь последняя сделка из пачки

Перед анализом еще раз уточню - в пачках сделки от разного времени?

hobo
hobo

Хм, время одинаковое. Вот первые 4 пачки.```plain 497896647 10:00:00.070 497896648 10:00:00.070 497896649 10:00:00.070 497896650 10:00:00.070 497896651 10:00:00.070 497896652 10:00:00.070

497896660 10:00:01.513 497896661 10:00:01.513 497896662 10:00:01.513 497896663 10:00:01.513 497896664 10:00:01.513 497896665 10:00:01.513

497896684 10:00:01.607

497896685 10:00:01.643

Раз вы про время спросили, видимо все работает правильно🤔 
Mikhail Sukhov
Mikhail Sukhov

hobo: Раз вы про время спросили, видимо все работает правильно🤔

Видимо. И видимо, раз предыдущей рапортер так же не развивал тему, то и у него все заработало правильно.

FiNick
FiNick Autor

Хорошо, как время будет, сделаю.