Мертвая стратегия
Atom Ответить
29.11.2011


Собственно первый раз дошли руки до создания стратегии, до этого копался с базовыми элементами S#. В результате, следуя примеру, написал своего рода тестер(работает или нет), который открывает заявку, если цена меньше определенного числа, никаких ошибок VS не выдает, сделки регистрируются, но стратегия не подает никаких признаков жизни(даже при нажатии Start в логгере не пишется про запуск). До последнего не хотел обращаться к форуму, чтобы не загружать его банальными темами, но все же в итоге выкладываю все, что есть в проекте, так как решения вопроса так и не нашел.

MainWindow:
Код


namespace MyStock
{
    public partial class MainWindow
    {
        private readonly Dictionary<CandleToken, MainWindow> chart = new Dictionary<CandleToken, MainWindow>();
        public AlfaTrader Trader;
        public bool _isConnected;
        public Portfolio _portfolio;
        public CandleManager _candleManager;
        private readonly ObservableCollection<Security> _securitiesSource = new ObservableCollection<Security>();
        private readonly LogManager _logManager = new LogManager();
        //private DateTime _lastCandleTime;
        public readonly TimeSpan timeFrame = (TimeSpan)(AlfaTimeFrames.Minute1);
        public IndStrategy _strategy;
        private Security security;
        private Security security_2;

        public Ind _ind { get; private set; }

        public MainWindow()
            
        {
            InitializeComponent();

            Security.ItemsSource = _securitiesSource;

            Security_2.ItemsSource = _securitiesSource;

            var From = DateTime.Today - TimeSpan.FromDays(1);
            var To = DateTime.Now;

            _logManager.Listeners.Add(new FileLogListener());

            var security = (Security)SelectedSecurity;

        }

        public void button1_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (!_isConnected)
                {

                    if (Trader == null)
                    {
                        var monitor = new MonitorWindow();
                        monitor.Show();

                        Trader = new AlfaTrader
                        {
                            Login = textBox1.Text,
                            Password = passwordBox1.Password
                        };

                        Trader.NewSecurities += securities => this.Dispatcher.BeginInvoke((Action)(() => _securitiesSource.AddRange(securities)));
                        
                        Trader.NewPortfolios += portfolios => this.Dispatcher.BeginInvoke((Action)(() => portfolios.ForEach(Trader.RegisterPortfolio)));

                        Trader.NewSecurities += securities => this.Dispatcher.BeginInvoke((Action)(()  => securities.ForEach(Trader.RegisterTrades)));

                        _logManager.Listeners.Add(new GuiLogListener(monitor));

                        _logManager.Sources.Add(Trader);
                        _logManager.Sources.Add(_strategy);


                    }

                    Trader.Connect();
                    Trader.StartExport();


                    _candleManager = new CandleManager(Trader);



                }
            }
            catch (Exception)
            {
                //System.Windows.MessageBox.Show(this, ex.Message, "Error");
                //return;
            }
        }

        protected override void OnClosing(CancelEventArgs e)
        {

            base.OnClosing(e);
        }

        private void button2_Click(object sender, RoutedEventArgs e)
        {
         Trader.Disconnect();
        }


        private void textBox1_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
        {

        }

        private void passwordBox1_PasswordChanged(object sender, RoutedEventArgs e)
        {

        }


        public Security SelectedSecurity
        {
            get { return (Security)Security.SelectedValue; }
        }

        public Security SelectedSecurity_2
        {
            get { return (Security)Security_2.SelectedValue; }
        }


        public void SecuritySelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            
        }

        public void Security_2_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            
        }


        private void button3_Click(object sender, RoutedEventArgs e)
        {
            if (_strategy == null)
            {
                var ind = new Ind();

                security = (Security)SelectedSecurity;

                // создаем торговую стратегию
                _strategy = new IndStrategy(_candleManager, ind, timeFrame)
                {
                    Volume = 1,
                    Security = (Security)SelectedSecurity,
                    Trader = Trader,
                    TimeFrame = timeFrame,
                };

                // начинаем получать текущие сделки (для построения свечек реального времени)
                Trader.RegisterTrades(security);

                //Trader.GetHistoryData(security, timeFrame,
                //                     new Range<DateTime>(DateTime.Today - TimeSpan.FromDays(5), Trader.MarketTime));

                _lastHistoryCandle = timeFrame.GetCandleBounds(Trader).Min;

                // регистрируем наш тайм-фрейм
                _candleManager.RegisterTimeFrameCandles(security, timeFrame);
            }

            if (_strategy.ProcessState == ProcessStates.Stopped)
            {
                // запускаем процесс получения стакана, необходимый для работы алгоритма котирования
                Trader.RegisterQuotes(_strategy.Security);
                _strategy.Start();
            }
            else
            {
                Trader.UnRegisterQuotes(_strategy.Security);
                _strategy.Stop();
            }
        }
    }


}


