Индикаторы - совместный проект

Индикаторы - совместный проект
Atom
31.05.2011
Mikhail Sukhov


Приветствую всех участников!

Месяц назад я публиковал призыв о совместной разработке индикаторов на базе C#. Прошел месяц, мною было сделано 3 стандартных индикатора SMA, EMA и WMA. И ни строчки кода ни от одного пользователя S#. Каждый день задают вопросы (причем, большинство явно не относящиеся к S# как таковому), получают ответы, но свою помощь предложить не хотят. Стесняются, наверное.

Я понимаю, что дело в мотивации. Зачем помогать делать что-то, если можно подождать пару месяцев (пол года) или сделать самому, а потом пересесть на стандартное. Поэтому я решил найти мотивацию. И я ее нашел. Это лето объявляется летом "Ты мне - я тебе".

Схема простая. Вы делаете индикатор - я отвечаю на три любых вопроса. Вопросы по глюкам S# остаются как есть и раньше - ответ всегда получите. Но вопросы по C#, WFP, примерам, документации, Квику и всему прочему - только за индикатор.[smile] Я думаю честно.

Сделав 5 индикаторов, вы получается бонус - кружку с символикой S#.

Репозитарий с исходниками расположен по адресу http://stocksharpconnectors.codeplex.com Чтобы получить доступ на запись регистрируйтесь на сайте, пишите в эту тему свой логин и какие индюки хотите сделать. Стиль кодирование указывается через R#. Настройки в репозитарии.

Что сделано сейчас:

  1. Acceleration
  2. Alligator
  3. AwesomeOscillator
  4. Fractals
  5. GatorOscillator
  6. MarketFacilitationIndex
  7. BollingerBands
  8. ExponentialMovingAverage
  9. Macd
  10. ParabolicSar
  11. RAVI
  12. SimpleMovingAverage
  13. SmoothedMovingAverage
  14. StandartDeviation
  15. VolumeWeightedMovingAverage
  16. WeightedMovingAverage
  17. WilderMovingAverage
  18. Adx
  19. Atr
  20. ChandeMomentumOscillator
  21. CommodityChannelIndex
  22. DiMinus
  23. DiPlus
  24. Dx
  25. Ichimoku
  26. Momentum
  27. RateOfChange
  28. RelativeStrengthIndex
  29. RVI
  30. TrueRange
  31. DetrendedPriceOscillator
  32. Highest
  33. LinearReg
  34. LinearRegression
  35. LinearRegSlope
  36. Lowest
  37. MeanDeviation
  38. MedianPrice
  39. Peak
  40. PeakBar
  41. QStick
  42. RSquared
  43. StandardError
  44. StochK
  45. Sum
  46. Trix
  47. Trough
  48. TroughBar
  49. UltimateOsc
  50. VerticalHorizontalFilter
  51. Vidya
  52. Volatility
  53. WilliamsR

Теги:


Спасибо:


<< < 32 33 34 
Moadip

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


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

Я проверил значения индикатора на графике Quik, индикатор считает корректно, это SciChart выводит значения индикатора некорректно. На работу стратегии это не влияет, но визуально вводит в заблуждение. Сигналы стратегии лучше смотреть на графике Quik.

Возможно ли как-то это исправить?

О каком индикаторе вообще идет речь? На картинке какие то линии без опознавательных знаков.

Я проверил значения индикатора на графике Quik, индикатор считает корректно, это SciChart выводит значения индикатора некорректно. Т.е. все таки индикатор рассчитывается верно, но проблема с выводом на график? Тогда могу предположить что вы что то не так делаете, т.к. SciChart отрисовывает то, что ему передается.

Спасибо:

UsilaDobry

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


Moadip: О каком индикаторе вообще идет речь? На картинке какие то линии без опознавательных знаков.

Речь идет об индикаторе Parabolic SAR, на картинке он светло-голубого цвета. Каждый раз после запуска вывода на графике новая версия изображения, на картинке видно, как цена зашкаливает индикатор, а он не переключается, при этом значения индикатора подтверждают график в Квике, полное совпадение с графиком индикатора в Квике. И еще, на графике явное смещение значения индикатора. Текущее значение индикатора с индексом [0] соответствует на графике свечке с индексом [2].

Т.е. все таки индикатор рассчитывается верно, но проблема с выводом на график? Тогда могу предположить что вы что то не так делаете, т.к. SciChart отрисовывает то, что ему передается.

