| Alexander 
 
   
 
						
						
					 | Date: 9/21/2011 
 
 
	
			Сергей Гаврилов codeplexЕсть подозрение, что SmoothedMovingAverage считается некорректно...Как можно поглядеть исходники индикаторов?
 | 
			
				|  | 
	
		| Thanks: |   |  | 
			
				|  | 
		
			| 
 | 
		
			
				| Сергей Гаврилов 
 
   
 
						
						
					 | Date: 9/22/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
 
 Еже ли я прав, то как можно внести изменения в код индикатора?
 
 
 
 
 | 
			
				|  | 
	
		| Thanks: |   |  | 
			
				|  | 
		
			| 
 | 
		
			
				| Сергей Гаврилов 
 
   
 
						
						
					 | Date: 9/22/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();
 }
 
 | 
			
				|  | 
	
		| Thanks: |   |  | 
			
				|  | 
		
			| 
 | 
		
			
				| esper 
 
   
 
						
						
					 | Date: 9/22/2011 
 
 
	
			SmoothedMovingAverage в свое время писался специально для RSI, его реализация, на сколько я помню, ранее работала и проходила тесты на базе данных из AMI, потом был большой рефакторинг и сейчас похоже ничего не работает. Надо наводить порядок в проекте.
			
			
			
			
		
 | 
			
				|  | 
	
		| Thanks: |   |  | 
			
				|  | 
		
			| 
 | 
		
			
				| esper 
 
   
 
						
						
					 | Date: 9/22/2011 
 
 
	
			Сергей Гаврилов Это код SMMA
 Наверно строка Buffer.RemoveAt(0) - лишняя, т.к. мы будет постоянно
 выполняться условие Buffer.Count == Length
 Возьмем период равный 14. Сначала получим 14==14, на следующем шаге добавится еще одно значение в список, будет 15==14, после пересчета удалим один элемент и при следующем вызове снова добавим, опять получим 15==14, вроде верно все[confused] 
			
			
			
			
		
 | 
			
				|  | 
	
		| Thanks: |   |  | 
			
				|  | 
		
			| 
 | 
		
			
				| Сергей Гаврилов 
 
   
 
						
						
					 | Date: 9/22/2011 
 
 
	
			Да, вроде верно.. Но на графике чего не то рисует..
			
			
			
			
		
 | 
			
				|  | 
	
		| Thanks: |   |  | 
			
				|  | 
		
			| 
 | 
		
			
				| esper 
 
   
 
						
						
					 | Date: 9/22/2011 
 
 
	
			Сергей Гаврилов Да, вроде верно.. Но на графике чего не то рисует.. А WilderMA не смотрели? Что именно не то рисуется на графике?
			
			
			
			
		
 | 
			
				|  | 
	
		| Thanks: |   |  | 
			
				|  | 
		
			| 
 | 
		
			
				| Сергей Гаврилов 
 
   
 
						
						
					 | Date: 9/22/2011 
 
 
	
			esper Сергей Гаврилов Да, вроде верно.. Но на графике чего не то рисует.. А WilderMA не смотрели? Что именно не то рисуется на графике? Мне нужен именно этот индикатор.. График далеко уходит от цен..  Сейчас SMMA вроде от LengthIndicator<T> наследуется, а у Вас от МА..., а реализация та же осталась? Попробую от LengthIndicator<T> наследовать и с Вашей реализацией написать свой класс..
			
			
			
			
		
 | 
			
				|  | 
	
		| Thanks: |   |  | 
			
				|  | 
		
			| 
 | 
		
			
				| esper 
 
   
 
						
						
					 | Date: 9/22/2011 
						
							|  |  |  |   |  
 
 
	
			Сергей Гаврилов А WilderMA не смотрели? Что именно не то рисуется на графике?
 Мне нужен именно этот индикатор.. График далеко уходит от цен..
 Все же попробуйте WilderMA, она тоже представляет сглаженное среднее, не помню в чем отличие от SMMA и есть ли оно вообще. Сергей Гаврилов Сейчас SMMA вроде от LengthIndicator<T> наследуется, а у Вас от МА..., а реализация та же осталась?
 Попробую от LengthIndicator<T> наследовать и с Вашей реализацией написать свой класс..
 От МА давно вроде не наследуется, последняя версия такая: Code
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);
			}
		}
	}
}
 | 
			
				|  | 
	
		| Thanks: |   |  | 
			
				|  | 
		
			| 
 | 
		
			
				| Сергей Гаврилов 
 
   
 
						
						
					 | Date: 9/22/2011 
 
 
	
			Индикатор, наверно все таки калькулируется правильно... Проблема в том, что на графике в amCharts для индюка используется своя шкала...   
			
			
			
			
		
 | 
			
				|  | 
	
		| Thanks: |   |  | 
			
				|  |