← Zurück

помогите со свечками

я решительно не понимаю, как мне получить свечку за прошедшее время. мой код private QuikTrader _trader; private readonly TimeSpan _timeFrame = TimeSpan.FromMinutes(1);

_candleManager_lkoh = new CandleManager(_trader); series_lkoh = new CandleSeries(typeof(TimeFrameCandle), _lkoh, _timeFrame); _candleManager_lkoh.Start(series_lkoh); var candle_lkoh = series_lkoh.GetCandle(1); MessageBox.Show(candle_lkoh.ClosePrice.ToString()); выдает неверные данные в течение 1 минуты. Просветите нуба!

War dieses Thema hilfreich?

Thema teilen

Kommentare (16)

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

OvcharenkoVI
OvcharenkoVI

что то вопрос не понятен

tantin
tantin Autor

почему в candle_lkoh не записываеться историческая свечка?(в данном случае предпоследняя, то есть уже должна быть сформирована), может я вообще не понимаю принципов получения исторических свечей? такое ощущение что видит только свечки, которые сформировались за время работы программы.

OvcharenkoVI
OvcharenkoVI

tantin: почему в candle_lkoh не записываеться историческая свечка?(в данном случае предпоследняя, то есть уже должна быть сформирована), может я вообще не понимаю принципов получения исторических свечей? такое ощущение что видит только свечки, которые сформировались за время работы программы.

Так и есть. Свечки строятся по сделкам в реал-тайме. В квике нет возможности получения исторических свечек с сервера. Пользуйтесь гидрой и примером SampleSMA(там показано, как из файла создать свечки)

Доктор Сальватор

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

tantin
tantin Autor

спасибо, заодно тогда по гидре вопрос, мне что нужно постоянно скачивать данные за последние несколько часов? Я думал гидра только для массовой выгрузки котировок, для удобности тестирования на больших временных промежутках. И вообще как вы, прожженные ребята, делаете в том случае, если вам нужны для робота котировки за последние несколько часов? Не ругайте меня, потому что манами гидры пока не знакомился даже, просто хочется побыстрее получить ответ.

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

OvcharenkoVI
OvcharenkoVI

Доктор Сальватор тоже истину глаголит. Я использую Альфа-Директ, тут можно выгрузить свечи с сервера. По поводу старта экспорта - он, наверно, имел ввиду старт серии до старта экспорта сделок, хотя метод корявый. Попробуйте со скриптом на qpile

Доктор Сальватор

По поводу старта экспорта - он, наверно, имел ввиду старт серии до старта экспорта сделок Да, это я и имел ввиду. tantin, обратите внимание на пример SampleCandles. Вот как он работает:

  1. Подключаемся
  2. Запускаем экспорт DDE командой _trader.StartExport(new[] { _trader.SecuritiesTable, _trader.TradesTable }); То есть начинаем экспорт таблицы инструментов и таблицы всех сделок.
  3. Выбираем инструмент, тип свечи и таймфрейм.
  4. Вызываем окно с графиком.

Если время, прошедшее между действиями 2 и 4 составит секунд 5-10, то график, который начинается с 10:00, вы не увидите. Он начнётся с 11:00 или более позднего времени. Это происходит от того, что экспорт таблицы всех сделок начался до того, как вы дадите команду _candleManager.Start(series) в методе ShowChartClick.

я решительно не понимаю, как мне получить свечку за прошедшее время Поэтому, если вы хотите получить свечку за сегодняшний день, то я бы сделал так:

_candleManager_lkoh = new CandleManager(_trader); _trader.StartExport(new[] );

/* Здесь надо разместить код, который присвоит переменной Instrument значение инструмента, с которым вы хотите работать. Это значение можно получить из таблицы инструментов, экспорт которой вы запустили*/

series_lkoh = new CandleSeries(typeof(TimeFrameCandle), Instrument, _timeFrame); _candleManager_lkoh.Start(series_lkoh); _trader.StartExport(new[] );

var candle_lkoh = series_lkoh.GetCandle(1); MessageBox.Show(candle_lkoh.ClosePrice.ToString());

Если же вы хотите получить свечку за вчерашний или позавчерашний день, то вам надо использовать либо Гидру - посмотрите в документации раздел Свечки/Склеивание свечек, история+реалтайм. Либо используйте текстовый файл с котировками как в примере SampleSma.

Подозреваю, что есть более удачные варианты, чем предложил я. Буду рад услышать мнения других участников.

esper
esper

Доктор Сальватор: Если время, прошедшее между действиями 2 и 4 составит секунд 5-10, то график, который начинается с 10:00, вы не увидите. Он начнётся с 11:00 или более позднего времени. Это происходит от того, что экспорт таблицы всех сделок начался до того, как вы дадите команду _candleManager.Start(series) в методе ShowChartClick. Попробуйте вместо _candleManager.Start(series) вызвать _candleManager.Start(series, DateTime.Today, DateTime.Max), т.е. явно указать за какой период нужны свечки.

Доктор Сальватор

esper: Попробуйте вместо _candleManager.Start(series) вызвать _candleManager.Start(series, DateTime.Today, DateTime.Max), т.е. явно указать за какой период нужны свечки. Сегодня работает резервный сервер QUIK в Новосибирске, поэтому я попробовал сделать замену, предложенную вами, в примере SampleCandles. Не получилось. Котировки не закачиваются с 10:00.

Alexander
Alexander

используйте 4.1.2

tantin
tantin Autor

esper: Попробуйте вместо _candleManager.Start(series) вызвать _candleManager.Start(series, DateTime.Today, DateTime.Max), т.е. явно указать за какой период нужны свечки. пробовал еще до того как к вам обратиться, никаких изменений.

По поводу экспорта,в моем коде он вызываеться так - _trader.StartExport(); а не _trader.StartExport(new[] { _trader.SecuritiesTable, _trader.TradesTable }); возможно это и играет решающую роль, я проверю в понедельник. Даже скорее всего это и есть. по поводу

Доктор Сальватор: tantin, обратите внимание на пример SampleCandles. Вот как он работает:

  1. Подключаемся
  2. Запускаем экспорт DDE командой _trader.StartExport(new[] { _trader.SecuritiesTable, _trader.TradesTable }); То есть начинаем экспорт таблицы инструментов и таблицы всех сделок.
  3. Выбираем инструмент, тип свечи и таймфрейм.
  4. Вызываем окно с графиком.

Если время, прошедшее между действиями 2 и 4 составит секунд 5-10, то график, который начинается с 10:00, вы не увидите. Он начнётся с 11:00 или более позднего времени. Это происходит от того, что экспорт таблицы всех сделок начался до того, как вы дадите команду _candleManager.Start(series) в методе ShowChartClick. какбе он(экспорт) и в вашей последовательности действий стоит до вызова графика, и как влияют 5-10 секунд тоже непонятно. Но не суть - мне то как раз график не нужен совершенно, только свечу.

OvcharenkoVI: Доктор Сальватор тоже истину глаголит. Я использую Альфа-Директ, тут можно выгрузить свечи с сервера. По поводу старта экспорта - он, наверно, имел ввиду старт серии до старта экспорта сделок, хотя метод корявый. Попробуйте со скриптом на qpile

Я пока только с Квиком работаю.

Alexander Mukhanchikov: используйте 4.1.2 а где ее взять то? по ссылке, последнее обновление за 29 мая

Доктор Сальватор

какбе он(экспорт) и в вашей последовательности действий стоит до вызова графика Команда _trader.StartExport(new[] ) экспортрует только таблицу инструментов. А свечки получают из таблицы всех сделок. Посмотрите ещё раз внимательно код, который я привёл.

и как влияют 5-10 секунд тоже непонятно Запустите в понедельник этот пример и поэкспериментируйте с 5-10 секундами. Ведь свечки для графика берутся тоже из серии свечек. Просто вы вместо графика используете MessageBox.Show(candle_lkoh.ClosePrice.ToString());

Я пока только с Квиком работаю. Посмотрите по этой ссылке http://www.quik.ru/user/download/ в разделе "Прочее" ссылку "Краткая инструкция по языку QPILE ". А также прочитайте раздел документации S# "QUIK/Экспорт произвольных таблиц"

а где ее взять то? по ссылке, последнее обновление за 29 мая Сходите по ссылке http://stocksharp.codeplex.com/. Раздел "source code" содержит последние обновления.

tantin
tantin
tantin Autor

ок всем спасибо за советы, в понедельник все потестирую, если все получиться, выложу на ваше суждение прогу, и потом возможно ее можно будет как тестовый пример можно использовать, для новичков полезно будет наверно.

tantin
tantin Autor

все изменил как вы советовали - не помогло, пошел курить "экспорт произвольных таблиц", а вы то сами как свечки экспортите? Ps все в порядке - разобрался, все работает, в ближайшее время выложу прогу на ваше суждение

Arhn
Arhn

Ребята, может я не в тему, но это потому что у меня уже мозги вскипели. Ни как не могу понять, что я делаю не так, вроде все по мануалу, но свечки не появляются, один пустой график.

XAML

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Charting="clr-namespace:StockSharp.Xaml.Charting;assembly=StockSharp.Xaml" xmlns:Custom="http://schemas.stocksharp.com/xaml" x:Class="TestWpfA.MainWindow"
        Title="MainWindow" Height="600" Width="800">
    <Grid>
        <Button x:Name="Cnnect" Content="Connect" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="75" Click="Cnnect_Click" Height="33"/>
        <Button x:Name="Start" Content="Start" HorizontalAlignment="Left" Margin="697,10,0,0" VerticalAlignment="Top" Width="75" Click="Start_Click" Height="33"/>

        <Charting:Chart x:Name="Chart" ChartTheme="Chrome" IsAutoScroll="True" CrossHair="True" Margin="10,62,10,10"/>
        <ComboBox x:Name="PortfoliosComboBox" HorizontalAlignment="Left" Margin="95,21,0,0" VerticalAlignment="Top" Width="120"/>
        <Label x:Name="Portfolius" Content="Портфель:" HorizontalAlignment="Left" Margin="104,-2,0,0" VerticalAlignment="Top"/>
        <ComboBox x:Name="SecurityComboBox" HorizontalAlignment="Left" Margin="223,21,0,0" VerticalAlignment="Top" Width="120"/>
        <Label x:Name="Securities" Content="Инструмент:" HorizontalAlignment="Left" Margin="231,-2,0,0" VerticalAlignment="Top"/>
        <DatePicker x:Name="DatePickerFrom" HorizontalAlignment="Left" Margin="452,19,0,0" VerticalAlignment="Top" SelectedDateFormat="Short" Text="Дата с:" IsTodayHighlighted="True" IsEnabled="False"/>
        <DatePicker x:Name="DatePickerTo" HorizontalAlignment="Left" Margin="585,19,0,0" VerticalAlignment="Top" Text="Дата по:" IsEnabled="False"/>
        <Label x:Name="LabelTo" Content="по" HorizontalAlignment="Left" Margin="558,17,0,0" VerticalAlignment="Top" RenderTransformOrigin="1.485,0.565" IsEnabled="False"/>
        <CheckBox x:Name="CheckBoxPeriod" Content="Выбрать&#xD;&#xA;период" HorizontalAlignment="Left" Margin="362,17,0,0" VerticalAlignment="Top" Click="CheckBoxPeriod_Click"/>
        <Label x:Name="LabelFrom" Content="с:" HorizontalAlignment="Left" Margin="430,17,0,0" VerticalAlignment="Top" IsEnabled="False"/>

    </Grid>
</Window>

КОД

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using Ecng.Collections;
using Ecng.Common;
using Ecng.Configuration;
using Ecng.Xaml;

using StockSharp.Quik;
using StockSharp.Algo;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Algo.Testing;
using StockSharp.BusinessEntities;
using StockSharp.Logging;
using StockSharp.Messages;
using StockSharp.Xaml.Charting;

namespace TestWpfA
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private QuikTrader _trader;
        private CandleSeries _candleSeries;
        private CandleManager _candleManager;
        private ChartCandleElement _chartCandleElement;
        private ChartArea _chartArea;
        private void Cnnect_Click(object sender, RoutedEventArgs e)
        {
            _trader = new QuikTrader(QuikTerminal.GetDefaultPath());

            _trader.NewSecurities += securities => this.GuiAsync(() =>
            {
                SecurityComboBox.ItemsSource = _trader.Securities;
            });

            _trader.NewPortfolios += portfolios => this.GuiAsync(() =>
            {
                PortfoliosComboBox.ItemsSource = _trader.Portfolios;
            });

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

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

            _candleSeries = new CandleSeries(typeof(TimeFrameCandle), (Security)SecurityComboBox.SelectedItem, TimeSpan.FromMinutes(1));
            
            _chartCandleElement = new ChartCandleElement();

            _chartArea = new ChartArea();
            _chartArea.Elements.Add(_chartCandleElement);

            Chart.Areas.Add(_chartArea);

            _candleManager.Processing += DrawCandle;
            
            if (CheckBoxPeriod.IsChecked == true)
            {
                _candleManager.Start(_candleSeries, DatePickerFrom.SelectedDate.Value, DatePickerTo.SelectedDate.Value);
            }
            else
            {
                _candleManager.Start(_candleSeries);
            }
            
        }

        private void DrawCandle(CandleSeries series, Candle candle)
        {
           if (candle.State == CandleStates.Finished) this.GuiAsync(() => Chart.ProcessCandle(_chartCandleElement, candle));
        }

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

            base.OnClosing(e);
        }

        private void CheckBoxPeriod_Click(object sender, RoutedEventArgs e)
        {
            if (CheckBoxPeriod.IsChecked == true)
            {
                this.LabelFrom.IsEnabled = true;
                this.DatePickerFrom.IsEnabled = true;
                this.LabelTo.IsEnabled = true;
                this.DatePickerTo.IsEnabled = true;
            }
            else
            {
                this.LabelFrom.IsEnabled = false;
                this.DatePickerFrom.IsEnabled = false;
                this.LabelTo.IsEnabled = false;
                this.DatePickerTo.IsEnabled = false;
            }
        }        
    }

Arhn
Arhn

Ребята, извините пожалуйста, оказывается все работает. Просто я до этого проверял на ММВБ после закрытия и на демке.😊