Вывод индикатора на график делаю четко по изложенному материалу в в видео-уроке.

  1. инициализация
if (SarCheckBox.IsChecked == true)
            {
                
                _parabolic = new ParabolicSar
                    {
                        AccelerationStep = decimal.Parse(FactorSarTextBox.Text),
                        AccelerationMax = decimal.Parse(MaximumSarTextBox.Text)
                    };
                
                _chartParabolicElement = new ChartIndicatorElement
                    {
                        Title = "Parabolic",
                        Color = Colors.Aqua,
                        Indicator = _parabolic
                    };
                
                _chartArea.Elements.Add(_chartParabolicElement);
            }
  1. получение значения индикатора
if (_parabolic != null)
                {
                    
                    var valueSar = _parabolic.Process(candle);
                      
                    _chartParabolicValue = new ChartIndicatorValue(_parabolic, valueSar);
                }
  1. вывод на график
if (_chartParabolicElement != null && _chartParabolicValue != null)
                    {
                        this.GuiAsync(() => Chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
                        {
                            {_chartParabolicElement, _chartParabolicValue} //для Parabolic SAR_
                        }));

Что касается SciChart. Не я первый здесь об этом пишу. У меня например заявки в виде стрелок выводятся на экран, а потом убегают в левый край экрана...Об этом уже здесь писалось... Индикатор Bolliger тоже может нарисовать абсолютно прямым

Спасибо:

Moadip

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


xaml:


<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:xaml="clr-namespace:StockSharp.Xaml;assembly=StockSharp.Xaml"
        Title="MainWindow" Height="408" Width="683">
    
    <DockPanel LastChildFill="True">
        <StackPanel Orientation="Horizontal" Height="23" DockPanel.Dock="Top">
            <Button Content="Connect" Name="btnConnect" Width="100" Click="btnConnect_Click" />
            <Button Content="Draw Candle" Name="btnDraw" Width="100" Click="btnDraw_Click" />
            <ToggleButton Content="CrossHair" Name="btnCrossHair" Width="100" Click="btnCrossHair_Click" />
            <ToggleButton Content="ToolTip" Name="btnToolTip" Width="100" Click="btnToolTip_Click" />
        </StackPanel>
        
        <xaml:SciChart x:Name="Chart"/>
    </DockPanel>
</Window>

cs:


namespace Test
{
	using System;
	using System.Collections.Generic;
	using System.ComponentModel;
	using System.Linq;
	using System.Windows;
	using System.Windows.Media;
	using System.Windows.Shapes;

	using Ecng.Common;
	using Ecng.Xaml;

	using StockSharp.Algo.Candles;
	using StockSharp.Algo.Indicators;
	using StockSharp.Algo.Indicators.Trend;
	using StockSharp.BusinessEntities;
	using StockSharp.Quik;
	using StockSharp.Xaml;

	public partial class MainWindow
	{
		private QuikTrader _trader;
		private CandleManager _candleManager;

		private Security _security;
		private const string _securityCode = "RIM3";
		private const string _path = @"E:\Program Files\QUIK\";

		private readonly ChartCandleElement _chartCandleElement;
		private readonly ChartIndicatorElement _chartIndicatorElement;

		public MainWindow()
		{
			InitializeComponent();


			var area = new ChartArea();

			Chart.ChartTheme = "ExpressionDark";

			_chartCandleElement = new ChartCandleElement()
			{
				Antialiasinig = false,
				UpBodyColor = Colors.White,
				UpWickColor = Colors.Black,				
				DownBodyColor = Colors.Black,
				DownWickColor = Colors.Black,
			};

			_chartIndicatorElement = new ChartIndicatorElement
			{
				Antialiasinig = false,
				Color = Colors.DarkBlue,
				IsLegend = true,
				Indicator = new ParabolicSar(),
				Title = "Parabolic Sar",
				DrawStyle = ChartIndicatorDrawStyles.Dot,
			};
			_chartIndicatorElement.DrawTemplate.VisualTree.SetValue(Shape.FillProperty, new SolidColorBrush(Colors.DarkBlue));

			area.Elements.Add(_chartCandleElement);
			area.Elements.Add(_chartIndicatorElement);

			Chart.Areas.Add(area);
			Chart.IsAutoScroll = true;
		}

		protected override void OnClosing(CancelEventArgs e)
		{
			if (_trader != null)
			{
				_trader.StopExport();
				_trader.Disconnect();
			}

			base.OnClosing(e);
		}

