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


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

Теги:


Спасибо:




7 Ответов
Serg

Фотография
Дата: 22.11.2010
Ответить


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

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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 22.11.2010
Ответить


Serg
Всем hi

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


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

Serg

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


http://stockmarketdotnet...om/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<MarketDepth>>(Trader_QuotesChanged);
Trader.RegisterQuotes(this.Security);
все работает как часы


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 22.11.2010
Ответить


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


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

Serg

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


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

Serg

Фотография
Дата: 22.11.2010
Ответить


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

Спасибо
Автор топика
Спасибо:

Serg

Фотография
Дата: 22.11.2010
Ответить


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 22.11.2010
Ответить


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

Serg

Фотография
Дата: 22.11.2010
Ответить


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


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy