Вопрос по LeftVolume, QuotingVolume, Volume
Atom Ответить
14.02.2012


Всем привет. Со stock# разбираюсь недавно. Если вопросы глупые то сильно не пинайте.Blushing

Несколько цитат из справки

Свойства
LeftVolume: Объем, который осталось реализовать до завершения котирования.
QuotingVolume: Объем, который необходимо скотировать.
Volume: Объем, которым необходимо оперировать.

Методы
NeedFinish: По умолчанию, котирование останавливается тогда, когда все контракты реализованы и LeftVolume равно 0.

Если я все правильно понимаю как это работает, то должно быть так: Мне надо скотировать 5 лотов выставляя по одному лоту. Есть QuotingVolume = 5, есть Volume = 1.
Когда запускается стратегия MarketQuotingStrategy то выставляется заявка в 1 лот и котируется до тех пор пока не исполнится. Как только заявка исполнена, LeftVolume становится = 4. Выставляется следующая заявка в 1 лот, и т.д. До тех пор пока LeftVolume не станет равен 0. После этого котирование останавливается и MarketQuotingStrategy ProcessState = Stopped;

Есть класс

Код

    class myStrategy : Strategy
    {
        protected override void OnStarting()
        {
            Security.Exchange.IsSupportAtomicReRegister = false;
            base.OnStarting();
        }

        public void addChildStrategy(OrderDirections direct, decimal quotingVol, decimal vol)
        {
            var strt = new MarketQuotingStrategy(direct, quotingVol) { PriceOffset = base.Security.MinStepSize, Volume = vol };
            ChildStrategies.Add(strt);
        }
    }



В основном коде создаю экземпляр класса myStrategy
Код
 
            ...
            myStrat = new myStrategy() { Trader = trader, Portfolio = Portfolio.SelectedPortfolio, Security = instr1};
            myStrat.Start();


Добавляю на форму кнопку, в обработчик пишу
Код
myStrat.addChildStrategy(OrderDirections.Sell, 5, 1);


Запускаю, нажимаю на кнопку. В стакан добавляется заявка в одни лот. Котируется до тех пор, пока не исполняется. Все. После этого заявки не выставляются.Confused


Пробую так
Код
myStrat.addChildStrategy(OrderDirections.Sell, 1, 1);


При создании экземпляра myStrategy подписываюсь на событие OnStrategyPropertyChanged
Код
myStrat.PropertyChanged += OnStrategyPropertyChanged;


Добавляю на форму несколько лэйблов и в обработчике пишу.
Код
 
            this.GuiAsync(() =>
            {
                if(myStrat.ChildStrategies.Count > 0)
                {
                    lblCountChild.Content = myStrat.ChildStrategies.Count.ToString();
                    lblLeftVol.Content = ((MarketQuotingStrategy)myStrat.ChildStrategies[0]).LeftVolume;
                    lblProcState.Content = ((MarketQuotingStrategy)myStrat.ChildStrategies[0]).ProcessState; 
                }
            });

чтобы можно было посмотреть свойства дочерней стратегии.
При запуске выдает эксепшен - Данный метод не поддерживается.Confused

Переделываю класс myStrategy
Код

    class myStrategy : Strategy
    {
        protected override void OnStarting()
        {
            Security.Exchange.IsSupportAtomicReRegister = false;
            base.OnStarting();
        }

        public MarketQuotingStrategy strt;

        public void addChildStrategy(OrderDirections direct, decimal quotingVol, decimal vol)
        {
            //var strt = new MarketQuotingStrategy(direct, quotingVol) { PriceOffset = base.Security.MinStepSize, Volume = vol };
            strt = new MarketQuotingStrategy(direct, quotingVol) { PriceOffset = base.Security.MinStepSize, Volume = vol };
            ChildStrategies.Add(strt);
        }
    }


и обработчик OnStrategyPropertyChanged

