у меня нличествует запоздание обновления заявки в ITrader.Order
заявка в квике уже выполнена, а Order.State показывает что она Active.
процесс проверки сигналов успевает 3-4 раза проверить сигналы, прежде
чем увидит что заявка выполнена, а за это время цены успевают далеко
уйти, и реакция на выполение заявки запаздывает. Можно как то процесс
обновления состояния заявки ускорить? параметром там какием в квике
или еще как?
Да вот черт его знает. Вроде быстро. но ведь исключение при поытке
снять выполенную заявку квик ytans2quik генерит?
у меня когд такой
if (order.State == OrderStates.Active)
trader.CancelOrder(order)
и тут генерится эксепшн (нет заявки для снятия), хотя у переменной
order.State = Active, но в квике она выполнена. а время выполнения с
точностью до милисикунд я в квике посмореть не могу
Я уже писал про это (как и сам Квик). У них какая-то спец защита стоит
от роботов. Типа быстрее не дают... Совсем другое, если и в Квике
быстро меняется. А это надо смотреть. Последите за своей машинкой и
Квиком, если получится.
http://stockmarketdotnet.blogspot.com/2010/02/s-17.htmlПункт 4. Там и
ссылка на Квик форум. Можете поднять тему. Был слух, что они это
ограничение хотят снять. Может уже брокеры такое умеют делать в
настройках Квик сервера.
Там проблема в том, что заявка принята биржей, но реально еще не
зарегистрирована в Квик сервере. Поэтому, цена уже изменилась на
рынке, ее снимать надо, а он ней информация на сервере отсутствует.
у меня похожая ситуация возникла - заявка зарегистрировалась, в
таблице сделок её состояние уже исполнена, а stock# пишет, что active.
5 минут прошло - и всё active. Или надо на какие-то события
дополнительно подписываться, чтобы робот узнал, что сделка
исполнилась? Я подписываюсь только на события orderfailed...
Соответственно у меня и в PositionManager свойство Position равно 0...
Все экспорты запущены (QuikTrader.StartExport()),
Order newOrder = CreateOrder(OrderDirections.Sell, openPrice,
Volume);
Trader.RegisterOrder(newOrder);
base.AddOrder(newOrder);
Сделки на рынок выходят, но PositionManager.Position для стратегии
(наследуемой от TimeFrameStrategy) не меняется. И при попытке через 5
минут
Trader.CancelOrders(null, Account, null, null, Security);
выскакивает эксепшен с тем, что нельзя снять заявку. Смотрю по
дебагеру - у неё состояние Active, тогда как на бирже - уже исполнена
давно (прошло 5 минут).
(' не была зарегистрирована. Причина 'Вы не можете снять данную
заявку'. Parameter name: transactionTxt)
Нет, молчит, никаких сообщений не было.
Из событий подписан только на Сonnected, ConnectionError,
OrdersFailed, ProcessDataError, StopOrdersFailed, NewSecurities.
В какую сторону можно копать? Вечером попробую раз в 5 минут роботом
выставлять заявку и следить за статусом. Просто хочется понять в какой
стороне искать проблему.
P.S. Verifier показывает что всё нормально настроено.
Была лишь 1 заявка на 1 лот, т.е. была 1 сделка. Вот распечатка
Order при каждом срабатывании события OrdersChanged:
Balance (0), CancelTime (), ID (1846739022), InitializationTime
(01.07.2010 10:51:36), Price (127615), State (Matched), Status (Done),
Time (01.07.2010 10:51:38), TransactionId (39096772), Volume (1),
Direction(Sell)
Balance (0), CancelTime (), ID (1846739022), InitializationTime
(01.07.2010 10:51:36), Price (127615), State (Matched), Status (Done),
Time (01.07.2010 10:51:38), TransactionId (39096772), Volume (1),
Direction(Sell)
Balance (0), CancelTime (), ID (1846739022), InitializationTime
(01.07.2010 10:51:36), Price (127615), State (Matched), Status (Done),
Time (01.07.2010 10:51:38), TransactionId (39096772), Volume (1),
Direction(Sell)
Balance (0), CancelTime (), ID (1846739022), InitializationTime
(01.07.2010 10:51:36), Price (127615), State (Matched), Status (Done),
Time (01.07.2010 10:51:38), TransactionId (39096772), Volume (1),
Direction(Sell)
Balance (0), CancelTime (), ID (1846739022), InitializationTime
(01.07.2010 10:51:36), Price (127615), State (Matched), Status (Done),
Time (01.07.2010 10:51:38), TransactionId (39096772), Volume (1),
Direction(Sell)
Balance (0), CancelTime (), ID (1846739022), InitializationTime
(01.07.2010 10:51:36), Price (127615), State (Matched), Status (Done),
Time (01.07.2010 10:51:38), TransactionId (39096772), Volume (1),
Direction(Sell)
Balance (0), CancelTime (), ID (1846743309), InitializationTime
(01.07.2010 10:52:00), Price (138585), State (Matched), Status (Done),
Time (01.07.2010 10:52:01), TransactionId (39120212), Volume (1),
Direction(Buy)
Balance (0), CancelTime (), ID (1846743309), InitializationTime
(01.07.2010 10:52:00), Price (138585), State (Matched), Status (Done),
Time (01.07.2010 10:52:01), TransactionId (39120212), Volume (1),
Direction(Buy)
Balance (0), CancelTime (), ID (1846743309), InitializationTime
(01.07.2010 10:52:00), Price (138585), State (Matched), Status (Done),
Time (01.07.2010 10:52:01), TransactionId (39120212), Volume (1),
Direction(Buy)
Balance (0), CancelTime (), ID (1846743309), InitializationTime
(01.07.2010 10:52:00), Price (138585), State (Matched), Status (Done),
Time (01.07.2010 10:52:01), TransactionId (39120212), Volume (1),
Direction(Buy)
Balance (0), CancelTime (), ID (1846743309), InitializationTime
(01.07.2010 10:52:00), Price (138585), State (Matched), Status (Done),
Time (01.07.2010 10:52:01), TransactionId (39120212), Volume (1),
Direction(Buy)
Balance (0), CancelTime (), ID (1846743309), InitializationTime
(01.07.2010 10:52:00), Price (138585), State (Matched), Status (Done),
Time (01.07.2010 10:52:01), TransactionId (39120212), Volume (1),
Direction(Buy)
Вначале открыли, потом, на новой минуте - закрыли. Между открытием и
закрытием позиции печатал PositionManager.Position, он был равен -2.
И ещё, почему событие OrdersChanged вызывается 6 раз для 1 заявки?
Вроде был уже такой вопрос в группе, но не смог найти.
Вот сейчас тоже по стратегии был открыт шорт на 20 лотов и выставлен
стоп для шорта на теже 20 лотов. PositionManager.Position равен -40.
Чего-то не понимаю видимо я =)
Как-то можно получить конкретно эти открытые -20 лотов для стратегии?
On 1 июл, 12:53, Mikhail Sukhov <msou...@gmail.com> wrote:
Пошёл дальше в исследовании - у меня создаётся MultiTrader, который я
и передаю в стратегию и именно его использую для регистрации заявок.
Может как раз стоит использовать не его, а добавленный в него
QuikTrader. Потому что, возвращаясь к этим 20 лотам шорта - в MyTrades
у PositionManager аж 6 сделок отображено. И стоп-сделки, которая
сработала, почему-то нет. Хотя и она была туда добавлена:
var stopOrder = new Order
{
Account = Account,
Type = OrderTypes.Conditional,
Volume = Volume,
Security = Security,
Direction =
OrderDirections.Buy,
Price = Security.MaxPrice,
StopCondition = new
QuikStopCondition
{
Type =
По поводу производной не понял.
Я поставил стоп на покупку как видно из текста, т.е. на защиту шорта.
Он выставился в систему и уже сработал.
Реально не знаю сколько должно сделок, я хочу, регистрируя в стратегии
сделку и получая состояние что она исполнена - получить в
PositionManager.Position для данной стратегии столько лотов, сколько у
меня было открыто в сделке. Или логика другая?
On 1 июл, 14:09, Mikhail Sukhov <msou...@gmail.com> wrote:
Попутно наткнулся на такой эксепшен при попытке вызвать
Trader.Disconnect(), где Trader - MultiTrader, куда добавлены 2
AggregatedTraders с одинаковыми QuikTrader (пути совпадают) и разными
счетами:
Ecng.Trading.Quik.ApiException was caught
Message=Код ошибки DllNotConnected Сообщение DLL is not connected to
QUIK.
Source=Ecng.Trading.Quik
StackTrace:
at . (Int32 , StringBuilder )
at . ()
at Ecng.Trading.Quik.QuikTrader.Disconnect()
at Ecng.Trading.Algo.MultiTrader. (IEnumerable1 ) at Ecng.Trading.Algo.MultiTrader. . ( ) at Ecng.Collections.CollectionHelper.SyncDo[TCollection] (TCollection collection, Action1 action)
at Ecng.Trading.Algo.MultiTrader. (Action`1 )
at Ecng.Trading.Algo.MultiTrader.Disconnect()
at Robots.MainWindow.ConnectBtn_Click(Object sender,
RoutedEventArgs e) in C:\Users\Alexander\Documents\Visual Studio
2010\Projects\Robots\Robots\MainWindow.xaml.cs:line 224
InnerException:
А стоп заявку потом как-нибудь передавали в стратегию? Могли бы Вы еще
посмотреть на все свои сделки в системе (ITrader.GetMyTrades(sec)). По
ним какая позиция возвращается?
On 1 июл, 14:13, Alexander <amukhanch...@gmail.com> wrote:
Готов сразу огорчить - Strategy не умеет работать со стоп заявками. Не
делал я в них поддержку - как то все собствеными эмуляциями обходился.
Пока не уверен, есть ли время для фикса, так что давайте будем искать
пути обхода. Как вариант, расчитывать позицию самостоятельно, через
событие ITrader.NewMyTrades. Стоп заявки ессесно где-то сохранять
нужно, и смотреть появление производной заявки. Кстати, Вы написали,
что не поняли, что это такое. Это
Жаль, буду тогда руками считать, да.
неправильный подсчёт позиции через PositionManager ушёл, когда изменил
логику, как отписался в соседнем топике, спасибо.
On 2 июл, 12:34, Mikhail Sukhov <msou...@gmail.com> wrote:
Михаил, хорошая кстати задачка получилась - посчитать активную позицию
для стратегии. =)
Я пока пришёл к такому варинту, если не прав в рассуждениях -
исправьте, пожалуйста.
PositionManager для стратегии может работать только с заявками,
стопзаявки не учитываются. Поэтому активная позиция в стратегии равна
PositionManager.Position + <число контрактов, сработавших по стопу>.
Для этого при выставлении стоп заявки мы не регистрируем её в
стратегии (base.AddOrder) (обычные заявки регистрируются в стратегии
как раньше), а сохраняем её, для отслеживания что она сработала
(условие что DerivedOrder != null). Если сработала - прибавляем число
контрактов которое сработало по DerivedOrder.
У меня вышло вот что:
(где GetStopPosition (stopOrders -
ThreadSafeObservableCollection<Order> из заявок, зарегистрированных в
стратегии):)
private int GetStopPosition()
{
return (from stopOrder in stopOrders
where stopOrder.DerivedOrder != null
where stopOrder.DerivedOrder.State ==
OrderStates.Active || stopOrder.DerivedOrder.State ==
OrderStates.Matched
let stopVolume = stopOrder.DerivedOrder.Volume -
stopOrder.DerivedOrder.Balance
let mult = stopOrder.DerivedOrder.Direction ==
OrderDirections.Buy ? 1 : -1
select stopVolume*mult).Sum();
}
(или не в LINQ варианте:
private int GetStopPosition()
{
int resultStopPosition = 0;
foreach (Order stopOrder in stopOrders)
{
if (stopOrder.DerivedOrder != null)
{
if (stopOrder.DerivedOrder.State ==
OrderStates.Active || stopOrder.DerivedOrder.State ==
OrderStates.Matched)
{
int stopVolume = stopOrder.DerivedOrder.Volume
stopOrder.DerivedOrder.Balance;
int mult = stopOrder.DerivedOrder.Direction ==
OrderDirections.Buy ? 1 : -1;
resultStopPosition += stopVolume*mult;
}
}
}
return resultStopPosition;
}
)
Всё верно? Таким образом, никаких MyNewTrades отслеживать не придётся
(там ведь ещё надо понимать, какие заявки сгенерированы стратегией, а
какие - нет. Всё это, конечно, обходится, но весь вопрос в затратах).
On 2 июл, 12:34, Mikhail Sukhov <msou...@gmail.com> wrote:
Или просто все, не равные null, DerivedOrder от стопов добавлять в
стратегию методом base.AddOrder.
Они, кстати, проверяются при добавлении на совпадение, т.е. что будет,
если добавить одну и туже DerivedOrder заявку через base.AddOrder?
Если не проверяются - надо просто хранить список уже добавленных
DerivedOrder и проверять при добавлении, что уже не добавили.
On 3 июл, 15:35, Alexander <amukhanch...@gmail.com> wrote:
Думаю, стоит проверять лишь на stopOrder.DerivedOrder != null.
Я бы подписался еще и на StopOrdersChanged. Вот там бы дожидался
stopOrder.DerivedOrder != null после чего подсчитывал бы позицию уже
по обычной заявке.
On 3 июл, 15:35, Alexander <amukhanch...@gmail.com> wrote:
Это LINQ запрос был =) Порой на нём проще что-то написать. "let a =
b" == "пусть далее в запросе a равно b"
Т.е. дополнительно проверять State не стоит? Это пока я посылаю
стоп заявки по маркету на фортсе (по цене верхнего или нижнего
лимита), потом может измениться на лимитные цены, потому вроде стоит
проверять в любом случае.
Попробую для начала сделать как расписал - внутри стратегии
отслеживать, а не через событие. Т.к. у меня к каждому счёту приписана
своя отдельная стратегия (т.е. одна стратегия может быть приписана
нескольким счетам) - так будет пока проще.
Или через AddOrder, сохраняя все DerivedOrder, которые не равны null.
Так даже более интересное решение вышло. =)
Большое спасибо за такую всестороннюю поддержку! С нетерпением жду
новой версии. =)
On 5 июл, 13:54, Mikhail Sukhov <msou...@gmail.com> wrote:
Dmitriy Klimov:
Alexander, к какому конечному решению вы пришли при подсчете активной позиции для стратегии? И что за метод AddOrder? Не нашел такого...
Комментарии (41)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Не работает экспорт по таблице Заявки?
Тоже вопрос по заявкам
у меня нличествует запоздание обновления заявки в ITrader.Order
заявка в квике уже выполнена, а Order.State показывает что она Active. процесс проверки сигналов успевает 3-4 раза проверить сигналы, прежде чем увидит что заявка выполнена, а за это время цены успевают далеко уйти, и реакция на выполение заявки запаздывает. Можно как то процесс обновления состояния заявки ускорить? параметром там какием в квике или еще как?
Может как то принудитльно запросить стаутс заявки можно?
В самом Квике как быстро изменяется статус заявки? Мгновенно или тоже с задержкой?
Да вот черт его знает. Вроде быстро. но ведь исключение при поытке снять выполенную заявку квик ytans2quik генерит?
у меня когд такой
if (order.State == OrderStates.Active) trader.CancelOrder(order)
и тут генерится эксепшн (нет заявки для снятия), хотя у переменной order.State = Active, но в квике она выполнена. а время выполнения с точностью до милисикунд я в квике посмореть не могу
Я уже писал про это (как и сам Квик). У них какая-то спец защита стоит от роботов. Типа быстрее не дают... Совсем другое, если и в Квике быстро меняется. А это надо смотреть. Последите за своей машинкой и Квиком, если получится.
А не дадите ссылочку, где можно почитаь об этом? А насчет последить - этим сейчас занимаюсь, набиваю логами воркофлоу, буду оценивать задержки.
Где, где, где почитать7 :)))
кстати, опыты показали что на мамбе заявка выполняется за ~100 мс, а на фортс за ~500-600. вот такие пироги.
http://stockmarketdotnet.blogspot.com/2010/02/s-17.htmlПункт 4. Там и ссылка на Квик форум. Можете поднять тему. Был слух, что они это ограничение хотят снять. Может уже брокеры такое умеют делать в настройках Квик сервера.
а вы статус заявки чеерз ДДЕ обновляете?
Конечно... Пройдите по ссылке на Квик форум. Там проблема не в статусе заявки.
Я уже ходил. ничего не понял :) понял тока что это квик тормозит.
Там проблема в том, что заявка принята биржей, но реально еще не зарегистрирована в Квик сервере. Поэтому, цена уже изменилась на рынке, ее снимать надо, а он ней информация на сервере отсутствует.
Ну вот именно это я и понял.
у меня похожая ситуация возникла - заявка зарегистрировалась, в таблице сделок её состояние уже исполнена, а stock# пишет, что active. 5 минут прошло - и всё active. Или надо на какие-то события дополнительно подписываться, чтобы робот узнал, что сделка исполнилась? Я подписываюсь только на события orderfailed... Соответственно у меня и в PositionManager свойство Position равно 0...
В таблице сделок или заявок? Нужно запустить экспорт на таблицу заявок.
Все экспорты запущены (QuikTrader.StartExport()), Order newOrder = CreateOrder(OrderDirections.Sell, openPrice, Volume); Trader.RegisterOrder(newOrder); base.AddOrder(newOrder);
Сделки на рынок выходят, но PositionManager.Position для стратегии (наследуемой от TimeFrameStrategy) не меняется. И при попытке через 5 минут Trader.CancelOrders(null, Account, null, null, Security); выскакивает эксепшен с тем, что нельзя снять заявку. Смотрю по дебагеру - у неё состояние Active, тогда как на бирже - уже исполнена давно (прошло 5 минут). (' не была зарегистрирована. Причина 'Вы не можете снять данную заявку'. Parameter name: transactionTxt)
ProcessDataError ничего плохого не пишет? Судя по симптомам, экспорт по заявкам не идет.
Нет, молчит, никаких сообщений не было. Из событий подписан только на Сonnected, ConnectionError, OrdersFailed, ProcessDataError, StopOrdersFailed, NewSecurities.
В какую сторону можно копать? Вечером попробую раз в 5 минут роботом выставлять заявку и следить за статусом. Просто хочется понять в какой стороне искать проблему.
P.S. Verifier показывает что всё нормально настроено.
А NewMyTrades по заявке приходят? OrdersChanged передает зависшую заявку?
Спс за наводку, подпишусь на эти события и потестирую вечером. Отпишусь по результатам
Подписался на эти события - всё стало работать нормально. Только почему-то если шортить 1 контракт и регистрировать эту заявку в стратегии:
CreateOrder(OrderDirections.Sell,
Security.MinPrice, 1);
PositionManager.Position становится равным -2. Или так и должно быть?
Вначале открыли, потом, на новой минуте - закрыли. Между открытием и закрытием позиции печатал PositionManager.Position, он был равен -2. И ещё, почему событие OrdersChanged вызывается 6 раз для 1 заявки? Вроде был уже такой вопрос в группе, но не смог найти.
Вот сейчас тоже по стратегии был открыт шорт на 20 лотов и выставлен стоп для шорта на теже 20 лотов. PositionManager.Position равен -40. Чего-то не понимаю видимо я =) Как-то можно получить конкретно эти открытые -20 лотов для стратегии?
On 1 июл, 12:53, Mikhail Sukhov <msou...@gmail.com> wrote:
Пошёл дальше в исследовании - у меня создаётся MultiTrader, который я и передаю в стратегию и именно его использую для регистрации заявок. Может как раз стоит использовать не его, а добавленный в него QuikTrader. Потому что, возвращаясь к этим 20 лотам шорта - в MyTrades у PositionManager аж 6 сделок отображено. И стоп-сделки, которая сработала, почему-то нет. Хотя и она была туда добавлена:
OrderDirections.Buy, Price = Security.MaxPrice, StopCondition = new QuikStopCondition { Type =
QuikStopConditionTypes. StopLimit, StopPrice = stopPrice, } }; Trader.RegisterOrder(stopOrder); base.AddOrder(stopOrder);
On 1 июл, 12:53, Mikhail Sukhov <msou...@gmail.com> wrote:
А сколько реально должно быть сделок? И плюс, ты Вы в курсе, что сделки по стоп заявки быть не должно, только по производной?
On 1 июл, 13:57, Alexander <amukhanch...@gmail.com> wrote:
Ок, а стоп был с каким направлением? Тоже на шорт или на защиту шорта (тоесть лонг)?
On 1 июл, 13:29, Alexander <amukhanch...@gmail.com> wrote:
По поводу производной не понял. Я поставил стоп на покупку как видно из текста, т.е. на защиту шорта. Он выставился в систему и уже сработал.
Реально не знаю сколько должно сделок, я хочу, регистрируя в стратегии сделку и получая состояние что она исполнена - получить в PositionManager.Position для данной стратегии столько лотов, сколько у меня было открыто в сделке. Или логика другая?
On 1 июл, 14:09, Mikhail Sukhov <msou...@gmail.com> wrote:
Идей пока нет, куда можно дальше копать?
Попутно наткнулся на такой эксепшен при попытке вызвать Trader.Disconnect(), где Trader - MultiTrader, куда добавлены 2 AggregatedTraders с одинаковыми QuikTrader (пути совпадают) и разными счетами:
Ecng.Trading.Quik.ApiException was caught Message=Код ошибки DllNotConnected Сообщение DLL is not connected to QUIK. Source=Ecng.Trading.Quik StackTrace: at . (Int32 , StringBuilder ) at . () at Ecng.Trading.Quik.QuikTrader.Disconnect() at Ecng.Trading.Algo.MultiTrader. (IEnumerable
1 ) at Ecng.Trading.Algo.MultiTrader. . ( ) at Ecng.Collections.CollectionHelper.SyncDo[TCollection] (TCollection collection, Action1 action) at Ecng.Trading.Algo.MultiTrader. (Action`1 ) at Ecng.Trading.Algo.MultiTrader.Disconnect() at Robots.MainWindow.ConnectBtn_Click(Object sender, RoutedEventArgs e) in C:\Users\Alexander\Documents\Visual Studio 2010\Projects\Robots\Robots\MainWindow.xaml.cs:line 224 InnerException:А стоп заявку потом как-нибудь передавали в стратегию? Могли бы Вы еще посмотреть на все свои сделки в системе (ITrader.GetMyTrades(sec)). По ним какая позиция возвращается?
On 1 июл, 14:13, Alexander <amukhanch...@gmail.com> wrote:
Стоп заявку обязательно передавал в стратегию с помощью base.AddOrder. Вот прям кусок кода:
Account = Account,
Type = OrderTypes.Conditional,
Volume = Volume,
Security = Security,
Direction = OrderDirections.Buy,
Price = Security.MaxPrice,
StopCondition = new QuikStopCondition
{
Type =
QuikStopConditionTypes.
StopLimit,
StopPrice = stopPrice, } };
Trader.RegisterOrder(stopOrder); base.AddOrder(stopOrder);
AddLog(StrategyErrorStates.None, "Регистрируем стопзаявку по цене {0}", new object[] );
On 2 июл, 02:38, Mikhail Sukhov <msou...@gmail.com> wrote:
Готов сразу огорчить - Strategy не умеет работать со стоп заявками. Не делал я в них поддержку - как то все собствеными эмуляциями обходился. Пока не уверен, есть ли время для фикса, так что давайте будем искать пути обхода. Как вариант, расчитывать позицию самостоятельно, через событие ITrader.NewMyTrades. Стоп заявки ессесно где-то сохранять нужно, и смотреть появление производной заявки. Кстати, Вы написали, что не поняли, что это такое. Это
http://stocksharp.com/doc/help/html/P_Ecng_Trading_BusinessEntities_O...
On 2 июл, 02:47, Alexander <amukhanch...@gmail.com> wrote:
Жаль, буду тогда руками считать, да. неправильный подсчёт позиции через PositionManager ушёл, когда изменил логику, как отписался в соседнем топике, спасибо.
On 2 июл, 12:34, Mikhail Sukhov <msou...@gmail.com> wrote:
Михаил, хорошая кстати задачка получилась - посчитать активную позицию для стратегии. =) Я пока пришёл к такому варинту, если не прав в рассуждениях - исправьте, пожалуйста.
PositionManager для стратегии может работать только с заявками, стопзаявки не учитываются. Поэтому активная позиция в стратегии равна PositionManager.Position + <число контрактов, сработавших по стопу>. Для этого при выставлении стоп заявки мы не регистрируем её в стратегии (base.AddOrder) (обычные заявки регистрируются в стратегии как раньше), а сохраняем её, для отслеживания что она сработала (условие что DerivedOrder != null). Если сработала - прибавляем число контрактов которое сработало по DerivedOrder. У меня вышло вот что:
ActivePosition = PositionManager.Position + GetStopPosition();
(где GetStopPosition (stopOrders - ThreadSafeObservableCollection<Order> из заявок, зарегистрированных в стратегии):)
OrderStates.Active || stopOrder.DerivedOrder.State == OrderStates.Matched let stopVolume = stopOrder.DerivedOrder.Volume - stopOrder.DerivedOrder.Balance let mult = stopOrder.DerivedOrder.Direction == OrderDirections.Buy ? 1 : -1 select stopVolume*mult).Sum(); }
(или не в LINQ варианте: private int GetStopPosition() { int resultStopPosition = 0;
OrderStates.Active || stopOrder.DerivedOrder.State == OrderStates.Matched) { int stopVolume = stopOrder.DerivedOrder.Volume
stopOrder.DerivedOrder.Balance; int mult = stopOrder.DerivedOrder.Direction == OrderDirections.Buy ? 1 : -1; resultStopPosition += stopVolume*mult; } } }
)
Всё верно? Таким образом, никаких MyNewTrades отслеживать не придётся (там ведь ещё надо понимать, какие заявки сгенерированы стратегией, а какие - нет. Всё это, конечно, обходится, но весь вопрос в затратах).
On 2 июл, 12:34, Mikhail Sukhov <msou...@gmail.com> wrote:
Или просто все, не равные null, DerivedOrder от стопов добавлять в стратегию методом base.AddOrder. Они, кстати, проверяются при добавлении на совпадение, т.е. что будет, если добавить одну и туже DerivedOrder заявку через base.AddOrder? Если не проверяются - надо просто хранить список уже добавленных DerivedOrder и проверять при добавлении, что уже не добавили.
On 3 июл, 15:35, Alexander <amukhanch...@gmail.com> wrote:
On 3 июл, 15:35, Alexander <amukhanch...@gmail.com> wrote:
Нет, не проверяются. Недочет, конечно же. Но попробовать с AddOrder стоит.
On 3 июл, 16:04, Alexander <amukhanch...@gmail.com> wrote:
Или через AddOrder, сохраняя все DerivedOrder, которые не равны null. Так даже более интересное решение вышло. =)
Большое спасибо за такую всестороннюю поддержку! С нетерпением жду новой версии. =)
On 5 июл, 13:54, Mikhail Sukhov <msou...@gmail.com> wrote:
Alexander, к какому конечному решению вы пришли при подсчете активной позиции для стратегии? И что за метод AddOrder? Не нашел такого...
AddOrder благополучно исчез в одной из версий. http://stocksharp.com/doc/help/html/a8159c99-256b-46e4-80fe-7cf92944b4c9.htm Теперь используется Strategy.RegisterOrder