← Back

ActionStrategy() и свечи

Для работы со свечками в ActionStrategy доступны

NewCandle(CandleToken) 
Changed(Candle, ICandleManager) 
Finished(Candle, ICandleManager)

А как получить доступ к _candleManager.CandlesFinished() ? т.е. как вызывать Action каждый раз по окончанию свечи ? Я делаю так:

When(_candleToken.NewCandle()).Do(delegate() 
{ 
     var finishedCandle = _candleManager.GetTimeFrameCandles(Security, _timeFrame, 2).FirstOrDefault(); 
}).MakePeriodical();

Но это явно не джедайский подход, хотелось бы что-то поэлегатнее, в идеале в духе _candleManager.CandlesFinished() - чтобы сразу получать список законченных свечек и работать с ними как-то так:

When(_candleToken.NewCandleFinished()).Do(Action(Candle newCandle); 

Comments (18)

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

Mikhail Sukhov
Mikhail Sukhov

valenock: хотелось бы что-то поэлегатнее, в идеале в духе _candleManager.CandlesFinished() - чтобы сразу получать список законченных свечек и работать с ними как-то так:

When(_candleToken.NewCandleFinished()).Do(Action(Candle newCandle);


Хороший фича реквест. В 3.2.1 добавлю.
Alex Ander
Alex Ander

Как передать в метод OnCandlesFinished сформированные свечи?


this
    .When(_candleToken.CandlesFinished())
    .Do(OnCandlesFinished);

Mikhail Sukhov
Mikhail Sukhov

Alex Ander: Как передать в метод OnCandlesFinished сформированные свечи?

this .When(_candleToken.CandlesFinished()) .Do(OnCandlesFinished);


```csharp

this
    .When(_candleToken.CandlesFinished())
    .Do<IEnumerable<Candles>>(OnCandlesFinished);

Alex Ander
Alex Ander

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

            this
                .When(_сandleToken.CandlesFinished())
                .Do<IEnumerable<Candle>>(OnCandlesFinished);

Второе событие вызывается отлично. А первое - ни разу не вызвалось. Оно должно вызываться при каждом изменении цены инструмента?

Mikhail Sukhov
Mikhail Sukhov

Alex Ander: А первое - ни разу не вызвалось. Оно должно вызываться при каждом изменении цены инструмента?

При каждом изменении инструмента. А вот кода меняется сам инструмент - вопрос. Если Квик - то он никогда не меняется.

Alex Ander
Alex Ander

В документации http://stocksharp.com/doc/html/8c0327db-494a-4fe0-aba8-0d4b93dea60e.htm есть фрагмент:

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

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

Mikhail Sukhov
Mikhail Sukhov

В документации http://stocksharp.com/doc/html/8c0327db-494a-4fe0-aba8-0d4b93dea60e.htm есть фрагмент:

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

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


Это хеджирование опционов. И есть раздел доки для настройки Квика под опционы. В этом случае изменения будут приходить.
Alex Ander
Alex Ander

Понятно.

Тогда пример: Security.LastTrade.Price = 190000 (фьючерс RIU1) Нужно поставить событие на условие превышения Security.LastTrade.Price уровня 190200.


            this
                .When(Security.LastTradePriceMore(new Unit(200)))// или 190200?
                .Do(MyAction);

Alexander
Alexander

Alex Ander: Понятно.

Тогда пример: Security.LastTrade.Price = 190000 (фьючерс RIU1) Нужно поставить событие на условие превышения Security.LastTrade.Price уровня 190200.

        this
            .When(Security.LastTradePriceMore(new Unit(200)))// или 190200?
            .Do(MyAction);

200
Alex Ander
Alex Ander

Ни так, ни эдак MyAction не запускается. :(

Alexander
Alexander

Наверное не запущен стакан :)

Alex Ander
Alex Ander

Стакан не запущен, но ведь речь идет не про BestBidPriceMore/BestAskPriceMore, а про LastTradePriceMore.

А значение Security.LastTrade.Price меняется синхронно с данными в квике.

Alex Ander
Alex Ander

Включил экспорт стакана


_trader.RegisterQuotes(_strategy.Security);

Ничего не изменилось, события не вызываются.

Mikhail Sukhov
Mikhail Sukhov

Alex Ander: Включил экспорт стакана

_trader.RegisterQuotes(_strategy.Security);

> 
> Ничего не изменилось, события не вызываются.

ITrader.SecuritiesChanged передает измененный инструмент?
Alex Ander
Alex Ander

_trader.Connected += () =>
{

  ...

  _trader.SecuritiesChanged += securities =>
  {
     foreach (var sec in securities) MessageBox.Show(sec.Name);
  };

  ...

};

Тоже ни разу не вызывается и ничего не передается.

Mikhail Sukhov
Mikhail Sukhov

Alex Ander: Тоже ни разу не вызывается и ничего не передается.

Потому что Квик транслирует изменения по таблице, а не по инструменту. В таблице что-то визуально изменяется?

Alex Ander
Alex Ander

Цифры в таблице Квика не меняются. Цвет строки меняется (красный - зеленый) в соответствии с ценой.

Михаил, у меня не вызывается и LastTradePriceMore. Хотя цена последней сделки передается правильно и регулярно. CandlesFinished тоже работает безукоризненно.

Alexander
Alexander

Это особенность квика. SecurityChanged не приходит, т.к. ничего физически в таблице не меняется. В 3.2.5 были изменения немного логики работы, может поможет.

Как вариант - добавить дополнительную колонку с последней ценой инструмента, тогда SecurityChanged приходить будет.