Код

            this.GuiAsync(() =>
            {
                if(myStrat.ChildStrategies.Count > 0)
                {
                    lblCountChild.Content = myStrat.ChildStrategies.Count.ToString();
                    //lblLeftVol.Content = ((MarketQuotingStrategy)myStrat.ChildStrategies[0]).LeftVolume;
                    //lblProcState.Content = ((MarketQuotingStrategy)myStrat.ChildStrategies[0]).ProcessState;
                    
                    lblLeftVol.Content = myStrat.strt.LeftVolume;
                    lblProcState.Content = myStrat.strt.ProcessState;
                }
            });

Коряво конечно, но чтобы посмотреть как работает, пойдет.
Запускаю. Нажимаю кнопку. В стакан добавляется заявка в одни лот. На лэйблах показывает что дочерних стратегий - 1, объем до завершения котирования - 1, статус - started. После того как заявка исполнена, ничего не меняется.

Подключаю логирование. Результат


Получается заявка исполнена но стратегия пытается ее снять.Huh

Дальше еще интреснее.
Пробую так
Код
myStrat.addChildStrategy(OrderDirections.Sell, 2, 2);

При котировании заявка просто снимается и больше не выставляется.Confused


Помогите разобраться.
1. За что отвечают свойства LeftVolume, QuotingVolume, Volume и как с ними работать.
2. Как "правильно" получать доступ к свойствам дочерних стратегий.
3. Логика работы MarketQuotingStrategy.

Заранее спасибо.

Теги:


Спасибо:




3 Ответов
vfreeman

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


Moadip Перейти
Всем привет. Со stock# разбираюсь недавно. Если вопросы глупые то сильно не пинайте.Blushing
Помогите разобраться.
1. За что отвечают свойства LeftVolume и Volume и как с ними работать.
2. Как "правильно" получать доступ к свойствам дочерних стратегий.
3. Логика работы MarketQuotingStrategy.

Заранее спасибо.


отличный пост! буду признателен местным гуру, если просветят. еще бы один вопрос хотел добавить, возможно ответ на него был бы интересен и автору топика.

как кошерно узнать что стратегия MarketQuotingStrategy благополучно завершилась выполнив свою задачу? как и какое событие обработать?
Спасибо:

Serg

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


Проверьте правильно ли у вас настроена таблица заявок и изменяется ли состояние заявок. Решил проверить работоспособность MQS. Вначале не работало. Оказалось у меня в таблице заявок нет колонки Срок изза чего статус заявки не менялся. Поправил все заработало)
Ниже переделанный SampleConsole:


upd: версия 4.0.18
Program.cs 6,3KB (0)
Спасибо: Moadip

Moadip

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


Serg спасибо за наводку с таблицами.

Настройки загружал из конфигурационного файла. Проверял Verifier все ок. Сравнил с настройками в хелпе - один в один.
Проблема оказалась в другом. По умолчанию экспорт по dde идет по всем таблицам.
А я начинал с того, что добавлял на форму две кнопки - купить продать по рынку. Потом уже перешел к котированию. Поэтому экспорт делал только по нужным таблицам.
Оказалось что забыл добавить таблицу "Заявки"
Ешкин кот...Razz
Добавил таблицу "Заявки", MQS стала отрабатывать так как я и предполагал.

Цитата:
Мне надо скотировать 5 лотов выставляя по одному лоту. Есть QuotingVolume = 5, есть Volume = 1.
Когда запускается стратегия MarketQuotingStrategy то выставляется заявка в 1 лот и котируется до тех пор пока не исполнится. Как только заявка исполнена, LeftVolume становится = 4. Выставляется следующая заявка в 1 лот, и т.д. До тех пор пока LeftVolume не станет равен 0. После этого котирование останавливается и MarketQuotingStrategy ProcessState = Stopped;


Появилась другая проблема. Заявка переставлена, но MQS думает что нет и постоянно пишется "заявка в процессе снятия". В это время заявка в стакане болтается и не котируется. Как только исполняется, то выставляется следующая и начинает котироваться.


Вылечилось этим QuikTrader.IsAsyncMode = false

Но вылезла другая бага



Это если я правильно понимаю уже что то внутри stock# ?

Из выставленного объема в 5 лотов скотировался один и стратегия завершилась с ошибкой.
Автор топика
Спасибо:


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

loading
clippy