order.State
Atom Ответить
25.05.2010


Почему то всегда возвращает None..хотя состояние меняется..в чём может
быть дело?

Теги:


Спасибо:




41 Ответов
< 1 2 
Alexander

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


Пошёл дальше в исследовании - у меня создаётся 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 =

QuikStopConditionTypes.
StopLimit,
StopPrice = stopPrice,
}
};
Trader.RegisterOrder(stopOrder);
base.AddOrder(stopOrder);

On 1 июл, 12:53, Mikhail Sukhov <msou...@gmail.com> wrote:

Спасибо:

Mikhail Sukhov

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


А сколько реально должно быть сделок? И плюс, ты Вы в курсе, что
сделки по стоп заявки быть не должно, только по производной?

On 1 июл, 13:57, Alexander <amukhanch...@gmail.com> wrote:

Спасибо:

Mikhail Sukhov

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


Ок, а стоп был с каким направлением? Тоже на шорт или на защиту шорта
(тоесть лонг)?

On 1 июл, 13:29, Alexander <amukhanch...@gmail.com> wrote:

Спасибо:

Alexander

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


По поводу производной не понял.
Я поставил стоп на покупку как видно из текста, т.е. на защиту шорта.
Он выставился в систему и уже сработал.

Реально не знаю сколько должно сделок, я хочу, регистрируя в стратегии
сделку и получая состояние что она исполнена - получить в
PositionManager.Position для данной стратегии столько лотов, сколько у
меня было открыто в сделке. Или логика другая?

On 1 июл, 14:09, Mikhail Sukhov <msou...@gmail.com> wrote:

Спасибо:

Alexander

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


Идей пока нет, куда можно дальше копать?

Попутно наткнулся на такой эксепшен при попытке вызвать
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, Action`1 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:

Спасибо:

Mikhail Sukhov

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


А стоп заявку потом как-нибудь передавали в стратегию? Могли бы Вы еще
посмотреть на все свои сделки в системе (ITrader.GetMyTrades(sec)). По
ним какая позиция возвращается?

On 1 июл, 14:13, Alexander <amukhanch...@gmail.com> wrote:

Спасибо:

Alexander

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


Стоп заявку обязательно передавал в стратегию с помощью base.AddOrder.
Вот прям кусок кода:

var stopOrder = new Order
{

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[]
{
stopPrice
});

On 2 июл, 02:38, Mikhail Sukhov <msou...@gmail.com> wrote:

Спасибо:

Mikhail Sukhov

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


Готов сразу огорчить - Strategy не умеет работать со стоп заявками. Не
делал я в них поддержку - как то все собствеными эмуляциями обходился.
Пока не уверен, есть ли время для фикса, так что давайте будем искать
пути обхода. Как вариант, расчитывать позицию самостоятельно, через
событие ITrader.NewMyTrades. Стоп заявки ессесно где-то сохранять
нужно, и смотреть появление производной заявки. Кстати, Вы написали,
что не поняли, что это такое. Это

https://stocksharp.ru/doc/help/html/P_Ecng_Trading_BusinessEntities_O...


On 2 июл, 02:47, Alexander <amukhanch...@gmail.com> wrote:

Спасибо:

Alexander

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


Жаль, буду тогда руками считать, да.
неправильный подсчёт позиции через PositionManager ушёл, когда изменил
логику, как отписался в соседнем топике, спасибо.

On 2 июл, 12:34, Mikhail Sukhov <msou...@gmail.com> wrote:

Спасибо:

Alexander

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


Михаил, хорошая кстати задачка получилась - посчитать активную позицию
для стратегии. =)
Я пока пришёл к такому варинту, если не прав в рассуждениях -
исправьте, пожалуйста.

PositionManager для стратегии может работать только с заявками,
стопзаявки не учитываются. Поэтому активная позиция в стратегии равна
PositionManager.Position + <число контрактов, сработавших по стопу>.
Для этого при выставлении стоп заявки мы не регистрируем её в
стратегии (base.AddOrder) (обычные заявки регистрируются в стратегии
как раньше), а сохраняем её, для отслеживания что она сработала
(условие что DerivedOrder != null). Если сработала - прибавляем число
контрактов которое сработало по DerivedOrder.
У меня вышло вот что:

ActivePosition = PositionManager.Position + GetStopPosition();

(где 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:

Спасибо:

Alexander

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


Или просто все, не равные null, DerivedOrder от стопов добавлять в
стратегию методом base.AddOrder.
Они, кстати, проверяются при добавлении на совпадение, т.е. что будет,
если добавить одну и туже DerivedOrder заявку через base.AddOrder?
Если не проверяются - надо просто хранить список уже добавленных
DerivedOrder и проверять при добавлении, что уже не добавили.

On 3 июл, 15:35, Alexander <amukhanch...@gmail.com> wrote:

Спасибо:

Mikhail Sukhov

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


1. Открыл для себя let конструкцию. Или это не C#?
2. Думаю, стоит проверять лишь на stopOrder.DerivedOrder != null.
3. Я бы подписался еще и на StopOrdersChanged. Вот там бы дожидался
stopOrder.DerivedOrder != null после чего подсчитывал бы позицию уже
по обычной заявке.

On 3 июл, 15:35, Alexander <amukhanch...@gmail.com> wrote:

Спасибо:

Mikhail Sukhov

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


Нет, не проверяются. Недочет, конечно же. Но попробовать с AddOrder
стоит.

On 3 июл, 16:04, Alexander <amukhanch...@gmail.com> wrote:

Спасибо:

Alexander

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


1) Это LINQ запрос был =) Порой на нём проще что-то написать. "let a =
b" == "пусть далее в запросе a равно b"
2) Т.е. дополнительно проверять State не стоит? Это пока я посылаю
стоп заявки по маркету на фортсе (по цене верхнего или нижнего
лимита), потом может измениться на лимитные цены, потому вроде стоит
проверять в любом случае.
3) Попробую для начала сделать как расписал - внутри стратегии
отслеживать, а не через событие. Т.к. у меня к каждому счёту приписана
своя отдельная стратегия (т.е. одна стратегия может быть приписана
нескольким счетам) - так будет пока проще.

Или через AddOrder, сохраняя все DerivedOrder, которые не равны null.
Так даже более интересное решение вышло. =)

Большое спасибо за такую всестороннюю поддержку! С нетерпением жду
новой версии. =)

On 5 июл, 13:54, Mikhail Sukhov <msou...@gmail.com> wrote:

Спасибо:

Dmitriy Klimov

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


Alexander, к какому конечному решению вы пришли при подсчете активной позиции для стратегии? И что за метод AddOrder? Не нашел такого...
Спасибо:

Mikhail Sukhov

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


Dmitriy Klimov
Alexander, к какому конечному решению вы пришли при подсчете активной позиции для стратегии? И что за метод AddOrder? Не нашел такого...


AddOrder благополучно исчез в одной из версий. https://stocksharp.ru/do...e4-80fe-7cf92944b4c9.htm Теперь используется Strategy.RegisterOrder
Спасибо:
< 1 2 

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

loading
clippy