"Индикатор"Huh
Код
using System;

namespace MyStock
{
    public class Ind : BaseIndicator<decimal>

    {
        public Ind()
            : base(typeof(TimeFrameCandle))
        {

        }

        public override bool IsFormed
        {
            get { return true; }
        }

        public override decimal OnProcess(IIndicatorValue input)
        {
            return input.GetValue<TimeFrameCandle>().ClosePrice;
        }
    }
}


Стратегия:
Код
namespace MyStock
{
    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;
    using StockSharp.AlfaDirect;

    public class IndStrategy : TimeFrameStrategy
    {
        public readonly CandleManager _candleManager;
        public bool _isSmaller;

        private DateTime _nextTime;

        public IndStrategy(CandleManager candleManager, Ind Ind1, TimeSpan timeFrame)
            : base(timeFrame)
        {
            _candleManager = candleManager;

            this.ind = Ind1;
        }

        public Ind ind { get; private set; }

        protected override void OnStarting()
        {
            _isSmaller = this.ind.LastValue < 200;

            _nextTime = base.TimeFrame.GetCandleBounds(base.Trader).Max;

            base.OnStarting();
        }

        protected override ProcessResults OnProcess()
        {
            if (base.ProcessState == ProcessStates.Stopping)
            {
                base.CancelActiveOrders();

                return ProcessResults.Stop;
            }

            if (base.Trader.MarketTime < _nextTime)
            {
                return ProcessResults.Continue;
            }
            var candle = _candleManager.GetTimeFrameCandle(base.Security, base.TimeFrame, _nextTime - base.TimeFrame);

            if (candle == null)
            {
                if ((base.Trader.MarketTime - _nextTime) > TimeSpan.FromSeconds(10))
                    _nextTime = base.TimeFrame.GetCandleBounds(base.Trader.MarketTime).Max;

                return ProcessResults.Continue;
            }

            _nextTime += base.TimeFrame;

            this.ind.Process((DecimalIndicatorValue)candle.ClosePrice);

            var isSmaller = this.ind.LastValue < 200;

            if (isSmaller == true)
            {
                var direction = isSmaller ? OrderDirections.Sell : OrderDirections.Buy;

                var order = this.CreateOrder(direction, base.Security.GetMarketPrice(direction), 1);

                var strategy = new MarketQuotingStrategy(order, new Unit(), new Unit());
                base.ChildStrategies.Add(strategy);

                _isSmaller = isSmaller;
            }

            return ProcessResults.Continue;
        }
    }
}


Очень надеюсь на хелп, а то стопорится все что можно




Теги:


Спасибо:




10 Ответов
Alexander

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


А в коде хоть где-то разве выводится что-то в лог?
Спасибо: OvcharenkoVI

OvcharenkoVI

Фотография
Автор статей
Дата: 29.11.2011
Ответить


Ну это я удалил ради уменьшения объема поста, а то на три страницы воды получается
Автор топика
Спасибо:

Alexander

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


OvcharenkoVI Перейти
Ну это я удалил ради уменьшения объема поста, а то на три страницы воды получается


нет лога в текста что написали => нет лога в распечатке.

если он у вас есть, а в итоге нет - значит что-то не так сделали с логированием, читайте внимательнее документацию как надо правильно делать логирование стратегий и их вывод куда бы то ни было.
Спасибо: OvcharenkoVI

Sergey Masyura

Фотография
Автор статей
Дата: 29.11.2011
Ответить


OvcharenkoVI Перейти
Собственно первый раз дошли руки до создания стратегии, до этого копался с базовыми элементами S#. В результате, следуя примеру, написал своего рода тестер(работает или нет), который открывает заявку, если цена меньше определенного числа, никаких ошибок VS не выдает, сделки регистрируются, но стратегия не подает никаких признаков жизни(даже при нажатии Start в логгере не пишется про запуск). До последнего не хотел обращаться к форуму, чтобы не загружать его банальными темами, но все же в итоге выкладываю все, что есть в проекте, так как решения вопроса так и не нашел.

