﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.ru/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.ru/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Общий вопрос по реализации Индикаторов</title>
  <id>~/topic/2682/obshshii-vopros-po-realizatsii-indikatorov/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-06-27T15:30:16Z</updated>
  <logo>https://stocksharp.ru/images/logo.png</logo>
  <link href="https://stocksharp.ru/handlers/atom.ashx?category=topic&amp;id=2682" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.ru/posts/m/19002/</id>
    <title type="text">**Кот Матроскин:**В продолжение темы: Как правильно кормить индикаторы? Тот же ChaikinVolatility дел...</title>
    <published>2012-05-12T14:39:20Z</published>
    <updated>2012-05-12T14:39:20Z</updated>
    <author>
      <name>VoDA</name>
      <uri>https://stocksharp.ru/users/27725/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;**&lt;a href="@message(19000)" rel="nofollow" target="_blank"&gt;Кот Матроскин&lt;/a&gt;:**В продолжение темы:
Как правильно кормить индикаторы?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Тот же ChaikinVolatility делает input.GetValue&amp;lt;Candle&amp;gt;();
А ExponentialMovingAverage - input.GetValue&amp;lt;decimal&amp;gt;();
Оба в момент обработки входных данных.&lt;/p&gt;
&lt;p&gt;Рассмотрим пример IndicatorsManager.cs из IndicatorsXaml.&lt;/p&gt;
&lt;p&gt;Если есть общий список индикторов, то в момент их вызова (функция public void AddPoint(TimeFrameCandle candle))
Придется проверять типы этих индикторов, чтобы понять в каком виде им нужно предоставить Сandle.&lt;/p&gt;
&lt;p&gt;Именно поэтому часть кода закомментирована - тот же SimpleMovingAverage просто не работает с данным кодом.&lt;/p&gt;
&lt;p&gt;Я правильно понимаю, что единственный выход в данной ситуации это вереница if с проверкой какого типа индикатор и конвертацией Candle в подходящий для индикатора тип?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/19001/</id>
    <title type="text">Кот Матроскин: Поясни: что значит &amp;quot;могут не отрабатывать контракт&amp;quot; почему input не должен быть decim...</title>
    <published>2012-05-12T14:28:50Z</published>
    <updated>2012-05-12T14:28:50Z</updated>
    <author>
      <name>VoDA</name>
      <uri>https://stocksharp.ru/users/27725/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(19000)" rel="nofollow" target="_blank"&gt;Кот Матроскин&lt;/a&gt;:&lt;/strong&gt;
