← Назад

Вопрос по MarketQuotingStrategy

Добрый день! Помогите, пожалуйста, разобратьяс с MarketQuotingStrategy. Пытаюсь продать или купить фьючерс "по рынку", но не очень понимаю механизма. Что необходимо сделать для запуска этого механизма? У меня есть вот такой код:

Ecng.Trading.Algo.Strategies.MarketQuotingStrategy strategy = new Ecng.Trading.Algo.Strategies.MarketQuotingStrategy(order, new Ecng.Trading.BusinessEntities.Unit(), new Ecng.Trading.BusinessEntities.Unit()); strategy.IsForts = true; strategy.Interval = TimeSpan.FromTicks(1); strategy.PriceType = Ecng.Trading.Algo.MarketPriceTypes.Opposite; strategy.PriceDelta = 50; ChildStrategies.Add(strategy); strategy.Start();

но заявки не создаются

регистрацию квотирования включил trader.RegisterQuotes(_Security);

Заранее благодарю за ответ!

Комментарии (16)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

ustas
ustas

а сам orderопределён ?

Артем
Артем Автор

Добрый день!

Сам ордер определен в классе, производном от ActionStrategy... 🤨 Все перепробовал, никак не запускается...

ustas
ustas

А Вы хотите запустить котирование с какими параметрами?

priceExchange и priceDelta создаёте, но значения Value не заданы.

И выведите лог стратегии что там ?

Артем
Артем Автор

Добрый день! Благодарю за помощь!

А Вы хотите запустить котирование с какими параметрами?

  • пока с любыми, пытаюсь разобраться с механизмом. не очень понимаю что делают PriceEchange, PriceDelta. Работаю с фьючерсом РТС

priceExchange и priceDelta создаёте, но значения Value не заданы.

  • А где находятся Value, и для какого объекта их нужно устанавливать? И выведите лог стратегии что там ?
  • Вывел лог для MarketQuotingStrategy (строка strategy.Log +=strategy_Log), - выводится только сообщение о запуске:

StrategyName: MQS; errorState: None; msg: Стратегия запущена.

Ниже привожу еще раз код, который я пишу... - Начиная, от определения Ордера, кончая запуском MarketQuotingStrategy. Подскажите, пожалуйста, что нужно сделать (какие корректировки внести, с какой целью), чтобы MarketQuotingStrategy стала формировать заявки.

  1. Определение ордера в классе, производном от ActionStrategy

Ecng.Trading.BusinessEntities.Order order = CreateOrder(Ecng.Trading.BusinessEntities.OrderDirections.Buy, _Security.LastTrade().Price, volume);

  1. Регистрация по рынку

order.ExtensionInfo = new Dictionary<Object, Object>(); order.ExtensionInfo.Add(Ecng.Trading.Quik.DdeOrderColumns.ClientCode, ClientCode);

        SlippageManager.RegisterSlippage(order);
        
        Ecng.Trading.Algo.Strategies.MarketQuotingStrategy strategy = new Ecng.Trading.Algo.Strategies.MarketQuotingStrategy(order, new Ecng.Trading.BusinessEntities.Unit(), new Ecng.Trading.BusinessEntities.Unit());
        strategy.IsForts = true;
        strategy.Interval = TimeSpan.FromTicks(1);
        strategy.PriceType = Ecng.Trading.Algo.MarketPriceTypes.Opposite;
        strategy.PriceDelta = 50;
        strategy.IsParallel = true;
        strategy.PriceExchange = 5;
        strategy.Log +=strategy_Log;
        ChildStrategies.Add(strategy);

        strategy.Start();
Mikhail Sukhov
Mikhail Sukhov

Артем: И выведите лог стратегии что там ?

  • Вывел лог для MarketQuotingStrategy (строка strategy.Log +=strategy_Log), - выводится только сообщение о запуске:

StrategyName: MQS; errorState: None; msg: Стратегия запущена.

А класс StrategyManager где нибудь используете?

Артем
Артем Автор

Да, базова стратегия _MyStrategy(из которой запускаю квотирование) предварительно добавлена в strategyManager

strategyManager.Register(_MyStrategy, portfolio, _Security);

Но я не использую метод OnProcess, не знаю может быть это важно... У меня в классе _MyStrategy есть метод Process, который я вызываю при появлении новой сделки по инструменту. У меня нет необходимости в итерационной обработке. В справке написано, что strategy.Start(); не нужно вызывать, т.к. есть автоматическая связка с классом-родителем. Но поскольку я не использую strategy OnProcess, вызываю strategy.Start(); принудительно

Mikhail Sukhov
Mikhail Sukhov

Артем: Да, базова стратегия _MyStrategy(из которой запускаю квотирование) предварительно добавлена в strategyManager

strategyManager.Register(_MyStrategy, portfolio, _Security);

Но я не использую метод OnProcess, не знаю может быть это важно... У меня в классе _MyStrategy есть метод Process, который я вызываю при появлении новой сделки по инструменту. У меня нет необходимости в итерационной обработке. В справке написано, что strategy.Start(); не нужно вызывать, т.к. есть автоматическая связка с классом-родителем. Но поскольку я не использую strategy OnProcess, вызываю strategy.Start(); принудительно

Если родительская стратегия не работает, то и дочерняя так же не будет работать.

