Мертвая стратегия


Мертвая стратегия
Atom
11/29/2011


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

MainWindow:
Code


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]
Code
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;
        }
    }
}


Стратегия:
Code
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;
        }
    }
}


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




Tags:


Thanks:


Alexander

Avatar
Date: 11/29/2011
Reply


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

OvcharenkoVI

Avatar
Date: 11/29/2011
Reply


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

Alexander

Avatar
Date: 11/29/2011
Reply


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


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

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

Sergey Masyura

Avatar
Date: 11/29/2011
Reply


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

MainWindow:
Code




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




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

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

Sergey Masyura

Avatar
Date: 11/29/2011
Reply


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


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

Code

if (base.Trader.MarketTime < _nextTime)


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

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

OvcharenkoVI

Avatar
Date: 11/29/2011
Reply


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

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

OvcharenkoVI

Avatar
Date: 11/29/2011
Reply


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

Code
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;
            }
        }
    }
}
Thanks:

Sergey Masyura

Avatar
Date: 11/29/2011
Reply


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

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


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

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

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

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

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

Успехов.
Thanks: OvcharenkoVI

OvcharenkoVI

Avatar
Date: 11/30/2011
Reply


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

Sergey Masyura

Avatar
Date: 11/30/2011
Reply


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


Пожалуйста [thumbup]
Thanks: OvcharenkoVI


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

loading
clippy