		private void btnConnect_Click(object sender, RoutedEventArgs e)
		{
			_trader = new QuikTrader(_path);
			_candleManager = new CandleManager(_trader);

			_trader.NewSecurities += securities =>
			{
				if (_security.IsNull())
					_security = securities.FirstOrDefault(sec => sec.Code == _securityCode);
			};

			_trader.Connected += () => _trader.StartExport();

			_trader.Connect();
		}

		private void btnDraw_Click(object sender, RoutedEventArgs e)
		{
			_candleManager.Processing += ProcessCandle;

			var series = new CandleSeries(typeof(TimeFrameCandle), _security, TimeSpan.FromMinutes(1));
			_candleManager.Start(series);
		}

		private void ProcessCandle(CandleSeries series, Candle candle)
		{
			if (candle.State == CandleStates.Finished)
			{
				var value = _chartIndicatorElement.Indicator.Process(new CandleIndicatorValue(candle) { IsFinal = true });
				this.GuiAsync(() => Chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
				{
					{_chartCandleElement, candle},
					{_chartIndicatorElement, new ChartIndicatorValue(_chartIndicatorElement.Indicator, value)}
				}));
			}
			else
			{
				this.GuiAsync(() => Chart.ProcessCandle(_chartCandleElement, candle));
			}
		}

		private void btnCrossHair_Click(object sender, RoutedEventArgs e)
		{
			if (btnCrossHair.IsChecked.HasValue && btnCrossHair.IsChecked.Value)
				Chart.CrossHair = true;
			else
				Chart.CrossHair = false;
		}

		private void btnToolTip_Click(object sender, RoutedEventArgs e)
		{
			if (btnToolTip.IsChecked.HasValue && btnToolTip.IsChecked.Value)
				Chart.CrossHairTooltip = true;
			else
				Chart.CrossHairTooltip = false;
		}
	}
}

Спасибо: UsilaDobry

UsilaDobry

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


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

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Media;
using System.Windows.Shapes;
using Ecng.Collections;
using Ecng.Xaml;
using StockSharp.Algo;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Indicators.Trend;
using StockSharp.Logging;
using StockSharp.Quik;
using StockSharp.TraderConnection;
using StockSharp.Xaml;

namespace MARKET_SUCCESS
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow
    {
        private CandleManager _candleManager;                                //Менеджер свечей
        

        private readonly ChartCandleElement _chartCandleElement;             //Графический элемент свечи
        private readonly ChartIndicatorElement _chartParabolicElement;       //Графический элемент Parabolic SAR
        
        public MainWindow()
        {
            try
            {
                InitializeComponent();
                ConnectionInterface.SafeConnection = new SafeConnection(new QuikTrader(QuikTerminal.GetDefaultPath()));
                ConnectionInterface.SafeConnection.NewException += exc => this.GuiAsync(() => MessageBox.Show(exc.ToString()));

                _logManager.Listeners.Add(new GuiLogListener(MonitorControl));
                _logManager.Listeners.Add(new FileLogListener("log.txt"));
                _logManager.Sources.Add(ConnectionInterface.SafeConnection.Trader);

                var area = new ChartArea();
                Chart.ChartTheme = "ExpressionDark";

                _chartCandleElement = new ChartCandleElement
                    {
                    Antialiasinig = false,
                    UpBodyColor = Colors.Chartreuse,
                    UpWickColor = Colors.Chartreuse,
                    DownBodyColor = Colors.Red,
                    DownWickColor = Colors.Red,
                    IsLegend = true,
                };

                _chartParabolicElement = new ChartIndicatorElement
                {
                    Antialiasinig = false,
                    Color = Colors.Turquoise,
                    IsLegend = true,
                    Indicator = new ParabolicSar(),
                    Title = "Parabolic Sar",
                    DrawStyle = ChartIndicatorDrawStyles.Dot,
                };
                _chartParabolicElement.DrawTemplate.VisualTree.SetValue(Shape.FillProperty, new SolidColorBrush(Colors.Turquoise));

                area.Elements.Add(_chartCandleElement);
                area.Elements.Add(_chartParabolicElement);

                Chart.Areas.Add(area);
                Chart.IsAutoScroll = true;
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.ToString());
            }
        }

        private readonly LogManager _logManager = new LogManager();

                private void ChartButton_Click(object sender, RoutedEventArgs e)
        {
            //Проверяем, чтобы значение тайм-фрейма было указано
            if (TpTimeFrame.Value == null)
            {
                MessageBox.Show("Введите значение таймфрейм");
                return;
            }
            //Получаем тайм-фрейм
            var timeFrame = TpTimeFrame.Value.Value.TimeOfDay;
            //Инициируем процесс получения свечей и дальнейшей отрисовки
            RunProcessGetCandles(timeFrame);
        }

        /// <summary>
        /// Метод инициирования среды для получения свечей и дальнейшей отрисовки
        /// </summary>
        /// <param name="timeFrame">Тайм-фрейм для свечей</param>
        private void RunProcessGetCandles(TimeSpan timeFrame)
        {
            //Создаем менеджер свечей
            _candleManager = new CandleManager(ConnectionInterface.SafeConnection.Trader);

            //Получаем торговый инструмент
            var security = ConnectionInterface.SelectedSecurity;

            //Создаем серию свечей
            var series = new CandleSeries(typeof(TimeFrameCandle), security, timeFrame);
            //_candleSeries.WorkingTime.Times[0].Min = TimeSpan.FromHours(0);
            //_candleSeries.WorkingTime.Times[0].Max = TimeSpan.FromHours(24);
            //Подписываемся на событие обработки свечи
            _candleManager.Processing += ProcessCandle;
            //Запускаем получение свечей
            _candleManager.Start(series);
        }

        private void ProcessCandle(CandleSeries series, Candle candle)
        {
            try
            {
                if (candle.State == CandleStates.Finished)
                {
                    var value = _chartParabolicElement.Indicator.Process(new CandleIndicatorValue(candle) { IsFinal = true });
                    this.GuiAsync(() => Chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
                {
                    {_chartCandleElement, candle},
                    {_chartParabolicElement, new ChartIndicatorValue(_chartParabolicElement.Indicator, value)}
                }));
                }
                else
                {
                    this.GuiAsync(() => Chart.ProcessCandle(_chartCandleElement, candle));
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.ToString());
            }
        }


    }
}

