← Zurück

Получение свечки

Здравствуйте. Вот я решил получить свечку по номеру средствами GetCandle. И проблема:

при вызове этой функции - ошибка: "Ссылка на объект не указывает на экземпляр объекта" За основу я взял пример SampleCandles. кинул кнопку и вбил код:


var _series = new CandleSeries(typeof(TimeFrameCandle), SelectedSecurity, TimeSpan.FromMinutes(1));
var cand = _series.GetCandles(1);

SelectedSecurity не null. CandleManager объявлен. Но при вызове функции получения свечки такая беда. подскажите - в чем может быть проблема. ПС: как я понимаю, CandleManager работает на основе таблицы всех сделок? Тогда как можно данные брать из-за другой день

War dieses Thema hilfreich?

Thema teilen

Kommentare (12)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Alexander
Alexander

Стэктрэйс нужен

С финама\ртс можно получать всё. См. на гидру, она это делает.

eddardd
eddardd Autor

Вот это в exception:

System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в StockSharp.Algo.Candles.CandleHelper.GetCandles(CandleSeries series, Int32 candleCount) в SampleCandles.MainWindow.FindPathClick(Object sender, RoutedEventArgs e) в D:\Install\Stock# 4.1.1\Samples\Quik\SampleCandles\MainWindow.xaml.cs:строка 44

Alexander
Alexander

series чему равно?

eddardd
eddardd Autor

Извините, не тот стектрейс. Вот этот:

System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в StockSharp.Algo.Candles.CandleHelper.GetCandle(CandleSeries series, Int32 candleIndex) в SampleCandles.MainWindow.FindPathClick(Object sender, RoutedEventArgs e) в D:\Install\Stock# 4.1.1\Samples\Quik\SampleCandles\MainWindow.xaml.cs:строка 44

Но ошибка та самая. Исходя из этого тыц нужно использовать эту функцию как GetCandle(CandleSeries series, Int32 candleIndex), но я не могу таким образом вызвать функцию. Получаеться вихвать только

var cand = _series.GetCandles(1);

серию возвращаю вот этим действием:

var _series = new CandleSeries(typeof(TimeFrameCandle), SelectedSecurity, TimeSpan.FromMinutes(1));

но тут ексепшн вылазит.

_series.GetCandles(1) сделал наподобие Вашего туториала: тиц там внизу

Alexander
Alexander

Ничего не понял. С самого начала напишите

  1. стэктрейс
  2. чему равны все параметры в вызываемом методе. Лучше просто делать ToString() для параметров, я пойму.
eddardd
eddardd Autor

Стектрейс:

System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в StockSharp.Algo.Candles.CandleHelper.GetCandle(CandleSeries series, Int32 candleIndex) в SampleCandles.MainWindow.FindPathClick(Object sender, RoutedEventArgs e) в D:\Install\Stock# 4.1.1\Samples\Quik\SampleCandles\MainWindow.xaml.cs:строка 44 Параметры:

SelectedSecurity:

RIU2@UX

TimeSpan.FromMinutes(1)

00:01:00

_series

TimeFrameCandle RIU2@UX 00:01:00

Alexander
Alexander

series.CandleManager чему равен? Если null - то читайте доку как надо работать со свечками, см. примере.

Если нет - будем разбираться дальше.

eddardd
eddardd Autor

Действительно null. Делал за этим примером ТИЦ и такое получается. Правда я не рисую график. Хотя б без визуализации

Moadip
Moadip

Написал небольшой пример для проверки.

CS & XAML


using System;
using System.Linq;
using System.Windows;
using System.Windows.Forms;
using System.ComponentModel;
using Ecng.Common;
using Ecng.Xaml;
using StockSharp.BusinessEntities;
using StockSharp.Quik;
using StockSharp.Algo.Candles;
using StockSharp.Xaml;
using StockSharp.Algo.Logging;
using MessageBox = System.Windows.MessageBox;

namespace Candles
{
	public partial class MainWindow
	{
		QuikTrader _trader;

		private Security _instr1;
		const string _secCode1 = "RIU2";

        private CandleManager _candleManager;
	    private CandleSeries _series;

	    readonly TimeSpan _timeFrame = TimeSpan.FromMinutes(1);

	    private readonly LogManager _logManager; 

		public MainWindow()
		{
			InitializeComponent();
            Path.Text = "e:\\Program Files\\QUIK\\";

            _logManager = new LogManager();
            _logManager.Listeners.Add(new GuiLogListener(logcontrol));
		}

		private void FindPath_Click(object sender, RoutedEventArgs e)
		{
			var dlg = new FolderBrowserDialog();

			if (!Path.Text.IsEmpty())
				dlg.SelectedPath = Path.Text;

			if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
			{
				Path.Text = dlg.SelectedPath;
			}
		}

		bool _isConnected;

