| esper 
 
   
 
						
						
					 | Дата: 14.12.2012 
 
 
	
			А значения вычисляются?
			
			
			
			
		
 | 
			
				|  | 
	
		| Спасибо: |   |  | 
			
				|  | 
		
			| 
 | 
		
			
				| kapustin-vladimir 
 
   
 
						
						
					 | Дата: 17.12.2012 
 
 
	
			выводил для проверки "LongSma.GetCurrentValue()", LongSma.GetCurrentValue(), "RSI", RSI.GetCurrentValue()
 LongSma.GetCurrentValue(), 10336.05, RSI, 100, SMAStrategy
 LongSma.GetCurrentValue(), 11491.05, RSI, 100, SMAStrategy
 LongSma.GetCurrentValue(), 12646.05, RSI, 100, SMAStrategy
 RSI выводи все время 100 без изменений
 | 
			
				|  | 
	
		| Спасибо: |   |  | 
			
				|  | 
		
			| 
 | 
		
			
				| esper 
 
   
 
						
						
					 | Дата: 17.12.2012 
 
 
	
			Что-то у вас не так. Rsi из последней версии на кодеплексе проходит тест.
			
			
			
			
		
 | 
			
				|  | 
	
		| Спасибо: |   |  | 
			
				|  | 
		
			| 
 | 
		
			
				| kapustin-vladimir 
 
   
 
						
						
					 | Дата: 11.02.2013 
 
 
	
			Что-то у вас не так. Rsi из последней версии на кодеплексе проходит тест. Было написано так в ответе и воз ныне там, скажите что происходит. больше ответов не было, закончились ли тесты???
			
			
			
			
		
 | 
			
				|  | 
	
		| Спасибо: |   |  | 
			
				|  | 
		
			| 
 | 
		
			
				| esper 
 
   
 
						
						
					 | Дата: 12.02.2013 
 
 
	
			В проекте с индикаторами есть набор тестов для большинства индикаторов, в том числе для RSI. Т.к. индикатор RSI свой тест проходит без ошибок, то он должен рассчитывать свои значения верно и ошибка, скорее всего, где-то у вас, что и было написано в предыдущем сообщении.Т.к. вы не показали никакого кода, как вы работаете с индикатором, то и сказать что-то еще нет возможности.
 | 
			
				|  | 
	
		| Спасибо: |   |  | 
			
				|  | 
		
			| 
 | 
		
			
				| Kefir 
 
   
 
						
						
					 | Дата: 12.02.2013 
 
 
	
			esper В проекте с индикаторами есть набор тестов для большинства индикаторов, в том числе для RSI. Т.к. индикатор RSI свой тест проходит без ошибок, то он должен рассчитывать свои значения верно и ошибка, скорее всего, где-то у вас, что и было написано в предыдущем сообщении.Т.к. вы не показали никакого кода, как вы работаете с индикатором, то и сказать что-то еще нет возможности.
 То же столкнулся с той же проблемой значение RSI постоянно равно 100 в классе RelativeStrengthIndex var gainValue = _gain.Process(input.SetValue(delta > 0 ? delta : 0m)).GetValue<decimal>(); var lossValue = _loss.Process(input.SetValue(delta > 0 ? 0m : -delta)).GetValue<decimal>(); gainValue и lossValue постоянно равны нулю и соответственно if (lossValue == 0) {   return 100m; } всегда возвращает 100 не очень силен в программировании может что то не то подаю на вход?
			
			
			
			
		
 | 
			
				|  | 
	
		| Спасибо: |   |  | 
			
				|  | 
		
			| 
 | 
		
			
				| Иван З. 
 
   
 
						
						
					 | Дата: 13.02.2013 
						
							|  |  |  |   |  
 
 
	
			Здравствуйте. Проверил RSI, действительно не работает. Стал разбираться в чем дело. RSI в себе использует индикатор SmoothedMovingAverage. Взял коды двух индикаторов. И получилось следующее. Код
