← Zurück

Остановка стратегии

Всем hi

Не могу остановить вот такую стратегию:


    class aaa :Strategy
    {
        public aaa()
            : base()
        {
        }

        protected override StrategyProcessResults OnProcess()
        {
            if (base.ProcessState == StrategyProcessStates.Stopping)
                return StrategyProcessResults.Stop;
            
            if (this.TotalWorkingTime.Seconds > 10)
                this.Stop();
            AddLog(StrategyErrorStates.None, "OnProcess", this);
            return StrategyProcessResults.Continue;
        }

        protected override void OnRunned()
        {
            AddLog(StrategyErrorStates.None, "OnRunned", this);
            base.OnRunned();
        }

        protected override void OnRunning()
        {
            AddLog(StrategyErrorStates.None, "OnRunning", this);
            base.OnRunning();
        }

        protected override void OnStopped()
        {
            AddLog(StrategyErrorStates.None, "OnStopped", this);
            base.OnStopped();
        }

        protected override void OnStopping()
        {
            AddLog(StrategyErrorStates.None, "OnStopping", this);
            base.OnStopping();
        }
    }

Подскажите плиз почему такая стратегия не останавливается? Как можно сделать так чтобы стратегия сама себя остановила? Остановка происходит толька после вызова Stop() извне.

Попутный вопрос: Не вижу в Ecng.Trading.Algo класс FileStrategyLogger. Что-то изменилось?

Версия S# 2.5.2

Спасибо.

+++

Проблема как выяснилось тут в другом. OnProcess вообще не выполняется. Вот так происходит регистрация и запуск стратегии: var st = new aaa(); st.Interval = TimeSpan.FromSeconds(0.1); man.Register(st, p, m1); st.Start();

Но если добавить в OnRunned две строки вида: Trader.QuotesChanged += new Action<IEnumerable<MarketDepth>>(Trader_QuotesChanged); Trader.RegisterQuotes(this.Security); все работает как часы

War dieses Thema hilfreich?

Thema teilen

Kommentare (7)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Serg
Serg Autor

Продолжаю тему)) По приведенному выше классу. Полная остановка стратегии не происходит( В логе вижу OnStopping но не вижу OnStopped. И также не вижу сообщения о том что стратегия остановилась. как это было ранее. Ктонить может подсказать это моя бага или S#? Спасибо.

Михаилу по поводу проекта: Как я понимаю чем дальше тем сложнее поддерживать библиотеку, да и возможно вам это просто надоело уже. Но... не надо отчаиваться) Нас тут Уже много и я думаю многие могли и хотели бы помочь. Ждем ваших, Михаил, предложений... Возможно было бы не плохо сделать что-то типа wiki с элементарными примерами использования S# и возможностью пользователей дополнять ее примерами. Вот к примеру класс описанный мной выше... что в нем не так? Благодаря вышей библиотеке написал одного робота на версии 2.4 работает прекрасно но писал его под winforms и многим возможностями не пользовался. Сейчас хочу углубиться, сделать все на wpf чтобы воспользоваться всяческими мониторами стратегий и тд и тп но не могу получить желанный результат. Написав уже практически всю реализацию стратегии возвращаюсь в начало к таким вот элементарным примерам(возможно по глупости своей). Не разобравшись с основами нельзя сделать стабильно работающую систему(( Еще раз спасибо.

Mikhail Sukhov
Mikhail Sukhov

Serg: Продолжаю тему)) По приведенному выше классу. Полная остановка стратегии не происходит( В логе вижу OnStopping но не вижу OnStopped. И также не вижу сообщения о том что стратегия остановилась. как это было ранее. Ктонить может подсказать это моя бага или S#? Спасибо.

Попробуйте бряку поставить в OnStopped.

Serg: Михаилу по поводу проекта: Как я понимаю чем дальше тем сложнее поддерживать библиотеку, да и возможно вам это просто надоело уже. Но... не надо отчаиваться) Нас тут Уже много и я думаю многие могли и хотели бы помочь. Ждем ваших, Михаил, предложений... Возможно было бы не плохо сделать что-то типа wiki с элементарными примерами использования S# и возможностью пользователей дополнять ее примерами. Вот к примеру класс описанный мной выше... что в нем не так? Благодаря вышей библиотеке написал одного робота на версии 2.4 работает прекрасно но писал его под winforms и многим возможностями не пользовался. Сейчас хочу углубиться, сделать все на wpf чтобы воспользоваться всяческими мониторами стратегий и тд и тп но не могу получить желанный результат. Написав уже практически всю реализацию стратегии возвращаюсь в начало к таким вот элементарным примерам(возможно по глупости своей). Не разобравшись с основами нельзя сделать стабильно работающую систему(( Еще раз спасибо.