		private void btnConnect_Click(object sender, RoutedEventArgs e)
		{
			if (!_isConnected)
			{
				if (Path.Text.IsEmpty())
					MessageBox.Show(this, "Путь к Quik не выбран");
				else
				{
					if (_trader == null)
					{
                        _trader = new QuikTrader(Path.Text);
                        _logManager.Sources.Add(_trader);
                        _trader.ReConnectionSettings.Interval = TimeSpan.FromSeconds(10);
                        _trader.ReConnectionSettings.WorkingTime = Exchange.Rts.WorkingTime;
                        _trader.ReConnectionSettings.ConnectionRestored += () => this.GuiAsync(() => MessageBox.Show(this, "Соединение восстановлено"));
                        _trader.MarketTimeOffset = TimeSpan.FromHours(-3);

						_isConnected = true;

					    btnExportDde.IsEnabled = true;

						_trader.NewSecurities += securities =>
						{
							if (_instr1 == null)
							{
								_instr1 = securities.FirstOrDefault(sec => sec.Code == _secCode1);
							}

						};

						_candleManager = new CandleManager(_trader);
					}

					_trader.Connect();

					_isConnected = true;
					btnConnect.Content = "Отключиться";
				}
			}
			else
			{
				_trader.Disconnect();

				_isConnected = false;
				btnConnect.Content = "Подключиться";
			}
		}

        private void btnStart_Click(object sender, RoutedEventArgs e)
        {
            _series = new CandleSeries(typeof(TimeFrameCandle), _instr1, _timeFrame);

            _candleManager.Start(_series);
            _trader.AddInfoLog("Запуск получения свечек");
        }
     

        private void Window_Closing(object sender, CancelEventArgs e)
        {
            if (_trader != null)
            {
                if (_isDdeStarted) StopDde();
                _trader.Dispose();
            }
        }

        private void btnExportDde_Click(object sender, RoutedEventArgs e)
        {
            if (_isDdeStarted) StopDde();
            else StartDde();
        }

        bool _isDdeStarted;

        private void StartDde()
        {
            _trader.StartExport();
            _isDdeStarted = true;
        }

        private void StopDde()
        {
            _trader.StopExport();
            _isDdeStarted = false;
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            _trader.AddInfoLog("Свечка OpenTime = {0}", _series.GetCandle<TimeFrameCandle>(1).OpenTime);
        }
    }
}




<Window x:Class="Candles.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:EcngTradingXaml="clr-namespace:StockSharp.Xaml;assembly=StockSharp.Xaml"
        Title="" Height="282" Width="614" Closing="Window_Closing" Topmost="True" WindowStartupLocation="CenterScreen">
    <Grid>
        <Grid  HorizontalAlignment="Left" Name="grid1" VerticalAlignment="Top" Margin="12,12,0,0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="72" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Button Content="Подключиться" Height="23" HorizontalAlignment="Left" Name="btnConnect" VerticalAlignment="Top" Width="100" Click="btnConnect_Click" Grid.Row="1" />
            <Button Content="Экспорт DDE" Height="23" HorizontalAlignment="Left" Name="btnExportDde" VerticalAlignment="Top" Width="100" Click="btnExportDde_Click" IsEnabled="False" Grid.Column="1" Grid.Row="1" />
            <Button Content="Старт" Height="23" Name="btnStart" VerticalAlignment="Top" Click="btnStart_Click" HorizontalAlignment="Left" Width="100" Grid.Column="2" Grid.ColumnSpan="2" Grid.Row="1" />
            <TextBox Height="23" HorizontalAlignment="Left" Name="Path" VerticalAlignment="Top" Width="272" Grid.ColumnSpan="3"/>
            <Button Content="..." Name="FindPath" Click="FindPath_Click" HorizontalAlignment="Left" Width="28" Height="23" VerticalAlignment="Top" Grid.Column="3" />
        </Grid>
        <EcngTradingXaml:LogControl Margin="12,64,10,10" Name="logcontrol" />
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="318,35,0,0" Name="button1" VerticalAlignment="Top" Width="88" Click="button1_Click" />
    </Grid>
</Window>

По нажатию на кнопку берется время предпоследней свечки _series.GetCandle<TimeFrameCandle>(1).OpenTime Время такое странное потому что после запуска экспорта по dde начал нажимать на кнопку button и тики еще не успели все подгрузиться.

Вы после того как создали серию _series = new CandleSeries(typeof(TimeFrameCandle), SelectedSecurity, TimeSpan.FromMinutes(1))

Вызываете метод CandleManager.Start() с созданной серией _candleManager.Start(_series)?

eddardd
eddardd Autor

Спасибо за ответ. Да, вызывал. Но ничего не было. По поводу Вашего примера.. У меня не хочет запускатся, проблема в :

_trader.AddInfoLog("Свечка OpenTime = {0}", _series.GetCandle<TimeFrameCandle>(1).OpenTime);

Ошибка: > вместе с аргументами-типами нельзя использовать не универсальный метод ...CandleHelper.GetCandle(StockSharp.Algo.Candles.CandleSeries,int)

Извините за навязчивость, но в чем может быть проблема?

Moadip
Moadip

Сборка какая?

Скачайте последнюю с CodePlex

Dll брать из ветки trunk.

eddardd
eddardd Autor

Сборка 4.1.1. Иду качать🙂