Таким образом, вызывать метод Strategy.Start() можно только для тех стратегий, которые являются корневыми (Strategy.ParentStrategy равен null).

Артем
Артем Автор

Сделал запуск базовой стратегии прямо в конструкторе, сам метод OnProcess переопределил с вечным состоянием Continue. Теперь в логе видно, что дочерние стратегии стали выполняться и что-то пытаться делать. Но у всех возникает ошибка "Коллекция котировок пуста", в стакане дофигища всяческих котировок. Подскажите, пожалуйста, что не так делаю? Стакан:

  1. Ошибка Name: MQS; errorState: Error; msg: System.ArgumentException: Коллекция котировок пуста. Имя параметра: quotes в Ecng.Trading.Algo.TraderHelper.GetFilteredQuotes(IEnumerable`1 quotes, Order currentOrder) в Ecng.Trading.Algo.TraderHelper.GetFilteredQuotes(MarketDepth depth, OrderDirections orderDirection, Order currentOrder) в Ecng.Trading.Algo.TraderHelper.GetFilteredQuotes(Security security, OrderDirections orderDirection, Order currentOrder) в Ecng.Trading.Algo.Strategies.MarketQuotingStrategy.GetNewPrice() в Ecng.Trading.Algo.Strategies.QuotingStrategy.OnProcess() в Ecng.Trading.Algo.Strategies.Strategy.#=qiRcAHlpbxRjZjyUrS0Iw1A==()

  2. запуск базовой стратегии public NazarActionStrategy() { this.PnLManager.Init(); this.PositionManager.Init(); this.Log += strategy_Log;

         this.Interval = TimeSpan.FromTicks(1);
         this.Start();
    
     }
    

protected override Ecng.Trading.Algo.Strategies.StrategyProcessResults OnProcess() { return Ecng.Trading.Algo.Strategies.StrategyProcessResults.Continue; }

Mikhail Sukhov
Mikhail Sukhov

Артем: Сделал запуск базовой стратегии прямо в конструкторе, сам метод OnProcess переопределил с вечным состоянием Continue. Теперь в логе видно, что дочерние стратегии стали выполняться и что-то пытаться делать. Но у всех возникает ошибка "Коллекция котировок пуста", в стакане дофигища всяческих котировок. Подскажите, пожалуйста, что не так делаю?

Стакан:

Вот он как раз и нужен для котирования. Экспортируете его?

ustas
ustas

Артем: ... protected override Ecng.Trading.Algo.Strategies.StrategyProcessResults OnProcess() { return Ecng.Trading.Algo.Strategies.StrategyProcessResults.Continue; }

похоже я на эти грабли уже наступал

надо

protected override StrategyProcessResults OnProcess()
{
    base.OnProcess();
   return StrategyProcessResults.Continue;
}
Артем
Артем Автор

Да, стакан экспортирую... самым первым делом сделал trader.RegisterQuotes(_Security);

Артем
Артем Автор

Последние 10 сообщений(В обратном порядке) ustas Дата: 7 декабря 2010 г. 11:26:21 Артем написал:

... protected override Ecng.Trading.Algo.Strategies.StrategyProcessResults OnProcess() { return Ecng.Trading.Algo.Strategies.StrategyProcessResults.Continue; }

похоже я на эти грабли уже наступал

надо

Цитата: protected override StrategyProcessResults OnProcess() { base.OnProcess(); return StrategyProcessResults.Continue; }

Нет, к сожалению, не помогло... Стакан мне кажется не читается... Экспорт по DDE запущен, котировки идут, но коллекция пустая... Не пойму почему

Артем
Артем Автор

попробовал сделать обработку QuotesChanged, но событие никогда не срабатывает, хотя стакан меняется.🤨

После этого кода, лог не выводится

trader.RegisterQuotes(_Security);

trader.QuotesChanged += (marketDepth) => { Globals.Сообщить(marketDepth.Last().BestAsk.ToString(),Globals.СтатусСообщения.Инфо); };

ustas
ustas

Артем: попробовал сделать обработку QuotesChanged, но событие никогда не срабатывает, хотя стакан меняется.🤨

После этого кода, лог не выводится

trader.RegisterQuotes(_Security);

trader.QuotesChanged += (marketDepth) => { Globals.Сообщить(marketDepth.Last().BestAsk.ToString(),Globals.СтатусСообщения.Инфо); };

А _Security то само заполняется? Verifier не ругается?

Артем
Артем Автор

А _Security то само заполняется? да, заполнено.

Перед регистрацией квотирования стоит проверка if (_Security != null) {trader.RegisterQuotes(_Security);

trader.QuotesChanged += (marketDepth) => { Globals.Сообщить(marketDepth.Last().BestAsk.ToString(),Globals.СтатусСообщения.Инфо); }; }

Verifier не ругается?

  • я скрин-шот приложил, как стакан выглядит... Я сейчас пытаюсь понять как в Verifier стакан проверить
Артем
Артем Автор

Стакан починил... Нужно, чтобы в нем были только колонки Продажа-Цена-Покупка... У меня были перед этими ключевыми колонками еще вские разные добавлены, поэтому событие не срабатывало. После этого котирование тоже заработало. Всем огромнейшее спасибо!