MainWindow:
Код




Очень надеюсь на хелп, а то стопорится все что можно




Выложите архив с проектом, так будет на порядок проще.

Из замечаний, если ловите catch (Exception), то либо ставьте свой обработчик хотя бы с логированием, либо бросайте его дальше.
Спасибо: OvcharenkoVI

Sergey Masyura

Фотография
Автор статей
Дата: 29.11.2011
Ответить


OvcharenkoVI Перейти
Ну это я удалил ради уменьшения объема поста, а то на три страницы воды получается


Посмотрите еще на эту строчку

Код

if (base.Trader.MarketTime < _nextTime)


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

второе, удобнее и понятнее использовать событийную модель, а не OnProcess - это давно уже устарело.
Спасибо: OvcharenkoVI

OvcharenkoVI

Фотография
Автор статей
Дата: 29.11.2011
Ответить


http://dump.ru/file/5486583 - залил архив с проектом

Сдвига с МСК нет) Единственное, время на компе живет своей жизнью, так как никогда на него не смотрю)
Автор топика
Спасибо:

OvcharenkoVI

Фотография
Автор статей
Дата: 29.11.2011
Ответить


Переделал под событейную модель... выглядит примерно так...

Код
namespace MyStock
{
    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;
    using StockSharp.AlfaDirect;

    public class IndStrategy : Strategy
    {
        public readonly CandleManager _candleManager;
        public bool _isSmaller;
        public TimeSpan TimeFrame = (TimeSpan)AlfaTimeFrames.Minute1;
        public Ind Ind1;

        private DateTime _nextTime;

        public IndStrategy()
        {
            this.ind = Ind1;
        }

        public Ind ind { get; private set; }

        protected override void OnStarting()
        {

            this
                .When(base.Security.Changed())
                .Do(Calculate);

            base.OnStarting();
        }

        public void Calculate()
        {

            var candle = _candleManager.GetTimeFrameCandle(base.Security, TimeFrame, _nextTime);

            if (candle == null)
            {
                if ((base.Trader.MarketTime - _nextTime) > TimeSpan.FromSeconds(10))
                    _nextTime = TimeFrame.GetCandleBounds(base.Trader.MarketTime).Max;
            }

            _nextTime += TimeFrame;

            this.ind.Process((DecimalIndicatorValue)candle.ClosePrice);

            var isSmaller = this.ind.LastValue < 200;

            if (isSmaller == true)
            {
                var direction = isSmaller ? OrderDirections.Sell : OrderDirections.Buy;

                var order = this.CreateOrder(direction, base.Security.GetMarketPrice(direction), 1);

                var strategy = new MarketQuotingStrategy(order, new Unit(), new Unit());
                base.ChildStrategies.Add(strategy);

                _isSmaller = isSmaller;
            }
        }
    }
}
Автор топика
Спасибо:

Sergey Masyura

Фотография
Автор статей
Дата: 29.11.2011
Ответить


OvcharenkoVI Перейти
https://dump.ru/file/5486583 - залил архив с проектом

Сдвига с МСК нет) Единственное, время на компе живет своей жизнью, так как никогда на него не смотрю)


В момент подключения выбрасывается null reference exception в _logManager.Sources.Add(_strategy); , потому что _strategy = null.

Соответсвенно часть кода не вызывается,

Trader.Connect();
Trader.StartExport();
_candleManager = new CandleManager(Trader);

так как сразу происходит переход в обработчик исключения.

Если хотите получать помощь с нашей стороны на форуме, либо скайп - для этого есть https://stocksharp.ru/fo...ierzhka-pol-zovatieliei/ .

Успехов.
Спасибо: OvcharenkoVI

OvcharenkoVI

Фотография
Автор статей
Дата: 29.11.2011
Ответить


Сергей, подправил, спасибо за помощь
Автор топика
Спасибо:

Sergey Masyura

Фотография
Автор статей
Дата: 29.11.2011
Ответить


OvcharenkoVI Перейти
Сергей, подправил, спасибо за помощь


Пожалуйста ThumpUp
Спасибо: OvcharenkoVI


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

loading
clippy