MarketDepthsChanged !!!

MarketDepthsChanged !!!
Atom
12/27/2012
Tik_Time


Добрый вечер. Помогите разобраться вот с чем. Как подписаться на изменения котировок конкретного стакана? Событие MarketDepthsChanged - подписывается на изменение последнего зарегистрированного стакана. А если я зарегистрировал их несколько (к примеру 3) как подписаться на изменение котировок 2-ого стакана? Или придется 2-ой стакан снова регистрировать и к нему уже подвязываться? Как, к примеру, через Trader.MarketDepthsChanged += Changeddepths подписаться на изменение котировок нужного стакана, а не последнего?


Tags:


Thanks:


< 1 2 3  >
Геннадий Ванин (Gennady Vanin)

Avatar
Date: 1/8/2013
Reply


Творог: Подскажите как правильно прочитать данное выражение из примера: Trader.MarketDepthsChanged += depths => this.GuiAsync(() => OnMarketDepthsChanged(depths)); Установите себе триал ReSharper (JetBrains) и, тогда, Вам будет видно, что:

  • при наведении мышки на GuiAsync()выдаётся описание:

(extension) viod DispatcherObject.GuiAsync(Action action) Что выражения:

  • ODE0�
  • ODE1�
  • ODE2�
  • ODE3�
  • и т.д., и т.п. эквивалентны

Пронавигировав по "Go To Implementation" к GuiAsync(), что он определён в в Ecng.Xaml.XamlHelper, как :

public static void GuiAsync(this DispatcherObject obj, Action action)
{
  if (obj == null)
    throw new ArgumentNullException("obj");
  XamlHelper.GuiAsync(obj.Dispatcher, action);
}
//==============================================
public static void GuiAsync(this Dispatcher dispatcher, Action action)
{
  XamlHelper.GuiAsync(dispatcher, action, DispatcherPriority.Normal);
}
//==============================================
public static void GuiAsync(this Dispatcher dispatcher, Action action, DispatcherPriority priority)
{
  if (dispatcher == null)
    throw new ArgumentNullException("dispatcher");
  if (action == null)
    throw new ArgumentNullException("action");
  if (dispatcher.CheckAccess())
     action();
  else
    dispatcher.BeginInvoke((Delegate) action, priority, new object[0]);
}
Thanks:

Творог

Avatar
Date: 1/9/2013
Reply


Спасибо за наводку, ReSharper поставил.

Но я не вижу где объявляется depths, что он содержит, что возвращает. Это делегат? Почему дважды повторяется оператор => ? Сначала отправляются пустые параметры () => OnMarketDepthsChanged(depths), а потом всё остальное? Какая цепочка выполнения?

Thanks:

Den

Avatar
Date: 1/9/2013
Reply


Геннадий Ванин (Gennady Vanin): Пронавигировав по "Go To Implementation" к GuiAsync(), что он определён в в Ecng.Xaml.XamlHelper, как :

public static void GuiAsync(this DispatcherObject obj, Action action) { if (obj == null) throw new ArgumentNullException("obj"); XamlHelper.GuiAsync(obj.Dispatcher, action); }


А откуда у вас решарпер сорцы берет? У меня он только до **декларации**по "Go To **Implementation**" доходит... )))
Thanks:

Геннадий Ванин (Gennady Vanin)

Avatar
Date: 1/9/2013
Reply


Творог: Спасибо за наводку, ReSharper поставил.