Поясни:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;что значит &amp;quot;могут не отрабатывать контракт&amp;quot;&lt;/li&gt;
&lt;li&gt;почему input не должен быть decimal&lt;/li&gt;
&lt;li&gt;каким &amp;quot;контрактом на EMA это не регламентировано&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Контракт это соглашение о том какие параметры должны обрабатываться методом или объектом. Все интерфейсы и базовые классы - это своего рода контракты для реализующих их классов. В данном случае линия наследования ExponentialMovingAverage:LengthIndicator, LengthIndicator:BaseIndicator, BaseIndicator:IIndicator показывает, что EMA должен отрабатывать все вызовы, которые присутствуют в IIndicator.&lt;/p&gt;
&lt;p&gt;В IIndicator есть Process, который принимает IIndicatorValue. Т.е. любой потомок IIndicator должен обработать все, что есть IIndicatorValue.
Я создаю new CandleIndicatorValue(new TimeFrameCandle...), который по наследования является IIndicatorValue.&lt;/p&gt;
&lt;p&gt;Почему при передаче валидного IIndicatorValue в метод Process летит Эксепшен?&lt;/p&gt;
&lt;p&gt;Теперь по пунктам:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;при передаче IIndicatorValue в метод Process класса EMA вылетает Эксепшен. ИМХО если метод принимает параметер определенного типа (тип прописан в сигнатуре), то он должен его обработать.&lt;/li&gt;
&lt;li&gt;input может быть IIndicatorValue содержащим decimal, а может быть IIndicatorValue содержащим любой другой тип, который захотел программист.&lt;/li&gt;
&lt;li&gt;IIndicator разрешает любой IIndicatorValue.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Решения с точки зрения программирования:
Если IIndicatorValue должен как то приводиться к decimal, то ИМХО стоит сделать метод public decimal ConvertToDecimal(), где все типы должны приводиться самим создателем наследника от IIndicatorValue.
Если не все IIndicatorValue приводимы к decimal, то ИМХО стоит выделить приводимые к decimal в наследника IIndicatorValue. А методы типа IIndicatorValue Process(IIndicatorValue input); заменить на этого наследника для всех приводимых к decimal типов.&lt;/p&gt;
&lt;p&gt;Вероятно, я не до конца понимаю объектную модель индикаторов 
Пока смотрел исходники появилась еще одна идея - типизировать сам IIndicator, а в наследниках указывать какие именно типа объектов может принимать Process. Возможно это тоже сможет упростить дело.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/19000/</id>
    <title type="text">VoDA: Всем доброго дня ))) Вопрос такой: почему индикаторы сделаны через дженерики таким образом, чт...</title>
    <published>2012-05-12T13:55:11Z</published>
    <updated>2012-05-12T13:55:11Z</updated>
    <author>
      <name>Кот Матроскин</name>
      <uri>https://stocksharp.ru/users/808/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(18998)" rel="nofollow" target="_blank"&gt;VoDA&lt;/a&gt;:&lt;/strong&gt;
Всем доброго дня )))&lt;/p&gt;
&lt;p&gt;Вопрос такой: почему индикаторы сделаны через дженерики таким образом, что могут не отрабатывать контракт?&lt;/p&gt;
&lt;p&gt;Расследование показало, что это происходит из за вызова var newValue = input.GetValue&amp;lt;decimal&amp;gt;(); в EMA. Т.е. EMA исходит из того, что input строго decimal, хотя контрактом на EMA это не регламентировано.&lt;/p&gt;
&lt;p&gt;Что делать?
Поясни:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;что значит &amp;quot;могут не отрабатывать контракт&amp;quot;&lt;/li&gt;
&lt;li&gt;почему input не должен быть decimal&lt;/li&gt;
&lt;li&gt;каким &amp;quot;контрактом на EMA это не регламентировано&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/18998/</id>
    <title type="text">Всем доброго дня ))) Вопрос такой: почему индикаторы сделаны через дженерики таким образом, что могу...</title>
    <published>2012-05-12T13:34:29Z</published>
    <updated>2012-05-12T13:34:29Z</updated>
    <author>
      <name>VoDA</name>
      <uri>https://stocksharp.ru/users/27725/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;p&gt;Всем доброго дня )))&lt;/p&gt;
&lt;p&gt;Вопрос такой: почему индикаторы сделаны через дженерики таким образом, что могут не отрабатывать контракт?&lt;/p&gt;
&lt;p&gt;На примере кода:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;var candle = new TimeFrameCandle()
;
IIndicator indicator = new ExponentialMovingAverage();
var result = indicator.Process(new CandleIndicatorValue(candle));&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Если же взять Peak индикатор, то код внезапно начинает работать.
Самое обидное, что контракт - всегда выполнен. Любой индикатор поддерживает интерфейс взаимодействия IIndicator, на вход Process подается IIndicatorValue.
Но в одном случае IIndicatorValue обрабатывается корректно, а в другом - дает сбой.&lt;/p&gt;
&lt;p&gt;Расследование показало, что это происходит из за вызова var newValue = input.GetValue&amp;lt;decimal&amp;gt;(); в EMA. Т.е. EMA исходит из того, что input строго decimal, хотя контрактом на EMA это не регламентировано.&lt;/p&gt;
&lt;p&gt;Что делать?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>