Не работает order.IsMatched()
Atom
15.01.2013
RoboKrolik


Написал каркас для торговой системы по итерационной модели: есть базовый класс и класс стратегии.

Создаю заявку на покупку в классе стратегии регистрирую ее - все хорошо.

Но после этого хочу проверить ордер с помощью order.IsMatched() - пишет false постоянно даже когда стратегия исполняет ордера.

пробовал ```csharp this._order.IsMatched() и просто _order.IsMatched() и this.Trader.GetPosition(Portfolio,Security,).CurrentValue ) и просто Trader.GetPosition(Portfolio,Security,).CurrentValue )


Конструктор стратегии с класса стратегии:
```csharp
    
        public DartWeiderStretegy(CandleManager candleManager, TimeSpan timeFrame, CandleSeries series) : base(timeFrame)
        {
            _candleManager = candleManager;

            _timeFrame = TimeFrame;

            _series = series;

        }

Запуск стратегии с основного класса:

                _series = new CandleSeries(typeof(TimeFrameCandle), _security, _timeFrame); // создаем поток свечей и указываем что тип TimeFrameCandle

                _candleManager.Start(_series, _starttime, _endtime);  // запускаем CandleManager
                
                System.Threading.Thread.Sleep(20000); // делаем паузу на 20 сек. перед тем как запустить стратегию - чтобы серия заполнилась свечками               

                _strategy = new DartWeiderStretegy(_candleManager, _timeFrame, _series) // создаем стратегию
                {
                    Volume = _sharecount, // количество контрактов которое мы указали
                    Security = _security,
                    Portfolio = _portfolio,
                    Trader = _trader,
                    Interval = _timeRefreshStrategy // интервал который мы указали
                };

Теги:


Спасибо:


Alexander

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


В какой момент проверяете?

IsMatched проверяет просто что order.State == OrderStates.Done и order.Balance == 0. Првоерьте свои поля у order в момент проверки IsMatched

Спасибо:

RoboKrolik

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


Alexander Mukhanchikov: В какой момент проверяете?

Проверяю после того как с класса стратегии создал заявку и зарегистрировал ее:


_order = this.CreateOrder(OrderDirections.Buy, _series.GetCandle<TimeFrameCandle>(1).ClosePrice, base.Volume);
base.RegisterOrder(_order);

Alexander Mukhanchikov: Првоерьте свои поля у order в момент проверки IsMatched

В момент проверки мой Order.States равен NONE - заявка не отправлена в систему. А Order.Balance показывает первоначальное количество контрактов в сделке и не меняется в процессе регистрации и выполнения сделки вообще никак.

Может быть такое что я не могу получить в класс со стратегией данные о том зарегистрирован ли ордер или нет? У меня ощущение что ордер просто улетает в основной класс где регистрируется а инфу об этом класс со стратегией получить не может.

Может подписаться нужно на какое-то событие?

Спасибо:

Alexander

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


Ну всё правильно.

Вы отправили ордер, а он-то не дошёл ещё, биржа ответ не прислала. Смотрите события NewOrders \ OrdersChanged \ ... Смотря что конкретно вам надо.

Спасибо: RoboKrolik

RoboKrolik

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


Ну просто ничего не могу понять! Я тупой!

Alexander Mukhanchikov: Вы отправили ордер, а он-то не дошел ещё, биржа ответ не прислала.

Я проверяю заявку уже после того как она в квике зарегистрирована и исполнена...

В основном классе подписываюсь на события появления новых сделок ордеров итд..


                _trader.NewMyTrades += MyNewTrades; //подписываемся на событие получения новых сделок
                _trader.NewOrders += MyNewOrders; //подписываемся на событие получения новых заявок
                _trader.NewStopOrders += MyNewStopOrders; //подписываемся на событие получения новых стоп-заявок
                _trader.OrdersChanged += MyOrdersChanged; // подписываеся на событие изменения ордеров

Потом описываю методы вот так:


        public void MyNewTrades(IEnumerable<MyTrade> trades)
        {
            if (_strategy != null)
            {
                // найти те сделки, которые совершила стратегия
                //trades = trades.Where(t => _strategy.Orders.Any(o => o == t.Order));

                MessageBox.Show("hello");

            }
        }

        private void MyNewOrders(IEnumerable<Order> orders)
        {
            
        }

        private void MyNewStopOrders(IEnumerable<Order> orders)
        {
        }

        private void MyOrdersChanged(IEnumerable<Order> orders)
        {

        }

И никакое сообщение Хеллоу не выскакиеват. Я не вижу когда происходят сделки??? Я подписываюсь не в том классе???

Решил попробовать подписаться на событие появления новых сделок прямо в классе стратегии:


        // конструктор для работы стратегии
        public DartWeiderStretegy(CandleManager candleManager, TimeSpan timeFrame, CandleSeries series) : base(timeFrame)
        {
            _candleManager = candleManager;

            _timeFrame = TimeFrame;

            _series = series;

            base.NewMyTrades += OnNewMyTrades;

        }

        private void OnNewMyTrades(IEnumerable<MyTrade> trades)
        {
            MessageBox.Show("hello");
        }

Та же беда...

Прошу подсказать куда копать? Что читать?

Хочу получить отчет о состоянии оредера)))

Спасибо:

Alexander

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


Смотрите Sample, там по событию NewMyTrades что-то происходит со сделками. Он у вас корректно работает?

Спасибо: RoboKrolik

RoboKrolik

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


Посмотрел тот пример - не понимаю как он мне подходит.

Дам весь код чтобы было понятно.

Мне нужно знать что подправить чтобы получить _order.IsMatched()

MainWindows.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Configuration;

// using S#
using Ecng.Common;
using Ecng.ComponentModel;
using Ecng.Xaml;
using Ecng.Serialization;
using Ecng.Collections;
using StockSharp.Algo;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Indicators.Trend;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Candles.Compression;
using StockSharp.Algo.Strategies;
using StockSharp.Algo.Storages;
using StockSharp.BusinessEntities;
using StockSharp.Quik;
using StockSharp.Logging;
using StockSharp.Xaml;



namespace WpfApplication1
{

    public partial class MainWindow : Window
    {

        // Объявление переменных

        private QuikTrader _trader;   // квик трейдер

        private TimeSpan _timeFrame = TimeSpan.FromMinutes(5);  // таймфрейм
        private TimeSpan _timeRefreshStrategy = TimeSpan.FromSeconds(5);  // частота обновления стратегии
        
        int _sharecount; // количество торгуемых контрактов
        private DartWeiderStretegy _strategy; // обявляем стратегию
        
        private Security _security; // инструмент
        private Portfolio _portfolio; // портфель

        private CandleManager _candleManager; // менеджер свечек

        public CandleSeries _series; // поток свечей

        private ChartArea _area; // область графика

        private ChartCandleElement _candlesElem;  // элемент области графика

        readonly DateTime _starttime = new DateTime(2013, 1, 1); // дата начала экспорта свечей для _ candleManager

        readonly DateTime _endtime = DateTime.MaxValue; // дата конца экспорта свечей для _ candleManager

        private const string _historyPath = @"D:\hist\"; // папка где храняться тиковые данные сделок для TimeFrameCandleBuilder

        public const string _quikPath = @"W:\Soft\QUIK-Junior"; // путь к квику
                              

        public MainWindow()
        {
            InitializeComponent();

            this.WindowState = System.Windows.WindowState.Maximized; // разворачиваем главное окно на максимум
            
            _area = new ChartArea(); // cоздание области графика
            _chart.Areas.Add(_area); // и добавление ее в _chart

        }

        // Кнопка "Подключение" - Метод подключения к квику
        private void Connect_Click(object sender, RoutedEventArgs e)
        {
            // если трейдер не подключен
            if (_trader == null)
            {
                // находим автоматом расположение квика
                _trader = new QuikTrader(_quikPath);

                //Подписываемся на событие появления новых портфелей и добавляем их в ComboBox Portfolios
                _trader.NewPortfolios += portfolios => this.GuiAsync(() => {Portfolios.ItemsSource = _trader.Portfolios;});

                //Подписываемся на событие появления новых инстументов и добавляем их в ComboBox Securities
                _trader.NewSecurities += securities => this.GuiAsync(() => {Securities.ItemsSource = _trader.Securities;});

                // ТУТ НУЖНО ПОДПИСАТЬСЯ НА СОБЫТИЯ ПОЯВЛЕНИЯ НОВЫХ ЗАЯВОК... а КАК?

                // Создание элемента графика представляющего свечки и добавление его в область графика
                _candlesElem = new ChartCandleElement();
                _area.Elements.Add(_candlesElem);

            }
            
            try
            {
                // подключаем квик
                _trader.Connect();
            }
            catch (System.IO.IOException err)
            {
                MessageBox.Show("Не удается подключиться к квику" + err.Message);
            }

            //Начинаем Экспорт данных
            
            _trader.StartExport(); //получение он-лайн данных из квика Инструменты, Заявки, Портфели и так далее

            _candleManager = new CandleManager(_trader); // создаем менеджер свечек

            var storageRegistry = new StorageRegistry(); // создаем экземпляр класа-источника данных

            ((LocalMarketDataDrive)storageRegistry.DefaultDrive).Path = _historyPath; // присваиваем ему по умолчанию путь где хранятся наши тиковые данные

            var cbs = new TradeStorageCandleBuilderSource { StorageRegistry = storageRegistry }; // создаем новый источник данных и присваиваем ему хранилище

            _candleManager.Sources.OfType<TimeFrameCandleBuilder>().Single().Sources.Add(cbs); // добавляем в менеджер свечек наш источник
            
            _candleManager.Processing += DrawCandle; // подписываемся на событие отрисовки свечей
            
        }

