Всем привет. Со 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 лотов скотировался один и стратегия завершилась с ошибкой.