А меняю таймфрейм, так он вообще всё одной полосой выводит...похоже масштабирование глючит...

Спасибо:

Moadip

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


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


		private void btnCrossHair_Click(object sender, RoutedEventArgs e)
		{
			if (btnCrossHair.IsChecked.HasValue && btnCrossHair.IsChecked.Value)
				Chart.CrossHair = true;
			else
				Chart.CrossHair = false;
		}

		private void btnToolTip_Click(object sender, RoutedEventArgs e)
		{
			if (btnToolTip.IsChecked.HasValue && btnToolTip.IsChecked.Value)
				Chart.CrossHairTooltip = true;
			else
				Chart.CrossHairTooltip = false;
		}

А меняю таймфрейм, так он вообще всё одной полосой выводит...похоже масштабирование глючит... Слева же видно что есть несколько точек по 0 цене, поэтому и перемасштабировано, чтобы все показать. Достаточно график прокрутить, чтобы не захватывались эти точки.

P.S.: Скриншоты не стоит запихивать в doc.

Спасибо: UsilaDobry

UsilaDobry

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


Moadip: P.S.: Скриншоты не стоит запихивать в doc.

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

Спасибо:

VassilSanych

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


У всех есть эта программа. Paint называется. Замечательно сохраняет в PNG.

Спасибо:

UsilaDobry

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


VassilSanych: У всех есть эта программа. Paint называется. Замечательно сохраняет в PNG.

Благодарю, век живи - век учись...

Спасибо:

alex123456

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


Не рисуется ни один индикатор в версии сборки 4.1.15(пробовал также 4.1.14, 4.1.13, 4.1.11). Свечной график рисуется нормально, как с промежутками(пустые места), так и без них. А вот индикаторы не рисуются как в самой области свечного графика(Are1), так и в отдельной области(Area2), как с пустыми местами (NoGapMode="False") так и без них (NoGapMode="true"), как со связаной областью(IsAligned = true), так и раздельной областью (IsAligned = false). Хотя в версии сборки 4.1.4 все строилось отлично, но MsChart был недостаток не было подсказок по свече(легенды), сейчас есть и легенда и подсказки по осям, но теперь не добавляется индикатор (Объём, Простая скользящая средняя и т.д.) В версии сборки 4.1.4 ошибка ArgumentNullException решалась через добавление кода ```xml <SX:Chart x:Name="_chart" IsIndexed ="False"/>

Спасибо:

alex123456

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


проблема решена

Спасибо:
<< < 32 33 34 

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

loading
clippy