        // метод отрисовки свечей
        private void DrawCandle(CandleSeries series, Candle candle)
        {
            if (series == _series)
            {
                this.GuiAsync(() =>
                {
                    _chart.ProcessCandle(_candlesElem, candle);
                });
            }
        }

        // Кнопка "Остановка" - Метод остановки робота
        private void StopRobot_Click(object sender, RoutedEventArgs e)
        {
            // если трейдер подключен
            if (_trader != null)
            {
                if (_trader != null && _security!=null && _trader.RegisteredMarketDepths != null) _trader.UnRegisterMarketDepth(_security); // если стакан зарегестиррован - отключаем экспорт со стакана
                if (_strategy != null && _strategy.ProcessState == ProcessStates.Started) _strategy.Stop(); // если стратегия запущена - останавливаем стратегию
                if (_trader.Orders != null) _trader.CancelOrders(); // если есть активные ордера - отменяем ордера
                _trader.StopExport(); // останавливаем экспорт
                _trader.Dispose(); // освобождение занятых ресурсов
            }
        }

        // Метод на случай закрытия окна робота
        private void ProgramWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            // если трейдер подключен
            if (_trader != null)
            {
                if (_trader != null && _security != null && _trader.RegisteredMarketDepths != null) _trader.UnRegisterMarketDepth(_security); // если стакан зарегестирован - отключаем экспорт со стакана
                if (_strategy!=null && _strategy.ProcessState == ProcessStates.Started) _strategy.Stop(); // если стратегия запущена - останавливаем стратегию
                if (_trader.Orders != null) _trader.CancelOrders(); // если есть активные ордера - отменяем ордера
                _trader.StopExport(); // останавливаем экспорт
                _trader.Dispose(); // освобождение занятых ресурсов
            }
        }

        // Кнопка "Запуск робота" - метод запуск робота
        private void StartRobo_Click(object sender, RoutedEventArgs e)
        {
            // проверяем подключен ли квик трейдер, задан ли портфель, инструмент
            if (_trader == null)
            {
                MessageBox.Show("Терминал не задан");
                return;
            }

            if (_trader.Portfolios == null)
            {
                MessageBox.Show("Портфель не задан");
                return;
            }

            if (_trader.Securities == null)
            {
                MessageBox.Show("Инструмент не задан");
                return;
            }

            // код запуска стратегии
            if (_strategy == null)
            {
                _series = new CandleSeries(typeof(TimeFrameCandle), _security, _timeFrame); // создаем поток свечей и указываем что тип TimeFrameCandle

                _candleManager.Start(_series, _starttime, _endtime);  // запускаем CandleManager
                
                System.Threading.Thread.Sleep(25000); // делаем паузу на 20 сек. перед тем как запустить стратегию - чтобы серия заполнилась свечками               

                _strategy = new DartWeiderStretegy(_candleManager, _timeFrame, _series) // создаем стратегию
                {
                    Volume = _sharecount, // количество контрактов которое мы указали
                    Security = _security,
                    Portfolio = _portfolio,
                    Trader = _trader,
                    Interval = _timeRefreshStrategy // интервал который мы указали
                };
                
                // если стратегия не запущена - запускаем
                if (_strategy.ProcessState == ProcessStates.Stopped)
                {
                    // запускаем процесс получения стакана, необходимый для работы алгоритма котирования
                    _trader.RegisterMarketDepth(_security);
                    
                    _strategy.Start();
                }

            }

        }

        // метод измеенеия инструмента в ComboBox
        private void Securities_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            string sec = Convert.ToString(Securities.SelectedItem); // создаем временную текстовую переменную и присваиваем ей название выбраного елемента (напр. RIH3@RTS)
            sec = sec.Replace("@RTS", string.Empty); // вырезаем хвост "@RTS" 
            _security = _trader.Securities.First(s => s.Code == sec && s.Type == SecurityTypes.Future); // присваеваем переменной _security имя  выбраного инструмента
        }

        // метод измеенеия портфеля в ComboBox
        private void Portfolios_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            _portfolio = _trader.Portfolios.FirstOrDefault(p => p.Name == Convert.ToString(Portfolios.SelectedItem)); // присваеваем переменной _portfolio имя  выбраного портфеля
        }

        //метод изменения позиции в тектовом поле "Количество контрактов"
        private void PositionSize_TextChanged(object sender, TextChangedEventArgs e)
        {
            try
            {
                _sharecount = Convert.ToInt32(PositionSize.Text); // присваиваем переменной размер позиции указанной в текстовом поле
            }
            catch
            {
            MessageBox.Show("Неправильный размер позиции");
            }
        }

    
    }

}


Strategy.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Configuration;

using StockSharp.Algo;
using StockSharp.Algo.Strategies;
using StockSharp.Algo.Candles;
using Ecng.Xaml;
using StockSharp.Quik;
using StockSharp.BusinessEntities;


namespace WpfApplication1
{
    class DartWeiderStretegy : TimeFrameStrategy
    {
     
        // переменные

        public Order _order;   // текущая заявка

        public Order _stopOrder;

        public TimeSpan _timeFrame;  // таймфрейм

        public CandleManager _candleManager; // менеджер свечек

        public CandleSeries _series; // поток свечек

        bool stop = false; // открывать ли новую позицию

        // конструктор для работы стратегии
        public DartWeiderStretegy(CandleManager candleManager, TimeSpan timeFrame, CandleSeries series) : base(timeFrame)
        {
            _candleManager = candleManager;

            _timeFrame = TimeFrame;

            _series = series;

        }

        /// Запуск стратегии

        protected void OnStarting()
        {

            base.OnStarted();
        }

        // Выполнение стратегии
        protected override ProcessResults OnProcess()
        {
          

            #region ситуация для покупки


            if (

                stop == false // если количество открытых позиций < 1

// тут еще несколько условий (код МТС)

                )

            {
                

                // создаем заявку на покупку
                _order = this.CreateOrder(OrderDirections.Buy, _series.GetCandle<TimeFrameCandle>(1).ClosePrice, base.Volume);

                // регистрируем ее

                base.RegisterOrder(_order);

                             
                

                // проверяем выполнение заявки
if (_order.IsMatched() 
{
                  
                //Выставляем стоп-лосс и тейкпрофит через метод
                _stopOrder = this.CreateStopLimitAndTakeProfit(_order.Price);
                    
                 // регистрируем его
                 base.RegisterOrder(_stopOrder);

            }     
                
            }

            #endregion
         

            
            return ProcessResults.Continue;
        }



        // Метод выставления стопа и тейк-профита
        public Order CreateStopLimitAndTakeProfit(decimal openPrice)
        {
            decimal stopPrice = Convert.ToDecimal(openPrice) - 10;
            decimal tpPrice = Convert.ToDecimal(openPrice) + 30;

            return new Order
            {
                Type = OrderTypes.Conditional,
                Volume = base.Volume,
                Price = Convert.ToDecimal(stopPrice-1),
                Security = base.Security,
                Portfolio = base.Portfolio,
                Direction = OrderDirections.Sell,
                StopCondition = new QuikStopCondition
                {
                    Type = QuikStopConditionTypes.LinkedOrder,
                    LinkedOrderPrice = tpPrice,
                    StopPrice = stopPrice,
                },
            };
        }


         
         
    }
}


Спасибо:

Alexander

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


Повторяю свой ответ. Вы проверяете не в тот момент isMatched. Вы проверяете после того как отправили, но до того как вам пришёл ответ от биржи.

Спасибо: RoboKrolik

RoboKrolik

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


Alexander Mukhanchikov: Повторяю свой ответ. Вы проверяете не в тот момент isMatched. Вы проверяете после того как отправили, но до того как вам пришёл ответ от биржи.

Спасибо все работает.

Не могу понять почему я вынес проверку исполнения ордера как Вы указали и ничего не получалось... Код вроде не менял, но на след день начало работать))) Мистика)

Спасибо:

zxzzxxzx

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


Товарищи!

Нельзя ли как-нибудь показатль работающий код? Пытаюсь настроить проверку статуса заявок - никак не получается(((

Спасибо

Спасибо:


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

loading
clippy