← Back

Посоветуйте как правильно организовать стратегии:

Хочу реализовать такую стратегию:

  1. в зависимости от значания индекса сделать выборку по инструментам для торговли и сформировать несколько списков инструментов

  2. по каждому списку инструментов запустить отдельную стратегию

  3. проверять значение индекса и если нужно переформировать списки инструментов

  4. проверять списки на счет того правильная ли стратегия работает на инструментах в них

Причем позиции , ордера и P/L по всему этому нужно считать как для одной стратегии.

И еще маленький вопрос знатокам C# , как по простому записать в код такое:

есть Collection1 = ThreadSafeObservableCollection<Security> Collection2 = ThreadSafeObservableCollection<Position> Collection3 = ThreadSafeObservableCollection<Security>

если в Collection2 есть позиция с полем Security и в тоже время такой Security нет в Collection1 , то внести эту Security в Collection3 .

Спасибо.

Comments (32)

Login or Create account, Log in or register to leave a comment

lesser
lesser Author

Видно слишком сложный вопрос я задал 🤨 .

Ладно буду думать сам.

Тогда следующий вопрос:

Чтоб создать свою стратегию я должен создавать клас стратегии , или могу просто создать переменную и добавить в нее правила ?

если да тогда как ?

Такое вот я догадался :

        Strategy trade = new Strategy();

        trade.Rules.Add(trade.Security.MarketDepthChanged()); 

а вот как описать что делать когда правило сработает ?

lesser
lesser Author

Кжись нашел сам :

Strategy trade = new Strategy();

trade.Rules.Add(trade.Security.MarketDepthChanged().Do(trade_action));

Так будет правильно ?

lesser
lesser Author

И еще два вопросы :

  1. Можно ли с основной стратегии запустить дочерную стратегию на несколько инструментов ?
  2. можно ли запустить их так что - бы не дожыдатся их завершения . то есть я например передал инстумент дочерней стратегии на котирование но в тоже время реагирую на события основной стратегии.
Ortn
Ortn

lesser: Хочу реализовать такую стратегию:

  1. в зависимости от значания индекса сделать выборку по инструментам для торговли и сформировать несколько списков инструментов

  2. по каждому списку инструментов запустить отдельную стратегию

  3. проверять значение индекса и если нужно переформировать списки инструментов

  4. проверять списки на счет того правильная ли стратегия работает на инструментах в них

Причем позиции , ордера и P/L по всему этому нужно считать как для одной стратегии.

И еще маленький вопрос знатокам C# , как по простому записать в код такое:

есть Collection1 = ThreadSafeObservableCollection<Security> Collection2 = ThreadSafeObservableCollection<Position> Collection3 = ThreadSafeObservableCollection<Security>

если в Collection2 есть позиция с полем Security и в тоже время такой Security нет в Collection1 , то внести эту Security в Collection3 .

Спасибо.

Не знаток C# но как на счет

foreach (var missing_security in Collection2.Where(p => !Collection1.Contains(p.Security))) Collection3.add(missing_security)

Код взял из головы за компилируимость не отвечаю

lesser
lesser Author

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

lesser
lesser Author

Итак сформировали мы список секурити , идем дальше:

есть описана стратегия , теперь надо запустить ее на всех секурити из списка 🤨

Если вот так сделать ? foreach (Security sec in security_list) { var strategy = new MyStrategy(sec) strategy.Start();

             }

Будет работать ?

Alexander
Alexander

lesser: Итак сформировали мы список секурити , идем дальше:

есть описана стратегия , теперь надо запустить ее на всех секурити из списка 🤨

Если вот так сделать ? foreach (Security sec in security_list) { var strategy = new MyStrategy(sec) strategy.Start();

             }

Будет работать ?

А если попробовать? :)

lesser
lesser Author

Alexander Mukhanchikov: А если попробовать? :)

Обязательно попробую :), но нужно ждать до понедельника пока торги стартанут , жалко времени , если так не работает до понедельника еще можна думать как по другому замутить.

Alexander
Alexander

lesser:

Alexander Mukhanchikov: А если попробовать? :)

Обязательно попробую :), но нужно ждать до понедельника пока торги стартанут , жалко времени , если так не работает до понедельника еще можна думать как по другому замутить.

Стратегии стартуют в независимости от наличия или отсутствия торгов на бирже

lesser
lesser Author

lesser: Стратегии стартуют в независимости от наличия или отсутствия торгов на бирже

Моя система не стартует так как список формирует налету, неужто вам так трудно сказать будет такое работать или нет ?

Alexander
Alexander

Alexander Mukhanchikov:

lesser: Стратегии стартуют в независимости от наличия или отсутствия торгов на бирже

Моя система не стартует так как список формирует налету, неужто вам так трудно сказать будет такое работать или нет ?

инструменты получаются как из квика, так из плазы и смарткома даже когда биржа не работает. т.е. этот ваш список сформирован будет.

да, это работать должно

lesser
lesser Author

Спасибо ,

Подскажите , основная стратегия должна ждать пока отработает дочерная ?

Если да, то как сделать чтоб не ждала , видел гдето тему на форуме где писали что должна ждать, но теперь никак не могу найти эту тему.

может нужно запускать дочерние в разных потоках ? или както через GuiAsync ?

Alexander
Alexander

