Добрый день, коллеги. Пытаюсь склеить вчерашние сохранённые Гидрой данные (полный путь - c:\GidraR\RIU2@RTS\2012_07_11\trades.bin). После подключения и запуска DDE создаётся CandleManager и дальше как в документации по склейке свечек. В лог выводит свечи с начала текущего дня, за вчера не выводит. Подскажите пожалуйста, в чём может быть проблема? Прилагаю код.
using System;
using System.Threading;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Forms;
using System.ComponentModel;
using System.Configuration;
using Ecng.Common;
using Ecng.Xaml;
using Ecng.ComponentModel;
using StockSharp.BusinessEntities;
using StockSharp.Quik;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Candles.Compression;
using StockSharp.Algo.Storages;
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);
readonly DateTime _startTime = new DateTime(2012, 7, 11);
readonly DateTime _endTime = DateTime.MaxValue;
private const string _historyPath = @"c:\GidraR\RIU2@RTS\2012_07_11";
private readonly LogManager _logManager;
public Candle der = null;
public MainWindow()
{
InitializeComponent();
Path.Text = "c:\\Program Files\\QUIK\\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(0);
_isConnected = true;
btnExportDde.IsEnabled = true;
_trader.NewSecurities += securities =>
{
if (_instr1 == null)
{
_instr1 = securities.FirstOrDefault(sec => sec.Code == _secCode1);
}
};
}
_trader.Connect();
_isConnected = true;
btnConnect.Content = "Отключиться";
}
}
else
{
_trader.Disconnect();
_isConnected = false;
btnConnect.Content = "Подключиться";
}
}
private void btnStart_Click(object sender, RoutedEventArgs e)
{
_trader.AddInfoLog("Запуск получения свечек");
_candleManager = new CandleManager(_trader);
var storageRegistry = new StorageRegistry();
((LocalMarketDataDrive)storageRegistry.DefaultDrive).Path = _historyPath;
var cbs = new TradeStorageCandleBuilderSource { StorageRegistry = storageRegistry };
_candleManager.Sources.OfType<TimeFrameCandleBuilder>().Single().Sources.Add(cbs);
_candleManager.Processing += StopVisor;
_series = new CandleSeries(typeof(TimeFrameCandle), _instr1, _timeFrame);
_candleManager.Start(_series, _startTime, _endTime);
}
private void StopVisor(CandleSeries series, Candle candle)
{
if (candle.State == CandleStates.Finished)
{
der = _series.GetCandle<TimeFrameCandle>(0);
_trader.AddInfoLog(string.Format("|{0:T}|{1}|{2}|{3}|{4}|", der.CloseTime, der.OpenPrice, der.HighPrice, der.LowPrice, der.ClosePrice));
}
}
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;
}
}
}
Comentarios (12)
Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario
Код XAML.
Путь к тикам неверный, не должно там быть RIU2@RTS\2012_07_11
Еще один нюанс. Добавление источников должно проходить ДО запуска экспорта, иначе будут пропуски тиков.
У вас добавление источника Trader, при создании экземпляра класса CandleManager. И добавление в качестве источника файлов гидры
Происходит в обработчике нажатия на кнопку "Старт", которая я так понимаю нажимается после того как нажата кнопка "Экспорт DDE"
Добавление источников надо перенести в обработчик нажатия кнопки "Подключиться". Допустим так:
Esper, так и есть. Поставил путь с:\GidraR\ и всё заработало. Понятно теперь, что storageRegistry видит пути, созданные Гидрой (я пытался указать явно). Благодарю.
Moadip, спасибо за замечание. Изначально там и был код, но в процессе проб, перенёс. Сейчас вернул обратно. Кстати давно хотел сказать Вам спасибо за скелет робота. Ваши посты содержательны.
Добрый день, коллеги. Хочу ещё раз обратиться к Вам в этой теме. Добавил к вышенаписанному коду небольшой фрагмент рассчитывающий простую скользящую среднюю. Запускал в пятницу - подкачивает данные за четверг из хранилища, строит среднюю, далее за пятницу по DDE, строит среднюю. Вообщем всё нормально. Включаю сегодня - за пятницу подгружает, строит, доходит до понедельника - выдаёт ошибку. Причём первую свечу понедельника выдаёт, остальные нет. Если запускать без кода DrawMA(), то считывает свечи за пятницу - понедельник без ошибок. Думаю, что связанно с методом GetCandle(), именно при считывании данных из хранилища за пятницу, и дальнейшем получении данных по DDE в понедельник, т. к. на неделе таких проблем не было. Подскажите, пожалуйста, как это обойти? Заранее благодарен.
Запись в логе (читать снизу вверх):
QuikTrader | 16.07.2012 17:13:00.222 | Ошибка | System.InvalidOperationException: Невозможно изменить сформированную свечку. в StockSharp.Algo.Candles.Candle.ThrowIfFinished() в StockSharp.Algo.Candles.Compression.CandleBuilder
1.UpdateCandle(CandleSeries series, TCandle candle, ICandleBuilderSourceValue value) в StockSharp.Algo.Candles.Compression.CandleBuilder1.ProcessValue(CandleSeries series, Candle currentCandle, ICandleBuilderSourceValue value) в StockSharp.Algo.Candles.Compression.CandleBuilder1.OnNewValues(CandleSeries series, IEnumerable1 values) в StockSharp.Algo.Candles.Compression.CandleBuilder1.#=qqLF1yNlv8Y1iCs8201gCqwEWTHqUPr6NOKAboLZN3gc=.#=qZIvlEwumCnLOHChv0nHsiIC6spSmAHgVPmGRzuP_IIc=.#=qBVkmf24yUdAZHbJqngg1CQ==(IEnumerable1 #=q$BtNO0P60jQ3eV3pl_YPCg==) в #=q3vR2Bk8Bc6GNOs_cwI75FftaJTW2Uwcp0EOp9C1J4kU29dUY7RAcSR22BtL12y0Nc0DdM0dVIBhEF3E8OckZaw==.#=qpGEJppfTuh976_eXaWWyCQ==(CandleSeries #=qMUF6L0p0ecEtl0dZ4hBlLA==, #=qMKTRehQ7dpA7THrX$XNB8Q== #=qapfwAKc25gG2P8E_kCD3Fw==) в Ecng.Common.DelegateHelper.SafeInvoke[T1,T2](Action2 handler, T1 arg1, T2 arg2) в StockSharp.Algo.Candles.Compression.BaseCandleBuilderSource.RaiseProcessing(CandleSeries series, IEnumerable1 values) в StockSharp.Algo.Candles.Compression.RealTimeCandleBuilderSource1.AddNewValues(IEnumerable1 values) в Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) в Ecng.ComponentModel.EventsContainer1.Raise(IEnumerable`1 items)QuikTrader | 16.07.2012 17:12:57.569 | Ошибка | System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в Candles.MainWindow.DrawMA() в C:\Users\Пользователь\Documents\Visual Studio 2010\Projects\WpfApplication2\WpfApplication2\MainWindow.xaml.cs:строка 159 в Candles.MainWindow.StopVisor(CandleSeries series, Candle candle) в C:\Users\Пользователь\Documents\Visual Studio 2010\Projects\WpfApplication2\WpfApplication2\MainWindow.xaml.cs:строка 149 в System.Action
2.Invoke(T1 arg1, T2 arg2) в Ecng.Common.DelegateHelper.SafeInvoke[T1,T2](Action2 handler, T1 arg1, T2 arg2) в StockSharp.Algo.Candles.CandleManager.#=qJpMNGLwhBTGBC$zwZBAVKCh1tijPGRG_4RZ133Gut8I=.#=qGRBYJzrsOyd6PdZzWo7fFA==(Candle #=qEZYmvgjYlc$afCY9fBg04w==) в #=q3vR2Bk8Bc6GNOs_cwI75FftaJTW2Uwcp0EOp9C1J4kU29dUY7RAcSR22BtL12y0Nc0DdM0dVIBhEF3E8OckZaw==.#=qpGEJppfTuh976_eXaWWyCQ==(CandleSeries #=qMUF6L0p0ecEtl0dZ4hBlLA==, #=qMKTRehQ7dpA7THrX$XNB8Q== #=qapfwAKc25gG2P8E_kCD3Fw==) в System.Action2.Invoke(T1 arg1, T2 arg2) в Ecng.Common.DelegateHelper.SafeInvoke[T1,T2](Action2 handler, T1 arg1, T2 arg2) в StockSharp.Algo.Candles.Compression.CandleBuilder1.RaiseProcessing(CandleSeries series, Candle candle) в StockSharp.Algo.Candles.Compression.CandleBuilder1.OnNewValues(CandleSeries series, IEnumerable1 values) в StockSharp.Algo.Candles.Compression.CandleBuilder1.#=qqLF1yNlv8Y1iCs8201gCqwEWTHqUPr6NOKAboLZN3gc=.#=qZIvlEwumCnLOHChv0nHsiIC6spSmAHgVPmGRzuP_IIc=.#=qBVkmf24yUdAZHbJqngg1CQ==(IEnumerable1 #=q$BtNO0P60jQ3eV3pl_YPCg==) в #=q3vR2Bk8Bc6GNOs_cwI75FftaJTW2Uwcp0EOp9C1J4kU29dUY7RAcSR22BtL12y0Nc0DdM0dVIBhEF3E8OckZaw==.#=qpGEJppfTuh976_eXaWWyCQ==(CandleSeries #=qMUF6L0p0ecEtl0dZ4hBlLA==, #=qMKTRehQ7dpA7THrX$XNB8Q== #=qapfwAKc25gG2P8E_kCD3Fw==) в Ecng.Common.DelegateHelper.SafeInvoke[T1,T2](Action2 handler, T1 arg1, T2 arg2) в StockSharp.Algo.Candles.Compression.BaseCandleBuilderSource.RaiseProcessing(CandleSeries series, IEnumerable1 values) в StockSharp.Algo.Candles.Compression.RealTimeCandleBuilderSource1.AddNewValues(IEnumerable1 values) в Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) в Ecng.ComponentModel.EventsContainer1.Raise(IEnumerable1 items)QuikTrader | 16.07.2012 17:12:57.560 | | |10:01:00|136460|136460|135915|136135| QuikTrader | 16.07.2012 17:12:57.461 | | --------------------[23:50:00]--------------------------------Машка простая------------------[136431,19]----------------------- QuikTrader | 16.07.2012 17:12:57.461 | | |23:50:00|136495,00000|136525,00000|136435,00000|136475,00000| QuikTrader | 16.07.2012 17:12:55.023 | | --------------------[23:49:00]--------------------------------Машка простая------------------[136430,24]----------------------- QuikTrader | 16.07.2012 17:12:55.023 | | |23:49:00|136525,00000|136530,00000|136470,00000|136500,00000| QuikTrader | 16.07.2012 17:12:55.011 | | --------------------[23:48:00]--------------------------------Машка простая------------------[136427,62]----------------------- QuikTrader | 16.07.2012 17:12:55.011 | | |23:48:00|136440,00000|136530,00000|136430,00000|136530,00000| QuikTrader | 16.07.2012 17:12:54.990 | | --------------------[23:47:00]--------------------------------Машка простая------------------[136422,62]----------------------- QuikTrader | 16.07.2012 17:12:54.990 | | |23:47:00|136500,00000|136510,00000|136440,00000|136445,00000| QuikTrader | 16.07.2012 17:12:54.984 | | --------------------[23:46:00]--------------------------------Машка простая------------------[136425,00]----------------------- QuikTrader | 16.07.2012 17:12:54.984 | | |23:46:00|136535,00000|136540,00000|136450,00000|136510,00000| QuikTrader | 16.07.2012 17:12:54.963 | | --------------------[23:45:00]--------------------------------Машка простая------------------[136423,57]----------------------- QuikTrader | 16.07.2012 17:12:54.963 | | |23:45:00|136520,00000|136550,00000|136500,00000|136535,00000| QuikTrader | 16.07.2012 17:12:54.951 | | --------------------[23:44:00]--------------------------------Машка простая------------------[136419,52]----------------------- QuikTrader | 16.07.2012 17:12:54.951 | | |23:44:00|136490,00000|136540,00000|136485,00000|136525,00000| QuikTrader | 16.07.2012 17:12:54.938 | | --------------------[23:43:00]--------------------------------Машка простая------------------[136415,71]----------------------- QuikTrader | 16.07.2012 17:12:54.938 | | |23:43:00|136465,00000|136515,00000|136460,00000|136490,00000| QuikTrader | 16.07.2012 17:12:54.919 | | --------------------[23:42:00]--------------------------------Машка простая------------------[136413,33]----------------------- QuikTrader | 16.07.2012 17:12:54.919 | | |23:42:00|136410,00000|136490,00000|136400,00000|136480,00000| QuikTrader | 16.07.2012 17:12:54.911 | | --------------------[23:41:00]--------------------------------Машка простая------------------[136411,90]----------------------- QuikTrader | 16.07.2012 17:12:54.911 | | |23:41:00|136430,00000|136445,00000|136405,00000|136410,00000| QuikTrader | 16.07.2012 17:12:54.906 | | --------------------[23:40:00]--------------------------------Машка простая------------------[136412,86]----------------------- QuikTrader | 16.07.2012 17:12:54.906 | | |23:40:00|136400,00000|136460,00000|136400,00000|136430,00000|
Код с скользящей средней.
Подключал сегодня (17.07) робота, берёт данные из хранилища за понедельник, DDE за вторник, всё нормально работает. Если закачивать данные (из хранилища) с пятницы, то при переходе на данные (из хранилища) за понедельник программа стопорится, и выдаёт исключения подобные вышенаписанным. Некритично, но наверное баг.
Я так и не понял, какой баг.
Вопрос: у вас стоит форматированный вывод времени свечки
который выводит только время без даты. Выводили ли вы свечки с датой? Если да (выводили с датой), то в чем магия?
С уважением GII.
Добрый день!
Баг ли, не могу утверждать но проблема есть. Тестирую робота на "Quik-Junior", StockSharp v4.1.2. В результате долгих и мучительных опытов выяснилось что, на рабочем "Quik" данные склеиваются, а при работе с "Quik-Junior" нет. Возможно это связанно с разными Id Ц.Б. Так для "Quik" Id="SBER@EQBR" (в соответствии со спецификацией контракта), а для "Quik-Junior" Id="SBER@QJSIM".
С уважением Gii