using StockSharp.Algo.Indicators;
namespace WpfApplication1
{
    using System.ComponentModel;
    using System.Linq;
    /// <summary>
    /// Сглаженное скользящее среднее.
    /// </summary>
    [DisplayName("SMMA")]
    [Description("Сглаженное скользящее среднее.")]
    public class SmoothedMovingAverage : LengthIndicator<decimal>
    {
        /// <summary>
        /// Создать <see cref="SmoothedMovingAverage"/>.
        /// </summary>
        public SmoothedMovingAverage()
            : base(typeof(decimal))
        {
        }
        /// <summary>
        /// Обработать входное значение.
        /// </summary>
        /// <param name="input">Входное значение.</param>
        /// <returns>Результирующее значение.</returns>
        protected override decimal OnProcess(IIndicatorValue input)
        {
            var newValue = input.GetValue<decimal>();
            if (input.IsFinal)
                Buffer.Add(newValue);
            if (!IsFormed)
                return this.GetCurrentValue();
            if (Buffer.Count == Length)
            {
                return Buffer.Sum() / Length;
            }
            else
            {
                if (input.IsFinal)
                    Buffer.RemoveAt(0);
                return (this.GetCurrentValue() * (Length - 1) + newValue) / Length;
            }
        }
    }
    /// <summary>
    /// Индекс относительной силы.
    /// </summary>
    [DisplayName("RSI")]
    [Description("Индекс относительной силы.")]
    public class RelativeStrengthIndex : LengthIndicator<decimal>
    {
        private readonly SmoothedMovingAverage _gain;
        private readonly SmoothedMovingAverage _loss;
        private bool _isInitialized;
        private decimal _last;
        /// <summary>
        /// Создать <see cref="RelativeStrengthIndex"/>.
        /// </summary>
        public RelativeStrengthIndex()
            : base(typeof(decimal))
        {
            _gain = new SmoothedMovingAverage();
            _loss = new SmoothedMovingAverage();
        }
        /// <summary>
        /// Сформирован ли индикатор.
        /// </summary>
        public override bool IsFormed { get { return _gain.IsFormed; } }
        /// <summary>
        /// Длина периода.
        /// </summary>
        public override int Length
        {
            get
            {
                return _gain.Length;
            }
            set
            {
                _loss.Length = _gain.Length = value;
                Reset();
            }
        }
        /// <summary>
        /// Обработать входное значение.
        /// </summary>
        /// <param name="input">Входное значение.</param>
        /// <returns>Результирующее значение.</returns>
        protected override decimal OnProcess(IIndicatorValue input)
        {
            var value = input.GetValue<decimal>();
            if (!_isInitialized)
            {
                _last = value;
                _isInitialized = true;
                return this.GetCurrentValue();
            }
            var delta = value - _last; 
            
            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            // Для проверки ввел следующие 4 строки, на работу индикатора они ни как не влияют, их можно удалить
            var g = input.SetValue(delta > 0 ? delta : 0m); // После изменения входное значения индикатора, у g значения индикатора g свойство IsFinal=false
            var l = input.SetValue(delta > 0 ? 0m : -delta); // После изменения значения индикатора, у l значения индикатора g свойство IsFinal=false
            var gg = _gain.Process(g);//SmoothedMovingAverage проверяет свойство IsFinal и при false считается несформированным и выдает последнее значение которое = 100
            var ll = _loss.Process(l);//SmoothedMovingAverage проверяет свойство IsFinal и при false считается несформированным и выдает последнее значение которое = 100
            ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //Поможет следующее действие
            ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            // Это мы закоментируем до лучших времен
            //var gainValue = _gain.Process(input.SetValue(delta > 0 ? delta : 0m)).GetValue<decimal>();
            //var lossValue = _loss.Process(input.SetValue(delta > 0 ? 0m : -delta)).GetValue<decimal>();
            ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            // Честно говоря, не вижу смысла изменять входное значение индикатора(если я не прав прошу поправить и объяснить почему? Здесь так мало что-то кому-то объясняют, до всего самому доходить приходиться.), так как SmoothedMovingAverage принимает на вход decimal то
            // input.SetValue(delta > 0 ? delta : 0m) можно заменить на delta > 0 ? delta : 0m И все, код работает
            var gainValue = _gain.Process(delta > 0 ? delta : 0m).GetValue<decimal>();
            var lossValue = _loss.Process(delta > 0 ? 0m : -delta).GetValue<decimal>();
            _last = value;
            if (lossValue == 0)
            {
                return 100m;
            }
            else if (gainValue / lossValue == 1)
            {
                return 0m;
            }
            else
            {
                return 100m - 100m / (1m + gainValue / lossValue);
            }
        }
    }
}
 Проблема возникает из-за того, что input.SetValue(delta > 0 ? 0m : -delta) выдает значение со свойством IsFinal=false, SmoothedMovingAverage проверяет свойство IsFinal и при false считается не сформированным и выдает последнее значение которое = 100. В коде я написал как привести индикатор в рабочее состояния, по крайней мере у меня он работает.[blush]  Остается вопрос input.SetValue() должно выдавать значение со свойством IsFinal=false? p.s. Когда проверять будете длину индикатора RSI поставте. Значение по умолчанию 100 и 0 выдает. Хотя бы так Код
