← Назад

Индикатор - рефакторинг

Первый существенный рефакторинг. Произвести нужно, различий уже много в каждом из индюков. Что бросилось в глаза:

  1. Класса нужно объявлять public. Иначе их не будет видно с наружи (в роботе).
  2. Предлагаю все воспользоваться R# и применить выложенные настройки (применять через аддон к R# - rsm.codeplex.com). Файл должен быть "зеленым", в идеале вообще без меток.
  3. Давайте разнесем индюки по разным папкам. Я создал 2 - для тренд и волатильность. Подозреваю, что их недостаточно. При переносе файла так же нужно менять и namespace чтобы было правильнее с точки зрения C#.
  4. Есть 2 класса - SingleValueIndicator и LengthIndicator. Предлагаю свои индюки отнаследовать именно от них (какой именно подойдет можно понять по коду).
  5. Имена. Будем делать длинными? Посмотрите как получилось со скользящими. Нормально? Если да, то давайте и свои так же переделаем.

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

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

esper
esper

Mikhail Sukhov: Давайте разнесем индюки по разным папкам. Я создал 2 - для тренд и волатильность. Подозреваю, что их недостаточно. При переносе файла так же нужно менять и namespace чтобы было правильнее с точки зрения C#. Может сделаем трендовые, объема и осциляторы?

Mikhail Sukhov: Есть 2 класса - SingleValueIndicator и LengthIndicator. Предлагаю свои индюки отнаследовать именно от них (какой именно подойдет можно понять по коду). Поправил SingleValueIndicator, в частности свойство Value, ранее договорились, что событие вызывается для любого нового значения индикатора, даже если оно осталось прежним (пригодится при отрисовке графика по событию).

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

Mikhail Sukhov: Имена. Будем делать длинными? Посмотрите как получилось со скользящими. Нормально? Если да, то давайте и свои так же переделаем. В другой теме решили делать полное название, это конечно громоздко, но не будет путаницы

Mikhail Sukhov
Mikhail Sukhov Автор

esper: Может сделаем трендовые, объема и осциляторы?

Поправил SingleValueIndicator, в частности свойство Value, ранее договорились, что событие вызывается для любого нового значения индикатора, даже если оно осталось прежним (пригодится при отрисовке графика по событию).

Согасен по обоим пунктам.

Mikhail Sukhov: В другой теме решили делать полное название, это конечно громоздко, но не будет путаницы

Я для себя лично узнал в процессе переименования, что такое Smma😂

Maxim
Maxim

Добрый день, коллеги.

Завтра ухожу в отпуск. Не смогу сделать рефакторинг. Надеюсь то что я написал не очень будет трудно кому нибудь переделывать.

Небольшой отчет. Сделал 12 индикаторов: Peak, PeakBar, QStick, TRIX, Trough, TroughBar, UltimateOsc, VHF, Vidya, VMA, Volatility, WilliamsR

Тесты проходят следующие индикаторы: QStick, UltimateOsc, VHF, VMA, WilliamsR

По следующим индикаторам нет тестов, потому что нет данных на чем их тестить: PeakBar, TroughBar, Vidya

По индикаторам Peak и Trough я писал раньше. Вопрос все еще открыт. http://stocksharp.com/posts/m/8891/

Индикатор Volatility: у нас и у Ами разное понимание, когда начинать рассчитывать индикатор. Для иллюстрации прикладываю сводную таблицу, в которой показывается, что в Ами расчет индикатора начинается позже. Подозреваю, что у нас верный подход, а в Ами нет.

Индикатор TRIX. Аналогично, в Ами начинают расчет не тогда, когда в моем индикаторе. Либо я ошибаюсь в понимании реализации, либо в Ами. В этом индикаторе используется тройная скользящая средняя:

  
 public void Add(decimal newValue)
{
	ema1.Add(newValue);

	if (ema1.IsFormed == true)
	{
		ema2.Add(ema1.Value);

		if (ema2.IsFormed == true)
		{
			ema3.Add(ema2.Value);

			if (ema3.IsFormed == true)
			{
				roc.Add(ema3.Value);

				if (roc.IsFormed == true)
				{
					Value = roc.Value;
					RaiseChangedEvent();
				}                    
			}        
		}       
	}        
}

В Ами этот индиктор начинают рассчитывать начиная с 21 значения (при параметре 20). Тогда как в вышеописанной реализации индикатор начинает рассчитываться с 78 значения. Опять же, считаю, что у меня верно. Но нужен взгляд со стороны на этот вопрос.

Если будут вопросы, пишите в личку. По возможности буду заглядывать на форум. Всем удачи и хорошего настроения.

Mikhail Sukhov
Mikhail Sukhov Автор

Maxim: Добрый день, коллеги.

Завтра ухожу в отпуск.

Желаю хорошо отдохнуть!

Sergey Masyura
Sergey Masyura

Mikhail Sukhov:

Maxim: Добрый день, коллеги.

Завтра ухожу в отпуск.

Желаю хорошо отдохнуть!

Хорошего отдыха!

artemox
artemox

А кто с R# поможет? Какая версия нужна?

Mikhail Sukhov
Mikhail Sukhov Автор

artemox: А кто с R# поможет? Какая версия нужна?

5.1.3

artemox
artemox

Михаил, что значит <Файл должен быть "зеленым">. у Вас LengthIndicator зеленый?

Mikhail Sukhov
Mikhail Sukhov Автор

artemox: Михаил, что значит <Файл должен быть "зеленым">. у Вас LengthIndicator зеленый?

Когда поставите R#, увидите полосу справа от кода. Попереключайтесь между файлами и все поймете.

artemox
artemox

Так и сделал, но LengthIndicator с желтым кубиком, поэтому и спросил.

ЗЫ: У меня юбилей на форуме - 100 сообщений 😎

Sergey Masyura
Sergey Masyura

artemox: Так и сделал, но LengthIndicator с желтым кубиком, поэтому и спросил.

ЗЫ: У меня юбилей на форуме - 100 сообщений 😎

Надо еще конфиг для R# указывать. Resharper->Options->Settings Manager. Там выбрать папку где лежит R#.R#Settings и в комбо выбрать его.

PS: congratz

Mikhail Sukhov
Mikhail Sukhov Автор

artemox: Так и сделал, но LengthIndicator с желтым кубиком, поэтому и спросил.

ЗЫ: У меня юбилей на форуме - 100 сообщений 😎

А я свое 3000-ое пропустил... Ну и нафлудил.

artemox
artemox

sergey.masyura: Надо еще конфиг для R# указывать. Resharper->Options->Settings Manager. Там выбрать папку где лежит R#.R#Settings и в комбо выбрать его. Спасибо я думал что персональные сетинги на проект с индивидуальными настройками не влияют, и все равно в LengthIndicator пожелтела строка 37 с this.Buffer и this.Length

esper
esper

По индикаторам у которых несколько значений было предложение сделать так:

artemox: MultiValueIndicator возможно как массив значений. А обращение к элементам массива через перечисление, объявленное в каждом классе. Остановимся на нем?

Mikhail Sukhov
Mikhail Sukhov Автор

esper;9053: По индикаторам у которых несколько значений было предложение сделать так:

artemox: MultiValueIndicator возможно как массив значений. А обращение к элементам массива через перечисление, объявленное в каждом классе. Остановимся на нем?

Насчет массива понял, а вот при чем здесь enum?

esper
esper

Mikhail Sukhov;9058:

esper;9053: По индикаторам у которых несколько значений было предложение сделать так:

artemox: MultiValueIndicator возможно как массив значений. А обращение к элементам массива через перечисление, объявленное в каждом классе. Остановимся на нем?

Насчет массива понял, а вот при чем здесь enum? Чтобы значения можно было получать так:

BB bb = new BB();
var bottom = bb.Values[BB.Fields.Bottom];
Mikhail Sukhov
Mikhail Sukhov Автор

esper;9059:

Mikhail Sukhov;9058:

esper;9053: По индикаторам у которых несколько значений было предложение сделать так:

artemox: MultiValueIndicator возможно как массив значений. А обращение к элементам массива через перечисление, объявленное в каждом классе. Остановимся на нем?

Насчет массива понял, а вот при чем здесь enum? Чтобы значения можно было получать так:

BB bb = new BB(); var bottom = bb.Values[BB.Fields.Bottom];


А чем это лучше такого?:

```csharp
BB bb = new BB();
var bottom = bb.Bottom;
esper
esper

Mikhail Sukhov;9060:

esper;9059:

Mikhail Sukhov;9058:

esper;9053: По индикаторам у которых несколько значений было предложение сделать так:

artemox: MultiValueIndicator возможно как массив значений. А обращение к элементам массива через перечисление, объявленное в каждом классе. Остановимся на нем?

Насчет массива понял, а вот при чем здесь enum? Чтобы значения можно было получать так:

BB bb = new BB(); var bottom = bb.Values[BB.Fields.Bottom];

> 
> А чем это лучше такого?:
> 
> ```csharp
BB bb = new BB();
var bottom = bb.Bottom;

Да в общем то ничем, разве что у всех индикаторов будет одинаковый интерфейс

Mikhail Sukhov
Mikhail Sukhov Автор

esper: Да в общем то ничем, разве что у всех индикаторов будет одинаковый интерфейс

Он и так будет. Values никто прятать не будет. Другой вопрос, что все равно нужно ввозидить для каждого идюка свой enum. Так а зачем его вводить, если мы используем ООП? Вот он класс, вот оно свойство.

artemox
artemox

Mikhail Sukhov:

esper: Да в общем то ничем, разве что у всех индикаторов будет одинаковый интерфейс

Он и так будет. Values никто прятать не будет. Другой вопрос, что все равно нужно ввозидить для каждого идюка свой enum. Так а зачем его вводить, если мы используем ООП? Вот он класс, вот оно свойство.

Свойства нужны в любом случае (для индивидуального использования индикатора в стратегии) И Values нужны (для визуализатора) Считаю что для Values необходим какой-то механизм идентификации сути каждого элемента. В том же визуализаторе кроме самих линий хорошо бы знать их наименования. Как бы сделать это красиво и универсально?

artemox
artemox

Кстати теперь можно использовать TestRunner вот так:

    [TestMethod]
    public void Momentum()
    {
        TestRunner.ByClosePrice(new Momentum(20));
    }

При этом само определяется имя тестового файла (файл должен совпадать с наименованием класса индикатора) Погрешность по умолчанию 0.000001m. Все можно задавать индивидуально в параметрах вызова.

InsiderHSE
InsiderHSE

artemox: Кстати теперь можно использовать TestRunner вот так:

    [TestMethod]
    public void Momentum()
    {
        TestRunner.ByClosePrice(new Momentum(20));
    }

При этом само определяется имя тестового файла (файл должен совпадать с наименованием класса индикатора) Погрешность по умолчанию 0.000001m. Все можно задавать индивидуально в параметрах вызова.

Проверка Assert.IsTrue(Math.Max(indicator.Value, item.Value) / Math.Min(indicator.Value, item.Value) - 1 < epsilon) работает только в области положительных значений. Если, например, реальное значение индикатора равно -1, а получилось -2, то такая ситуация пройдет тест. Исправил на Assert.IsTrue(Math.Abs(indicator.Value / item.Value - 1) < epsilon).

Также в случае ошибки деления на ноль, необходимо также удостовериться, что рассчитанное значение индикатора не отличается от нуля больше чем на эпсилон. Assert.IsTrue(Math.Abs(indicator.Value) < epsilon)

Также добавил возможность выбора, какой именно item.Value из файла нужно брать, и вывел разделитель как параметр.

Mikhail Sukhov
Mikhail Sukhov Автор

Сделал IndicatorManager - автоматически из источника данных (я думаю, популярное это менеджер свечек) формирует данными новые значения для индюков.

Просьба к авторам индюков. Расскидайте по папкам свои классы. Чтобы все были сгруппированы по типам индикаторов.

InsiderHSE
InsiderHSE

Mikhail Sukhov: Сделал IndicatorManager - автоматически из источника данных (я думаю, популярное это менеджер свечек) формирует данными новые значения для индюков.

Просьба к авторам индюков. Расскидайте по папкам свои классы. Чтобы все были сгруппированы по типам индикаторов.

На мой взгляд, разбивать индикаторы по типам не нужно. От этого минусов больше, чем плюсов. Например, LinearRegressionSlope относится к трендовым, так как показывает наклон, а StandardError вроде как к волатильности, но специфической, тесно связан с LinearRegressionSlope и разработчик/пользователь по всей вероятности будет ожидать увидеть их в одной папке. Кроме того, индикатор RSquared, хотя формально можно отнести к волатильности, но используется в основном для оценки качества регресии, поэтому такая его классификация неочевидна. Более того, когда разработчик хочет использовать какой-либо индикатор, он обычно знает его название, и найти его в общей папке труда не составит. Но если папок несколько, то ему придется еще думать, к какому типу индикатор относится. Учитывая, что однозначной классификации быть не может, это уже нетривиальная задача =).

artemox
artemox

Поддержу InsiderHSE, тоже возникали подобные мысли.

Например чтобы перенести свои индикаторы в осциляторы пришлось нагуглить их принадлежность. И даже если у разработчика будет хелп с классификацией индикаторов, прозрачности такая разбивка не добавляет.

ПС. Жара не идет проекту на пользу :)