Стоило мне отдохнуть раз в выходные, как проект сразу надоел.😀 Реальная помощь проекты на данный момент (до чего действительно сейчас руки редко доходят и в дальнейшем будет все сложнее) - это ответы на вопросы - что и как. Есть конечно и S# ошибки, но есть и те, на которые по силам ответить многим. Но как-то не все рвутся отвечать другим, чего не сказать наоборот, о вопросах.😒

Serg
Serg Autor

Mikhail Sukhov: Но как-то не все рвутся отвечать другим, чего не сказать наоборот, о вопросах.

Да тоже заметил. Сложно отвечать когда сам еще не разобрался до конца и задаешь глупые вопросы)

Mikhail Sukhov: Что-то явно в коде робота. Потому что одно на другое очень слабо влияет... Попробуйте код упростить. Подозреваю, что там много больше, чем Вы привели в топике.

Это весь код стратегии. Я просто решил потестить все ли переопределения выполняються

    class ABC : Strategy
    {
        public ABC()
            : base()
        {
        }

        protected override StrategyProcessResults OnProcess()
        {
            if (base.ProcessState == StrategyProcessStates.Stopping)
                return StrategyProcessResults.Stop;

            if (this.TotalWorkingTime.Seconds > 10)
            {
                this.Stop();
                AddLog(StrategyErrorStates.Warning, "send stop", this);
            }

            AddLog(StrategyErrorStates.None, "OnProcess", this);
            return StrategyProcessResults.Continue;
        }

        protected override void OnRunned()
        {
            AddLog(StrategyErrorStates.None, "OnRunned", this);
            base.OnRunned();
        }

        protected override void OnRunning()
        {
            AddLog(StrategyErrorStates.None, "OnRunning", this);
            base.OnRunning();
        }

        protected override void OnStopped()
        {
            AddLog(StrategyErrorStates.None, "OnStopped", this);
            base.OnStopped();
        }

        protected override void OnStopping()
        {
            AddLog(StrategyErrorStates.None, "OnStopping", this);
            base.OnStopping();
        }
    }

Стратегия только одна, без дочерних.

Код регистрации и запуска стратегии из главного окна

private void button5_Click(object sender, RoutedEventArgs e)
		{
			Security m1 = sList.FirstOrDefault(s => s.Code == "LKOH");
			Portfolio p = pList.FirstOrDefault(i => i.Name == "NL0011100043");
			var st = new ABC();
            gsl.Strategies.Add(st);
            st.Interval = TimeSpan.FromSeconds(0.1);
			man.Register(st, p, m1);
			st.Start();
		}

это весь код не включая получения инструментов, портфелей и подключения к квику. В такой реализации OnProcess у меня ни разу не выполняется.

Во так я останавливаю ее:

private void button6_Click(object sender, RoutedEventArgs e)
		{
			foreach (var item in man.Strategies)
			{
				if (item.Name == "ABC" || item.Name == "")
					item.Stop();
			}
		}

а вот весь лог GuiStrategyLogger'a:

ABC 16:35:28 OnRunning ABC 16:35:29 Стратегия запущена ABC 16:35:29 OnRunned ABC 16:35:35 Стратегия останавливается. ABC 16:35:35 OnStopping

Вроде бы все просто. Стратегия должна выполнять OnProcess раз в 100мс, в логгере я должен увидеть приблизительно 100 сообщений OnProcess и в течении 10 сек стратегия должна сама себя остановить. Будьте так добры)) все кому не лень попробуйте создать такой пример и отписаться по результатам. Все кому лень чуть позже выложу ссылку на солюшн)

Спасибо

Mikhail Sukhov
Mikhail Sukhov

Serg: Вроде бы все просто. Стратегия должна выполнять OnProcess раз в 100мс, в логгере я должен увидеть приблизительно 100 сообщений OnProcess и в течении 10 сек стратегия должна сама себя остановить. Спасибо

Скопировал код в тесты. Сделал вот такой логгер:

private sealed class TestStrategy : Strategy
{
	private readonly bool _isAutoStop;

