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

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


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

Месяц назад я [url=http://stocksharp.com/forum/1491/A-nie-zabatsat--li-nam-indiuki/]публиковал призыв[/url] о совместной разработке индикаторов на базе C#. Прошел месяц, мною было сделано 3 стандартных индикатора SMA, EMA и WMA. И ни строчки кода ни от одного пользователя S#. Каждый день задают вопросы (причем, большинство явно не относящиеся к S# как таковому), получают ответы, но свою помощь предложить не хотят. Стесняются, наверное.

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

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

Сделав 5 индикаторов, вы получается бонус - [b][url=http://stocksharp.com/forum/1713/Futbolki/]кружку с символикой S#[/url][/b].

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

[b]Что сделано сейчас[/b]: [list=1] []Acceleration []Alligator []AwesomeOscillator []Fractals []GatorOscillator []MarketFacilitationIndex []BollingerBands []ExponentialMovingAverage []Macd []ParabolicSar []RAVI []SimpleMovingAverage []SmoothedMovingAverage []StandartDeviation []VolumeWeightedMovingAverage []WeightedMovingAverage []WilderMovingAverage []Adx []Atr []ChandeMomentumOscillator []CommodityChannelIndex []DiMinus []DiPlus []Dx []Ichimoku []Momentum []RateOfChange []RelativeStrengthIndex []RVI []TrueRange []DetrendedPriceOscillator []Highest []LinearReg []LinearRegression []LinearRegSlope []Lowest []MeanDeviation []MedianPrice []Peak []PeakBar []QStick []RSquared []StandardError []StochK []Sum []Trix []Trough []TroughBar []UltimateOsc []VerticalHorizontalFilter []Vidya []Volatility [*]WilliamsR [/list]


Теги:


Спасибо:


<< < 32 33 34 
Moadip

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


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

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

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

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

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

Спасибо:

UsilaDobry

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


[quote=Moadip;25733] О каком индикаторе вообще идет речь? На картинке какие то линии без опознавательных знаков.[/quote]

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

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

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

  1. инициализация

[code=csharp]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);
        }[/code]
  1. получение значения индикатора

[code=csharp]if (_parabolic != null) {

                var valueSar = _parabolic.Process(candle);
                  
                _chartParabolicValue = new ChartIndicatorValue(_parabolic, valueSar);
            }[/code]
  1. вывод на график

[code=csharp]if (_chartParabolicElement != null && _chartParabolicValue != null) { this.GuiAsync(() => Chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object> { {_chartParabolicElement, chartParabolicValue} //для Parabolic SAR }));[/code]

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

Спасибо:

Moadip

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


[URL=http://fastpic.ru/view/48/2013/0502/c360bd341ef679cb70a984794acc14e7.png.html][IMG]http://i48.fastpic.ru/thumb/2013/0502/e7/c360bd341ef679cb70a984794acc14e7.jpeg[/IMG][/URL]

[URL=http://fastpic.ru/view/46/2013/0502/5a5e308a4871e79bc60448416baf95cf.png.html][IMG]http://i46.fastpic.ru/thumb/2013/0502/cf/5a5e308a4871e79bc60448416baf95cf.jpeg[/IMG][/URL]

[b]xaml:[/b] [SPOILER] [code=csharp]

<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>
[/code] [/SPOILER] [b]cs:[/b] [SPOILER] [code=csharp] 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;
	}
}

} [/code] [/SPOILER]

Спасибо: UsilaDobry

UsilaDobry

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


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

[SPOILER][code=csharp]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 { ///

/// Логика взаимодействия для MainWindow.xaml /// 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());
        }
    }


}

}[/code][/SPOILER]

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

Спасибо:

Moadip

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


[quote]у меня не показывается легенда ни по индикатору, ни по свечам[/quote] Может потому что их надо вкючить? [code=csharp] 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;
	}

[/code]

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

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

Спасибо: UsilaDobry

UsilaDobry

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


[quote=Moadip;25804] P.S.: Скриншоты не стоит запихивать в doc.[/quote]

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

Спасибо:

VassilSanych

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


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

Спасибо:

UsilaDobry

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


[quote=VassilSanych;25807]У всех есть эта программа. Paint называется. Замечательно сохраняет в PNG.[/quote]

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

Спасибо:

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 решалась через добавление кода [code=xml]<SX:Chart x:Name="_chart" IsIndexed ="False"/>[/code] - ряды не индексированы. Сейчас это не помогает. Мне думается проблема ещё со StockSharp.Xaml(см прилагаемые файлы). Прошу помощи?

Спасибо:

alex123456

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


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

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

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

loading
clippy