Sergey Masyura
Sergey Masyura

artemox: Поддержу InsiderHSE, тоже возникали подобные мысли.

Например чтобы перенести свои индикаторы в осциляторы пришлось нагуглить их принадлежность. И даже если у разработчика будет хелп с классификацией индикаторов, прозрачности такая разбивка не добавляет.

ПС. Жара не идет проекту на пользу :)

Согласен. Думаю стоит свалить все в кучу - смотрится гармоничнее. Только не очень хорошо все это смотрится вперемешку с базовыми классами.

Евгений
Евгений

sergey.masyura:

artemox: Поддержу InsiderHSE, тоже возникали подобные мысли.

Например чтобы перенести свои индикаторы в осциляторы пришлось нагуглить их принадлежность. И даже если у разработчика будет хелп с классификацией индикаторов, прозрачности такая разбивка не добавляет.

ПС. Жара не идет проекту на пользу :)

Согласен. Думаю стоит свалить все в кучу - смотрится гармоничнее. Только не очень хорошо все это смотрится вперемешку с базовыми классами.

Базовые может выделить в папку? А остальные пусть в куче, по алфавитке искать конечно проще...

Mikhail Sukhov
Mikhail Sukhov Автор

Евгений: Базовые может выделить в папку? А остальные пусть в куче, по алфавитке искать конечно проще...

Я хочу переменную IIndicator создать в классе. Как мне догадаться, что нужен другой namespace?

Евгений
Евгений

Mikhail Sukhov:

Евгений: Базовые может выделить в папку? А остальные пусть в куче, по алфавитке искать конечно проще...

Я хочу переменную IIndicator создать в классе. Как мне догадаться, что нужен другой namespace?

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

У меня возникли следующие вопросы:

  1. Можно добавить папку BillWilliams, куда поместить соответствующие индикаторы
  2. Как предложение всем разработчикам: сделать конструкторы с параметрами по умолчанию для тех индикаторов, где это необходимо (период, может быть цвет линии на будущее и др.)
  3. Не могу разобраться как реализовать запаздывание для линии Chinkou Span (http://www.dealingcity.ru/content/enc/enc.php?ID=24806). Эта линия строиться по цене закрытия, смещенной на M периодов назад. Как предложение, может для индикатора нужно не только Value, но и время свечи.
Sergey Masyura
Sergey Masyura

Евгений:

Mikhail Sukhov:

Евгений: Базовые может выделить в папку? А остальные пусть в куче, по алфавитке искать конечно проще...

Я хочу переменную IIndicator создать в классе. Как мне догадаться, что нужен другой namespace?

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

У меня возникли следующие вопросы:

  1. Можно добавить папку BillWilliams, куда поместить соответствующие индикаторы
  2. Как предложение всем разработчикам: сделать конструкторы с параметрами по умолчанию для тех индикаторов, где это необходимо (период, может быть цвет линии на будущее и др.)
  3. Не могу разобраться как реализовать запаздывание для линии Chinkou Span (http://www.dealingcity.ru/content/enc/enc.php?ID=24806). Эта линия строиться по цене закрытия, смещенной на M периодов назад. Как предложение, может для индикатора нужно не только Value, но и время свечи.
  1. Если есть хотя бы несколько индикаторов williams, то вполне можно вынести.
  2. Цвет линии это все таки больше ко вью относится в терминах mvc, поэтому логично, что в самом индикаторе, который выступает в качестве модели, цвета быть не должно. Я, кстати, сейчас занимаюсь рисованием индюков..
  3. Да, у нас уже были по поводу добавления времени, но однозначно на данный момент их сложно сформулировать.
Mikhail Sukhov
Mikhail Sukhov Автор

sergey.masyura: Я, кстати, сейчас занимаюсь рисованием индюков..

Евгений
Евгений

Mikhail Sukhov:

sergey.masyura: Я, кстати, сейчас занимаюсь рисованием индюков..

Графики зачетные, это майкрософт чарт?

artemox
artemox

Михаил, считаете нужно продолжать разносить индикаторы по категориям-нэймспейсам?

Добил последний свой индикатор DPO, но сейчас он в Misc. Что дальше с ним делать?

ПС. Папки в любом случае лучше оставить, чтобы было проще ориентироваться в проекте.

Евгений
Евгений
  1. Цвет линии это все таки больше ко вью относится в терминах mvc, поэтому логично, что в самом индикаторе, который выступает в качестве модели, цвета быть не должно.

То есть цвета будут заданы для каждого индикатора во вью?