Всем привет. Со stock# разбираюсь недавно. Если вопросы глупые то сильно не пинайте.😊
Несколько цитат из справки
Свойства 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);
Запускаю, нажимаю на кнопку. В стакан добавляется заявка в одни лот. Котируется до тех пор, пока не исполняется. Все. После этого заявки не выставляются.🤨
Пробую так
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;
}
});
чтобы можно было посмотреть свойства дочерней стратегии. При запуске выдает эксепшен - Данный метод не поддерживается.🤨
Переделываю класс 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. После того как заявка исполнена, ничего не меняется.
Подключаю логирование. Результат

Получается заявка исполнена но стратегия пытается ее снять.🤔
Дальше еще интреснее. Пробую так
myStrat.addChildStrategy(OrderDirections.Sell, 2, 2);
При котировании заявка просто снимается и больше не выставляется.🤨

Помогите разобраться.
- За что отвечают свойства LeftVolume, QuotingVolume, Volume и как с ними работать.
- Как "правильно" получать доступ к свойствам дочерних стратегий.
- Логика работы MarketQuotingStrategy.
Заранее спасибо.
Комментарии (3)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
отличный пост! буду признателен местным гуру, если просветят. еще бы один вопрос хотел добавить, возможно ответ на него был бы интересен и автору топика.
как кошерно узнать что стратегия MarketQuotingStrategy благополучнозавершилась выполнив свою задачу? как и какое событие обработать?
Проверьте правильно ли у вас настроена таблица заявок и изменяется ли состояние заявок. Решил проверить работоспособность MQS. Вначале не работало. Оказалось у меня в таблице заявок нет колонки Срок изза чего статус заявки не менялся. Поправил все заработало) Ниже переделанный SampleConsole:
upd: версия 4.0.18
Serg спасибо за наводку с таблицами.
Настройки загружал из конфигурационного файла. Проверял Verifier все ок. Сравнил с настройками в хелпе - один в один. Проблема оказалась в другом. По умолчанию экспорт по dde идет по всем таблицам. А я начинал с того, что добавлял на форму две кнопки - купить продать по рынку. Потом уже перешел к котированию. Поэтому экспорт делал только по нужным таблицам. Оказалось что забыл добавить таблицу "Заявки" Ешкин кот...😛 Добавил таблицу "Заявки", MQS стала отрабатывать так как я и предполагал.
Появилась другая проблема. Заявка переставлена, но MQS думает что нет и постоянно пишется "заявка в процессе снятия". В это время заявка в стакане болтается и не котируется. Как только исполняется, то выставляется следующая и начинает котироваться.
Вылечилось этим QuikTrader.IsAsyncMode = false
Но вылезла другая бага
Это если я правильно понимаю уже что то внутри stock# ?
Из выставленного объема в 5 лотов скотировался один и стратегия завершилась с ошибкой.