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

Остановка стратегии
Atom
11/20/2010
Serg


Всем 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>(Trader_QuotesChanged); Trader.RegisterQuotes(this.Security); все работает как часы


Tags:


Thanks:


Serg

Avatar
Date: 11/22/2010
Reply


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

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

Thanks:

Mikhail Sukhov

Avatar
Date: 11/22/2010
Reply


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); все работает как часы

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

Thanks:

Mikhail Sukhov

Avatar
Date: 11/22/2010
Reply


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

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

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

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

Thanks:

Serg

Avatar
Date: 11/22/2010
Reply


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 сек стратегия должна сама себя остановить. Будьте так добры)) все кому не лень попробуйте создать такой пример и отписаться по результатам. Все кому лень чуть позже выложу ссылку на солюшн)

Спасибо

Thanks:

Serg

Avatar
Date: 11/22/2010
Reply


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

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

Thanks:

Mikhail Sukhov

Avatar
Date: 11/22/2010
Reply


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. В след. версии это исправлю и можно будет создавать когда угодно.

Thanks:

Serg

Avatar
Date: 11/22/2010
Reply


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

Thanks:


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

loading
clippy