Как посмотреть исходники индюка?
Atom Ответить
21.09.2011


Есть подозрение, что SmoothedMovingAverage считается некорректно...
Как можно поглядеть исходники индикаторов?

Теги:


Спасибо:




10 Ответов
Alexander

Фотография
Дата: 21.09.2011
Ответить


Сергей Гаврилов Перейти
Есть подозрение, что SmoothedMovingAverage считается некорректно...
Как можно поглядеть исходники индикаторов?


codeplex
Спасибо:

Сергей Гаврилов

Фотография
Курсы
Дата: 22.09.2011
Ответить


/// Добавить новое значение.
/// </summary>
/// <param name="newValue">Новое значение.</param>
public override void Add(decimal newValue)
{
Buffer.Add(newValue);
if (Buffer.Count < Length)
return;
if (Buffer.Count == Length)
{
Value = Buffer.Sum() / Length;
}
else
{
Value = (Value * (Length - 1) + newValue) / Length;
Buffer.RemoveAt(0);
}
RaiseChangedEvent();
}

Это код SMMA
Наверно строка Buffer.RemoveAt(0) - лишняя, т.к. мы будет постоянно
выполняться условие Buffer.Count == Length

Еже ли я прав, то как можно внести изменения в код индикатора?



Автор топика
Спасибо:

Сергей Гаврилов

Фотография
Курсы
Дата: 22.09.2011
Ответить


Может быть так...
/// Добавить новое значение.
/// </summary>
/// <param name="newValue">Новое значение.</param>
public override void Add(decimal newValue)
{
if (Buffer.Count < Length)
{
Buffer.Add(newValue);
return;
}
else
{
if (Value == 0)
{
Value = Buffer.Sum() / Length;
}
else
{
Value = (Value * (Length - 1) + newValue) / Length;
}
}
RaiseChangedEvent();
}
Автор топика
Спасибо:

esper

Фотография
Программист
Дата: 22.09.2011
Ответить


SmoothedMovingAverage в свое время писался специально для RSI, его реализация, на сколько я помню, ранее работала и проходила тесты на базе данных из AMI, потом был большой рефакторинг и сейчас похоже ничего не работает. Надо наводить порядок в проекте.
Спасибо:

esper

Фотография
Программист
Дата: 22.09.2011
Ответить


Сергей Гаврилов Перейти

Это код SMMA
Наверно строка Buffer.RemoveAt(0) - лишняя, т.к. мы будет постоянно
выполняться условие Buffer.Count == Length


Возьмем период равный 14. Сначала получим 14==14, на следующем шаге добавится еще одно значение в список, будет 15==14, после пересчета удалим один элемент и при следующем вызове снова добавим, опять получим 15==14, вроде верно всеConfused
Спасибо:

Сергей Гаврилов

Фотография
Курсы
Дата: 22.09.2011
Ответить


Да, вроде верно.. Но на графике чего не то рисует..
Автор топика
Спасибо:

esper

Фотография
Программист
Дата: 22.09.2011
Ответить


Сергей Гаврилов Перейти
Да, вроде верно.. Но на графике чего не то рисует..

А WilderMA не смотрели? Что именно не то рисуется на графике?
Спасибо:

Сергей Гаврилов

Фотография
Курсы
Дата: 22.09.2011
Ответить


esper Перейти
Сергей Гаврилов Перейти
Да, вроде верно.. Но на графике чего не то рисует..

А WilderMA не смотрели? Что именно не то рисуется на графике?

Мне нужен именно этот индикатор.. График далеко уходит от цен..
Сейчас SMMA вроде от LengthIndicator<T> наследуется, а у Вас от МА..., а реализация та же осталась?
Попробую от LengthIndicator<T> наследовать и с Вашей реализацией написать свой класс..
Автор топика
Спасибо:

esper

Фотография
Программист
Дата: 22.09.2011
Ответить


Сергей Гаврилов Перейти

А WilderMA не смотрели? Что именно не то рисуется на графике?
Мне нужен именно этот индикатор.. График далеко уходит от цен..

Все же попробуйте WilderMA, она тоже представляет сглаженное среднее, не помню в чем отличие от SMMA и есть ли оно вообще.

Сергей Гаврилов Перейти

Сейчас SMMA вроде от LengthIndicator<T> наследуется, а у Вас от МА..., а реализация та же осталась?
Попробую от LengthIndicator<T> наследовать и с Вашей реализацией написать свой класс..

От МА давно вроде не наследуется, последняя версия такая:
Код
using System.Linq;

namespace StockSharp.Algo.Indicators.Trend
{
	/// <summary>
	/// Сглаженное скользящее среднее.
	/// </summary>
	public class SmoothedMovingAverage : LengthIndicator<decimal>
	{
		/// <summary>
		/// Создать <see cref="SmoothedMovingAverage"/>.
		/// </summary>
		/// <param name="length">Длина скользящей.</param>
		public SmoothedMovingAverage(int length)
			: base(length)
		{
		}

		/// <summary>
		/// Добавить новое значение.
		/// </summary>
		/// <param name="newValue">Новое значение.</param>
		public override void Add(decimal newValue)
		{
			Buffer.Add(newValue);

			if (Buffer.Count < Length)
				return;

			if (Buffer.Count == Length)
			{
				Value = Buffer.Sum() / Length;
			}
			else
			{
				Value = (Value * (Length - 1) + newValue) / Length;
				Buffer.RemoveAt(0);
			}
		}
	}
}
Спасибо:

Сергей Гаврилов

Фотография
Курсы
Дата: 22.09.2011
Ответить


Индикатор, наверно все таки калькулируется правильно... Проблема в том, что на графике в amCharts для индюка используется своя шкала...
Автор топика
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy