﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/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-04-05T11:31:52Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=2682" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/19002/</id>
    <title type="text">В продолжение темы: Как правильно кормить индикаторы? Тот же ChaikinVolatility делает input.GetValue...</title>
    <published>2012-05-12T14:39:20Z</published>
    <updated>2012-05-12T14:39:20Z</updated>
    <author>
      <name>VoDA</name>
      <uri>https://stocksharp.com/users/27725/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Кот Матроскин &lt;a href="https://stocksharp.com/posts/m/19000/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;/div&gt;&lt;/div&gt;В продолжение темы:&lt;br /&gt;Как правильно кормить индикаторы?&lt;br /&gt;&lt;br /&gt;Тот же ChaikinVolatility делает input.GetValue&amp;lt;Candle&amp;gt;();&lt;br /&gt;А ExponentialMovingAverage - input.GetValue&amp;lt;decimal&amp;gt;();&lt;br /&gt;Оба в момент обработки входных данных.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Рассмотрим пример IndicatorsManager.cs из IndicatorsXaml.&lt;br /&gt;&lt;br /&gt;Если есть общий список индикторов, то в момент их вызова (функция public void AddPoint(TimeFrameCandle candle))&lt;br /&gt;Придется проверять типы этих индикторов, чтобы понять в каком виде им нужно предоставить Сandle.&lt;br /&gt;&lt;br /&gt;Именно поэтому часть кода закомментирована - тот же SimpleMovingAverage просто не работает с данным кодом.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Я правильно понимаю, что единственный выход в данной ситуации это вереница if с проверкой какого типа индикатор и конвертацией Candle в подходящий для индикатора тип?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/19001/</id>
    <title type="text"> Поясни: - что значит &amp;quot;могут не отрабатывать контракт&amp;quot; - почему input не должен быть decimal - каким...</title>
    <published>2012-05-12T14:28:50Z</published>
    <updated>2012-05-12T14:28:50Z</updated>
    <author>
      <name>VoDA</name>
      <uri>https://stocksharp.com/users/27725/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Кот Матроскин &lt;a href="https://stocksharp.com/posts/m/19000/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;Поясни:&lt;br /&gt;- что значит &amp;quot;могут не отрабатывать контракт&amp;quot;&lt;br /&gt;- почему input не должен быть decimal&lt;br /&gt;- каким &amp;quot;контрактом на EMA это не регламентировано&amp;quot;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Контракт это соглашение о том какие параметры должны обрабатываться методом или объектом. Все интерфейсы и базовые классы - это своего рода контракты для реализующих их классов. В данном случае линия наследования ExponentialMovingAverage:LengthIndicator, LengthIndicator:BaseIndicator, BaseIndicator:IIndicator показывает, что EMA должен отрабатывать все вызовы, которые присутствуют в IIndicator.&lt;br /&gt;&lt;br /&gt;В IIndicator есть Process, который принимает IIndicatorValue. Т.е. любой потомок IIndicator должен обработать все, что есть IIndicatorValue.&lt;br /&gt;Я создаю new CandleIndicatorValue(new TimeFrameCandle...), который по наследования является IIndicatorValue.&lt;br /&gt;&lt;br /&gt;Почему при передаче валидного IIndicatorValue в метод Process летит Эксепшен?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Теперь по пунктам:&lt;br /&gt;- при передаче IIndicatorValue в метод Process класса EMA вылетает Эксепшен. ИМХО если метод принимает параметер определенного типа (тип прописан в сигнатуре), то он должен его обработать.&lt;br /&gt;- input может быть IIndicatorValue содержащим decimal, а может быть IIndicatorValue содержащим любой другой тип, который захотел программист.&lt;br /&gt;- IIndicator разрешает любой IIndicatorValue.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Решения с точки зрения программирования:&lt;br /&gt;Если IIndicatorValue должен как то приводиться к decimal, то ИМХО стоит сделать метод public decimal ConvertToDecimal(), где все типы должны приводиться самим создателем наследника от IIndicatorValue.&lt;br /&gt;Если не все IIndicatorValue приводимы к decimal, то ИМХО стоит выделить приводимые к decimal в наследника IIndicatorValue. А методы типа IIndicatorValue Process(IIndicatorValue input); заменить на этого наследника для всех приводимых к decimal типов.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Вероятно, я не до конца понимаю объектную модель индикаторов [biggrin]&lt;br /&gt;Пока смотрел исходники появилась еще одна идея - типизировать сам IIndicator, а в наследниках указывать какие именно типа объектов может принимать Process. Возможно это тоже сможет упростить дело.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/19000/</id>
    <title type="text">Всем доброго дня ))) Вопрос такой: почему индикаторы сделаны через дженерики таким образом, что могу...</title>
    <published>2012-05-12T13:55:11Z</published>
    <updated>2012-05-12T13:55:11Z</updated>
    <author>
      <name>Кот Матроскин</name>
      <uri>https://stocksharp.com/users/808/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;VoDA &lt;a href="https://stocksharp.com/posts/m/18998/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Всем доброго дня )))&lt;br /&gt;&lt;br /&gt;Вопрос такой: почему индикаторы сделаны через дженерики таким образом, что могут не отрабатывать контракт?&lt;br /&gt;&lt;br /&gt;Расследование показало, что это происходит из за вызова var newValue = input.GetValue&amp;lt;decimal&amp;gt;(); в EMA. Т.е. EMA исходит из того, что input строго decimal, хотя контрактом на EMA это не регламентировано.&lt;br /&gt;&lt;br /&gt;Что делать?&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Поясни:&lt;br /&gt;- что значит &amp;quot;могут не отрабатывать контракт&amp;quot;&lt;br /&gt;- почему input не должен быть decimal&lt;br /&gt;- каким &amp;quot;контрактом на EMA это не регламентировано&amp;quot;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/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.com/users/27725/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Всем доброго дня )))&lt;br /&gt;&lt;br /&gt;Вопрос такой: почему индикаторы сделаны через дженерики таким образом, что могут не отрабатывать контракт?&lt;br /&gt;&lt;br /&gt;На примере кода:&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Quote:&lt;/span&gt;&lt;div class="innerquote"&gt;var candle = new TimeFrameCandle()&lt;br /&gt;            {&lt;br /&gt;                Time = DateTime.Now,&lt;br /&gt;                OpenPrice = 1,&lt;br /&gt;                ClosePrice = 2,&lt;br /&gt;                HighPrice = 3,&lt;br /&gt;                LowPrice = 4,&lt;br /&gt;                CloseVolume = 100,&lt;br /&gt;            };&lt;br /&gt;            IIndicator indicator = new ExponentialMovingAverage();&lt;br /&gt;            var result = indicator.Process(new CandleIndicatorValue(candle));&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Если же взять Peak индикатор, то код внезапно начинает работать.&lt;br /&gt;Самое обидное, что контракт - всегда выполнен. Любой индикатор поддерживает интерфейс взаимодействия IIndicator, на вход Process подается IIndicatorValue.&lt;br /&gt;Но в одном случае IIndicatorValue обрабатывается корректно, а в другом - дает сбой.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Расследование показало, что это происходит из за вызова var newValue = input.GetValue&amp;lt;decimal&amp;gt;(); в EMA. Т.е. EMA исходит из того, что input строго decimal, хотя контрактом на EMA это не регламентировано.&lt;br /&gt;&lt;br /&gt;Что делать?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>