Добавление своего индикатора на график
Atom Ответить
27.03.2013


Здравствуйте. Вопрос по добавлению своего индикатора на график. Индикатор создан на базе индикаторов из stocksharp.codeplex только у итогового изменено название с highest на step1, как библиотека классов. При добавлении его на график появляется ошибка - Неявное преобразование типа "Swing.Step1" в "StockSharp.Algo.Indicators.IIndicator" невозможно. Существует явное преобразование (возможно, отсутствует приведение). В каком направлении двигаться?

Теги:


Спасибо:




12 Ответов
IvanB

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


Здравствуйте Compressor.
Нам нужен код, как переопределяете индикатор Highest и как затем используете новый, чтобы помочь Вам.
Спасибо: Самунджян Артем

Compressor

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


Код, в котором добавляется индикатор

Его отличие от Highest в том, что он добавляется из своей библиотеки, а не из библиотеки StoskSharp'а.
Автор топика
Спасибо:

IvanB

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


Просмотрев код, видно, что есть ошибка в следующих строках:
Код
                var st1 = _step1Elem.Indicator.Process(new DecimalIndicatorValue(candle.HighPrice) { IsFinal = final });
                var stValue = new ChartIndicatorValue(_indichElem.Indicator, st1);

Во второй строке Вы хотели бы получить значение индикатора _step1Elem.Indicator, но используете индикатор _indichElem.Indicator. Так правильно:
Код
                var st1 = _step1Elem.Indicator.Process(new DecimalIndicatorValue(candle.HighPrice) { IsFinal = final });
                var stValue = new ChartIndicatorValue(_step1Elem.Indicator, st1);


Даже если выполнить проект с Вашим кодом и без исправления указанной выше ошибки, то проект выполняется успешно.
Есть предположение, что Вы используете разные версии модулей S# в разных сборках своего приложения, это может привести к исключению о котором Вы писали. Проверьте версии подключенных модулей, если ошибку не удастся устранить, пришлите архив с проектами.
Спасибо:

Compressor

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


Не помогло, в 132 строке все равно выдает ошибку.
Автор топика
Спасибо:

IvanB

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


Compressor Перейти
Не помогло, в 132 строке все равно выдает ошибку.


Подключенные сборки проверяли?
Пришлите архив проекта на электронную почту iv_qul@list.ru
Спасибо:

Compressor

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


После изменений, связанных с переопределением библиотек, индикатор не реагирует на параметр Length, везде берет значение 1.
Автор топика
Спасибо:

IvanB

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


Compressor Перейти
После изменений, связанных с переопределением библиотек, индикатор не реагирует на параметр Length, везде берет значение 1.


Привожу в качестве примера код индикатора, который адекватно работает, в том числе принимает значение Length:
Код
 public class Step2 : LengthIndicator<decimal>
    {
        /// <summary>
		/// Создать
		/// </summary>
		public Step2()
			: base(typeof(decimal))
		{
		}

        public override bool IsFormed
        {
            get
            {
                return true;
            }
        }

		/// <summary>
		/// Обработать входное значение.
		/// </summary>
		/// <param name="input">Входное значение.</param>
		/// <returns>Результирующее значение.</returns>
		protected override decimal OnProcess(IIndicatorValue input)
		{
			var val = input.GetValue<decimal>();

		    var newValue = val + Length;
            return newValue;
		}
    }


Замечу, что здесь наследуемый класс LengthIndicator<> взят из S#.
Спасибо:

Compressor

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


К сожалению и этот вариант не работает правильно, если посмотреть график, то коричневая линия это как раз Максимум за 2 бара плюс shift (она производная от розовой без смещения на верх), если присмотреться то вершины образуют макс только на одном баре и не продляются на второй, а вот желтая линия графика это правильная линия, она держит максимум 2 бара.
Автор топика
Спасибо:

Compressor

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


В последнем варианте величина Length просто поднимает или опускает график сильнее, но не влияет на базу расчета индикатора.
Автор топика
Спасибо:

IvanB

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


Compressor Перейти
В последнем варианте величина Length просто поднимает или опускает график сильнее, но не влияет на базу расчета индикатора.


Правильно, свойство Length только хранит целочисленное значение и никак не влияет на работу индикатора, если Вы его не используете.
Вам необходимо самостоятельно использовать это свойство (Length) для реализации алгоритма индикатора.
Вы можете посмотреть код индикатора Highest, там в переопределенном методе OnProcess обеспечивается управление историческим буфером (Buffer) с использованием свойства Length.
Спасибо:

Compressor

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


По примеру Highest параметр LastValue не существует в текущем контексте.
Автор топика
Спасибо:

IvanB

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


Compressor Перейти
По примеру Highest параметр LastValue не существует в текущем контексте.


Я полагаю, Вы используете старый вариант, попробуйте это:

Рекомендую пройти уроки C#, многое будет понятно, меньше будет подобных проблем.
Спасибо:


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

loading
clippy