private RelativeStrengthIndex RSI = new RelativeStrengthIndex() { Length=10}; | 
			
				|  |  | 
			
				|  | 
		
			| 
 | 
		
			
				| esper 
 
   
 
						
						
					 | Дата: 13.02.2013 
 
 
	
			Давайте пока не трогать код индикатора, просто покажите как вы его используете.
			
			
			
			
		
 | 
			
				|  | 
	
		| Спасибо: |   |  | 
			
				|  | 
		
			| 
 | 
		
			
				| Иван З. 
 
   
 
						
						
					 | Дата: 13.02.2013 
						
							|  |  |  |   |  
 
 
	
			создал индикатор Код
private RelativeStrengthIndex RSI = new RelativeStrengthIndex() { Length=10}; подписываюсь на свечки Код
        private void Chart_Click(object sender, RoutedEventArgs e)
        {
            //добавляем источник информации трейдера
            _trader = new QuikTrader();
            InitChart();
            _candleManager = new CandleManager();
            var startTime = new DateTime(2012, 1, 1);
            var endTime = new DateTime(2012, 1, 5);
            // Добавление в источник свечек TimeFrameCandleBuilder источник данных в виде файлов гидры 
            var storageRegistry = new StorageRegistry();
            ((LocalMarketDataDrive)storageRegistry.DefaultDrive).Path = PathStorage;
            var stor = new StorageCandleSource { StorageRegistry = storageRegistry };
            _series = new CandleSeries(typeof(TimeFrameCandle), SelectedSecurity,
                                       TimeSpan.FromMinutes(SelectedTimeFrame));
            _candleManager.Sources.Add(stor);
            _candleManager.Container.CandlesKeepTime = TimeSpan.FromDays(2);
            _candleManager.Processing += Draw;
            _candleManager.Start(_series, startTime, endTime);
        } через отладку смотрю значения Код
 private void Draw(CandleSeries series, Candle candle)
        {
           var ggg = RSI.Process(candle.ClosePrice);
           var fff = RSI.GetCurrentValue();
        } И ggg и fff равны 100
			
			
			
			
		
 | 
			
				|  | 
	
		| Спасибо: |   |  | 
			
				|  | 
		
			| 
 | 
		
			
				| esper 
 
   
 
						
						
					 | Дата: 13.02.2013 
 
 
	
			Версия библиотеки какая?
 Иван З., спасибо за пример, багу подтверждаю.
 | 
			
				|  | 
	
		| Спасибо: |   |  | 
			
				|  |