lesser: Спасибо ,

Подскажите , основная стратегия должна ждать пока отработает дочерная ?

Если да, то как сделать чтоб не ждала , видел гдето тему на форуме где писали что должна ждать, но теперь никак не могу найти эту тему.

может нужно запускать дочерние в разных потоках ? или както через GuiAsync ?

Цитата из документации

Родительская и все ее дочерние стратегии исполняются параллельно.

lesser
lesser Author

Спасибо , успокоили :)

lesser
lesser Author

Второой день себе голову ломаю, как получить мои активные заявки по инструменту ? может через стакан както можна а то var orderbuy = _trader.Orders.Where(o => o.Security == securi && o.Direction == OrderDirections.Buy && o.State == OrderStates.Active);

получается неактуальная инфа :(

Alexander
Alexander

lesser: Второой день себе голову ломаю, как получить мои активные заявки по инструменту ? может через стакан както можна а то var orderbuy = _trader.Orders.Where(o => o.Security == securi && o.Direction == OrderDirections.Buy && o.State == OrderStates.Active);

получается неактуальная инфа :(

пример неактуальной инфы приведите

lesser
lesser Author

Если так сделать :

        var quotes_Ask =  stakan.GetQuotes(OrderDirections.Buy);
        var quotes_Ask_w_my = stakan.GetFilteredQuotes(OrderDirections.Buy,null);

То потом как вычислить есть ли там мои заявки ?

quotes_Ask = quotes_Ask_w_my ?

lesser
lesser Author

Почему у меня не срабатывает такое правило основной стратегии :

MainSystem.Rules.Add(MainSystem.Security.Changed().Do(Strategy1));

Причем все другие правила срабатывают нормально.

Основную стратегию не описывал отдельным классом потому что не могу понять как отуда что-то выводить в окошка программы.

lesser
lesser Author

Пробовал соорудить скальпера и ордера по инструменту определять с помощью _trader.Orders...

но видно ордера в нем не успевают так быстро обновлятся и мой бот засылал столько заявок подряд что даже после его виключения заявки все еще шли :)

как я понял это все из за запаздывания регистрации ордеров .

Уде придумал новый алгоритм для работы , спасибо.

Посмотрите, плиз, на последний мой вопрос в этой теме.

Alexander
Alexander

lesser: Пробовал соорудить скальпера и ордера по инструменту определять с помощью _trader.Orders...

но видно ордера в нем не успевают так быстро обновлятся и мой бот засылал столько заявок подряд что даже после его виключения заявки все еще шли :)

как я понял это все из за запаздывания регистрации ордеров .

Уде придумал новый алгоритм для работы , спасибо.

Посмотрите, плиз, на последний мой вопрос в этой теме.

Приведите подробнее данный кусок кода. непонятно что есть что

lesser
lesser Author

Подскажите, плиз, почему может не срабатывать такое правило :

MainSystem.Rules.Add(MainSystem.Security.Changed().Do(Step1));

lesser
lesser Author

Непойму , я как то неправильно задал вопрос , или на него так трудно ответить ?

Секурити стратегии изменяется постоянно но событие не срабативает , знаю по том что поставил точку остановки в функции которую вызивает событие и есче ни разу программа не останавливалась .

esper
esper

Что такое MainSystem? Как создается и инициализируется?

lesser
lesser Author

Strategy MainSystem = new Strategy();

        MainSystem.Security = sec;
        MainSystem.Trader = _trader;
        MainSystem.Portfolio = account;
        MainSystem.RemoveChildStrategies = true;

        MainSystem.Rules.Add(MainSystem.Security.Changed().Do(Step1));

        MainSystem.Rules.Add(MainSystem.Started().Do(StartTrade));
        MainSystem.Rules.Add(MainSystem.Stopping().Do(StopTrade));


        MainSystem.Start();
esper
esper

Секурити стратегии изменяется постоянно Как смотрите что оно меняется?

lesser
lesser Author

ето фьючерс...

стоп , вы имеете в виду что это событие произойдет когда я сделаю MainSystem.Security = sec1;

какже мне вызвать событие когда просто цена sec изменится ?

esper
esper

lesser: стоп , вы имеете в виду что это событие произойдет когда я сделаю MainSystem.Security = sec1; Нет, установка инструмента для стратегии не вызывает это событие. Это событие вызывается когда меняются данные в таблице инструментов, они у вас меняются?

lesser
lesser Author

но в примере записано :

а также правило на событие изменения фьючерсного контракта (его цены):

this .When(base.Security.Changed()) .Do(ReHedge);

lesser
lesser Author

Делаю ,

_trader.NewTrades += trades => this.GuiAsync(() =>

this.Instrument.Text = sec.LastTrade.Price.ToString();

Значение в текстовом поле програмки меняется

esper
esper

LastTrade.Price, скорее всего, берется из Таблицы всех сделок, а не из инструментов. Какие настройки у таблицы инструменты? Если в ней только стандартные столбцы, то событие вызываться не будет.

lesser
lesser
lesser Author

В таблице инструментов которая идет в настройках последней версии S# брал те что для опционов вобше нету поля последняя цена :( но все таки в примере Sample в таблице инструментов последняя сделка видна :)

lesser
lesser Author

Я понял, спасибо , попробую через : MainSystem.Security.LastTradePriceLess и море .