	public TestStrategy(bool isAutoStop)
	{
		_isAutoStop = isAutoStop;
	}

	protected override StrategyProcessResults OnProcess()
	{
		if (base.ProcessState == StrategyProcessStates.Stopping)
			return StrategyProcessResults.Stop;

		if (this.TotalWorkingTime.Seconds > 10)
		{
			if (_isAutoStop)
				return StrategyProcessResults.Stop;
			else
				this.Stop();

			AddLog(StrategyErrorStates.Warning, "send stop", this);
		}

		AddLog(StrategyErrorStates.None, "OnProcess", this);
		return StrategyProcessResults.Continue;
	}

	protected override void OnRunned()
	{
		AddLog(StrategyErrorStates.None, "OnRunned", this);
		base.OnRunned();
	}

	protected override void OnRunning()
	{
		AddLog(StrategyErrorStates.None, "OnRunning", this);
		base.OnRunning();
	}

	protected override void OnStopped()
	{
		AddLog(StrategyErrorStates.None, "OnStopped", this);
		base.OnStopped();
	}

	protected override void OnStopping()
	{
		AddLog(StrategyErrorStates.None, "OnStopping", this);
		base.OnStopping();
	}
}

private sealed class StringStategyLogger : StrategyLogger
{
	private readonly StringBuilder _builder = new StringBuilder();

	public string String
	{
		get { return _builder.ToString(); }
	}

	public override void WriteMessage(Strategy strategy, StrategyErrorStates state, string message)
	{
		_builder.Append(message);
	}
}

[TestMethod]
public void ManualStartStop()
{
	StartStop(false);
}

[TestMethod]
public void AutoStartStop()
{
	StartStop(true);
}

private static void StartStop(bool isAuto)
{
	var st = new TestStrategy(isAuto);
	var logger = new StringStategyLogger();
	logger.Strategies.Add(st);
	var manager = new StrategyManager(Helper.CreateTestTrader());
	st.Interval = TimeSpan.FromSeconds(0.1);
	manager.Register(st, Helper.CreatePortfolio(), Helper.CreateSecurity());
	st.Start();
	Thread.Sleep(TimeSpan.FromSeconds(20));
	var str = logger.String;
	Assert.IsTrue(str.Contains("OnRunned"));
	Assert.IsTrue(str.Contains("OnRunning"));
	Assert.IsTrue(str.Contains("OnStopped"));
	Assert.IsTrue(str.Contains("OnStopping"));
	Assert.IsTrue(str.Contains("OnProcess"));
}

Все отработало как часики.

Нашел особенность с StrategyManager. Его нужно создавать до подключения ITrader. В след. версии это исправлю и можно будет создавать когда угодно.

Mikhail Sukhov
Mikhail Sukhov

Serg: Всем hi

Подскажите плиз почему такая стратегия не останавливается? Как можно сделать так чтобы стратегия сама себя остановила? Остановка происходит толька после вызова Stop() извне.

Что из вне, что снаружи - вызывается одно и тоже... Стратегия дочерняя? Имеет ли сама дочерние стратегии? Точку останова ставили внутрь OnProcess? Плюс, еще приведите как Вы снаружи останавливаете?

Serg: Попутный вопрос: Не вижу в Ecng.Trading.Algo класс FileStrategyLogger. Что-то изменилось?

http://stockmarketdotnet.blogspot.com/2010/10/stock-25.html Алгоритмы Пункт 1.

Serg: Проблема как выяснилось тут в другом. OnProcess вообще не выполняется. Вот так происходит регистрация и запуск стратегии: var st = new aaa(); st.Interval = TimeSpan.FromSeconds(0.1); man.Register(st, p, m1); st.Start();

Но если добавить в OnRunned две строки вида: Trader.QuotesChanged += new Action<IEnumerable>(Trader_QuotesChanged); Trader.RegisterQuotes(this.Security); все работает как часы

Что-то явно в коде робота. Потому что одно на другое очень слабо влияет... Попробуйте код упростить. Подозреваю, что там много больше, чем Вы привели в топике.

Serg
Serg Autor

Да и спасибо за > Mikhail Sukhov:

http://stockmarketdotnet...m/2010/10/stock-25.html Алгоритмы Пункт 1. не сразу дошло))

Serg
Serg Autor

Превеликое спасибо))) Вот я и получил свою порцию знаний)