Но я не вижу где объявляется depths, что он содержит, что возвращает. Это делегат? Почему дважды повторяется оператор => ? Сначала отправляются пустые параметры () => OnMarketDepthsChanged(depths), а потом всё остальное? Какая цепочка выполнения? Я Вам удочку дал (ReSharper или R#), а Вы продолжаете требовать рыбу...

Первое depth - согласно контекстной подсказке - (parameter) IEnumerable <MarketDepth> Объявляется он в Вашей строчке и определяется компилятором из контексту - по синтакису выражения и используемых в них типах

В частности событием, которое, опять же можно посмотреть через R#, определяется в StockSharp.Algo.BaseTrader:

public virtual event Action<IEnumerable<MarketDepth>> MarketDepthsChanged
{
}

Посм., что такое Action, Event, Event Handler, delegate

Можете ничего не писать дважды, написав, для прикола:

object depths2 = null;
Trader.MarketDepthsChanged += depths => OnMarketDepthsChanged(depths2);
private void OnMarketDepthsChanged(object whatEver)
{
    throw new NotImplementedException();
}

и вообще не использовать лямбда-выражения!

Возвращаясь к Вашему выражению, пишите в коде изначальное

Trader.MarketDepthsChanged += whatEver => this.GuiAsync(() => OnMarketDepthsChanged(whatEver));
//вставляете, используя ReSharper, реализацию OnMarketDepthsChanged() 
private void OnMarketDepthsChanged(IEnumerable<MarketDepth> asfsdf)
{
    throw new NotImplementedException();
}

Разворачиваете, используя ReSharper, рядом стоящие закомментированные строчки - эквивалентны:

Trader.MarketDepthsChanged += whatEver => this.GuiAsync(() => OnMarketDepthsChanged(whatEver));

в

Trader.MarketDepthsChanged += OnTraderOnMarketDepthsChangedOrWhatEver;
private void OnTraderOnMarketDepthsChangedOrWhatEver(IEnumerable<MarketDepth> whatEver)
{
//расскомментировать любую строчку - они эквивалентны
    //this.GuiAsync(() => OnMarketDepthsChanged(whatEver));

    //XamlHelper.GuiAsync(this, () => OnMarketDepthsChanged(whatEver));

    //XamlHelper.GuiAsync(this, delegate { OnMarketDepthsChanged(whatEver); });
}

Так понятнее?

Thanks:

Геннадий Ванин (Gennady Vanin)

Avatar
Date: 1/9/2013
Reply


Den: А откуда у вас решарпер сорцы берет? У меня он только до декларациипо "Go To Implementation" доходит... ))) М.б., это и не ReSharper, давно пользуюсь, не помню, что откуда берётся... У меня ещё и .NET Reflector установлен

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

Thanks: Den

Moadip

Avatar
Date: 1/10/2013
Reply


Den: А откуда у вас решарпер сорцы берет? У меня он только до декларациипо "Go To Implementation" доходит... )))

При первом переходе по Ctrl + LeftMouse появится окошко с предложением и предупреждением.[smile] Соглашаемся. #R скачает какую-то примочку с сайта. После этого будет декомпилить.

Thanks: Геннадий Ванин (Gennady Vanin) Den

Den

Avatar
Date: 1/10/2013
Reply


Moadip: При первом переходе по Ctrl + LeftMouse появится окошко с предложением и предупреждением.[smile] Соглашаемся. #R скачает какую-то примочку с сайта. После этого будет декомпилить.

Он может даже ничего и не качает, а просто предупреждает, что не обязывает нас пользоваться декомпиллятором, и это все на нашей ответственности... [smile]

Все заработало, спасибо!

Thanks:

Творог

Avatar
Date: 1/11/2013
Reply


А почему в разделе SS API нет подраздела с описанием класса XamlHelper? Ведь там же, наверное, должно быть подробное описание, что такое GuiAsync и что за конструкции, где дважды передаются параметры в обработчик знаком =>.

Я правильно понимаю, что GuiAsync() - это метод, куда в качестве аргумента передаётся поток, который должен идти в порядке очереди, а не параллельно?

Thanks:

Moadip

Avatar
Date: 1/11/2013
Reply


А почему в разделе SS API нет подраздела с описанием класса XamlHelper? Где то я подобный вопрос уже видел.[smile]

Полный путь для XamlHelper - Ecng.Xaml.XamlHelper. Описание API есть только для основных библиотек- Stocksharp.

Посмотрите сколько библиотек начинается с Ecng и сколько там классов.

Конечно если бы кто то взялся чтобы сделать описание, было бы круто.

Thanks:

VassilSanych

Avatar
Date: 1/11/2013
Reply


Творог: Я правильно понимаю, что GuiAsync() - это метод, куда в качестве аргумента передаётся поток, который должен идти в порядке очереди, а не параллельно?

GuiAsync() оборачивает Dispatcher.BeginInvoke(), добавляя всякие ненужные проверки :) А тот в свою очередь синхронизирует текущий поток с потоком отрисовки GUI, потому что в Windows издревле GUI программы может работать только в одном потоке.

Thanks:
< 1 2 3  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy