Moadip
|
Дата: 30.03.2012
|
|
|
|
Разбираюсь с 4.1 столкнулся с проблемой. В 4.0 Код
CandleManager _candleManager;
readonly TimeSpan _timeFrame = TimeSpan.FromMinutes(5);
// Начальная и конечная дата для подгрузки истории
readonly DateTime _startTime = DateTime.Today - TimeSpan.FromDays(2);
readonly DateTime _stopTime = DateTime.Today;
// Путь к данным истории
private const string _historyPath = "e:\\DataServer\\";
...
_candleManager = new CandleManager();
_candleManager.CandlesStarted += (token, candles) => DrawCandles(candles);
_candleManager.CandlesChanged += (token, candles) => DrawCandles(candles);
...
private void btnDrawCandleHistory_Click(object sender, RoutedEventArgs e)
{
var storage = new TradingStorage(new InMemoryStorage()) { BasePath = _historyPath };
var builder = new CandleBuilder(new TradeStorageCandleBuilderSource(storage) { From = _startTime, To = _stopTime });
_candleManager.Sources.Add(builder);
_candleManager.RegisterTimeFrameCandles(_instr1, _timeFrame);
}
private void bntDrawCandleReal_Click(object sender, RoutedEventArgs e)
{
_candleManager.Sources.Add(new CandleBuilder(new TradeCandleBuilderSource(_trader)));
_candleManager.RegisterTimeFrameCandles(_instr1, _timeFrame);
}
Два метода, один рисует свечки за сегодняшний день, другой - на основе истории. Делаю по аналогии в 4.1 Код
CandleManager _candleManager;
readonly TimeSpan _timeFrame = TimeSpan.FromMinutes(5);
// Начальная и конечная дата для подгрузки истории
readonly DateTime _startTime = DateTime.Today - TimeSpan.FromDays(2);
readonly DateTime _stopTime = DateTime.Today;
// Путь к данным истории
private const string _historyPath = "e:\\DataServer\\";
...
_candleManager = new CandleManager();
_candleManager.Processing += DrawCandles;
...
private void btnDrawCandleHistory_Click(object sender, RoutedEventArgs e)
{
var storage = new TradingStorage(new InMemoryStorage());
var cbs = new TradeStorageCandleBuilderSource() { BasePath = _historyPath, Storage = storage };
var cb = new TimeFrameCandleBuilder();
cb.Sources.Add(cbs);
_candleManager.Sources.Add(cb);
var series = new CandleSeries(typeof(TimeFrameCandle), _instr1, _timeFrame);
_candleManager.Start(series, _startTime, _stopTime);
}
private void bntDrawCandleReal_Click(object sender, RoutedEventArgs e)
{
var cbs = new TradeCandleBuilderSource(_trader);
var cb = new TimeFrameCandleBuilder();
cb.Sources.Add(cbs);
_candleManager.Sources.Add(cb);
var series = new CandleSeries(typeof (TimeFrameCandle), _instr1, _timeFrame);
_candleManager.Start(series);
}
За текущий день отрисовывает, историю - нет. Данные от 4.0 переконвертировал в 4.1. Проверил в тесте на истории - нормально. Что делаю не так? В чем причина?
|
|
Спасибо:
|
|
|
|
|
JackSparrow
|
Дата: 30.03.2012
Александр я где то на Вашем форуме читал, что если написать индикатор то можно получить несколько ответов. На данный момент я не получил не одного ответа не на один вопрос, хотя я не задаю заумных вопросов, все очень просты, и их не много. Желание спрашивать пропадает. К тому же Вы высказываете сожаления что Вам мало помогают, но время запрачиваемое на разгребание простых вопросов в отсутствие либо доков либо исходников, не оставляет шансов помощ в написании чего либо.
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 30.03.2012
JackSparrow Александр я где то на Вашем форуме читал, что если написать индикатор то можно получить несколько ответов.
И я отвечал на ваши вопросы. В основном по Гидре. Поверьте, если бы не помощь по индикаторам, ответом было бы меньше, так как мы отвечаем только на вопросы, касающиеся багов. JackSparrow но время запрачиваемое на разгребание простых вопросов в отсутствие либо доков либо исходников, не оставляет шансов помощ в написании чего либо.
Предлагаю взять паузу на выходные. Чувствую, неделя была у всех тяжелая... По свечкам - как выложим официально бету в паблик, так и доку обновим. Нет ни времени ни смысла каждому сейчас расказывать о том, как свечки устроены в новой версии, если можно за раз написать доку, и всех отправлять ее читать. Если есть претензии по текущей доке, то надо их высказывать сейчас. Будем смотреть, исправлять. До этого вы ничего не писали про качество документации. Значит все было окей. Сейчас что-то изменилось?
|
|
Спасибо:
|
|
|
|
|
Moadip
|
Дата: 02.04.2012
Цитата:За текущий день отрисовывает, историю - нет. Данные от 4.0 переконвертировал в 4.1. Проверил в тесте на истории - нормально.
Что делаю не так? В чем причина? Отвечу сам на свой вопрос. Для того чтобы отрисовались свечки, надо немного подождать.[smile] Время отрисовки свечек по RI за один день: В 4.0 10 сек. В 4.1 90 сек. Также в 4.1 наблюдается странный глюк. Допустим есть данные за неделю 26-30 марта. Если выставить дату по которой нет данных, например 25 марта, то будет ошибка - очередь пуста, все правильно. Если выставить дату 30 марта, т.е. последний день существующих данных, то ошибки не будет, но и свечки по какой то причине не генерируются. Если выставить 29 марта, все нормально отрисуется. Проверял данные в тесте на истории за этот же день(30 марта), все нормально. В 4.0 такого не наблюдается.
|
|
Спасибо:
|
|
|
|
|
Moadip
|
Дата: 04.04.2012
|
|
|
|
Подгрузили историю, проверили кол-во значений/свечек в IndicatorManager.Container и CandleManager.Container Подгрузили сегодняшний день, проверили кол-во значений/свечек в IndicatorManager.Container и CandleManager.Container При остановке series и смене построителя свечек, а затем повторном запуске этой же series свечки в СandleManager.Container за прошлый день не сохраняются. В IndicatorManager.Container прошлые значения сохраняются. Может сделать чтобы также было в СandleManager.Container? Можно конечно сделать свой CandleManagerContainer и в него складывать свечки, но это не очень удобно. Весь код, может кому пригодится.[smile] Код
using System;
using System.Linq;
using System.Windows;
using System.Windows.Forms;
using System.ComponentModel;
using MessageBox = System.Windows.MessageBox;
using StockSharp.Algo.Candles.Compression;
using StockSharp.Algo.Indicators.Trend;
using StockSharp.Algo.Storages;
using Ecng.Serialization;
using Ecng.Collections;
using Ecng.Common;
using Ecng.Xaml;
using StockSharp.Quik;
using StockSharp.Algo.Candles;
using StockSharp.BusinessEntities;
using StockSharp.Algo.Indicators;
namespace SimpleCandle
{
public partial class MainWindow
{
QuikTrader _trader;
Security _instr1;
private const string _secCode1 = "RIM2";
CandleManager _candleManager;
readonly TimeSpan _timeFrame = TimeSpan.FromMinutes(5);
// Начальная и конечная дата для подгрузки истории
readonly DateTime _startTime = new DateTime(2012, 4, 3);
readonly DateTime _stopTime = new DateTime(2012, 4, 4);
// Путь к данным истории
private const string _historyPath = @"e:\DataServer4.1\";
public MainWindow()
{
InitializeComponent();
Path.Text = @"e:\Program Files\QUIK\";
}
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);
_trader.MarketTimeOffset = TimeSpan.FromHours(-3);
_isConnected = true;
_trader.ConnectionError += error => this.GuiAsync(() => MessageBox.Show(this, error.ToString()));
_trader.Connected += () => this.GuiAsync(() => btnExportDde.IsEnabled = true);
btnExportDde.IsEnabled = true;
_trader.NewSecurities += securities => { if (_instr1 == null)_instr1 = securities.FirstOrDefault(sec => sec.Code == _secCode1); };
_candleManager = new CandleManager();
}
_trader.Connect();
_isConnected = true;
btnConnect.Content = "Отключиться";
}
}
else
{
_trader.Disconnect();
_isConnected = false;
btnConnect.Content = "Подключиться";
}
}
private readonly SimpleMovingAverage _longSma = new SimpleMovingAverage { Length = 20 };
private CandleSeries _series;
private TimeFrameCandleBuilder _builder;
private IndicatorManager _indicatorManager = new IndicatorManager();
private IndicatorToken _token;
private void btnDrawCandleHistory_Click(object sender, RoutedEventArgs e)
{
var storage = new TradingStorage(new InMemoryStorage());
var cbs = new TradeStorageCandleBuilderSource { BasePath = _historyPath, Storage = storage };
_builder = new TimeFrameCandleBuilder();
_builder.Sources.Add(cbs);
_candleManager.Sources.Add(_builder);
_series = new CandleSeries(typeof(TimeFrameCandle), _instr1, _timeFrame);
_token = _indicatorManager.RegisterIndicator(_longSma, new CandleSeriesIndicatorSource(_series, candle => candle.ClosePrice));
_candleManager.Stopped += _candleManager_Stopped;
_candleManager.Start(_series, _startTime, _stopTime);
}
private void _candleManager_Stopped(CandleSeries series)
{
this.GuiAsync(() => Chart.Candles.AddRange(series.GetCandles()));
}
private void bntDrawCandleReal_Click(object sender, RoutedEventArgs e)
{
_candleManager.Stopped -= _candleManager_Stopped;
_candleManager.Stop(_series);
_candleManager.Sources.Remove(_builder);
var cbs = new TradeCandleBuilderSource(_trader);
var cb = new TimeFrameCandleBuilder();
cb.Sources.Add(cbs);
_candleManager.Sources.Add(cb);
_candleManager.Processing += DrawCandles;
_trader.StartExport(new[] { _trader.TradesTable });
_candleManager.Start(_series);
}
private void DrawCandles(CandleSeries series, Candle candle)
{
var bounds = _timeFrame.GetCandleBounds(_trader);
if (bounds.Min > candle.OpenTime)
{
if (candle.State == CandleStates.Finished)
{
this.GuiAsync(() => Chart.Candles.Add(candle));
}
}
else
{
this.GuiAsync(() => Chart.Candles.Add(candle));
}
}
private void button1_Click(object sender, RoutedEventArgs e)
{
button1.Content = _indicatorManager.Container.GetValues(_token).Count();
}
private void button2_Click(object sender, RoutedEventArgs e)
{
button2.Content = _candleManager.Container.GetCandles(_series).Count();
}
private void btnExportDde_Click(object sender, RoutedEventArgs e)
{
if (_isDdeStarted) StopDde();
else StartDde();
}
bool _isDdeStarted;
private void StartDde()
{
_trader.StartExport(new[] { _trader.SecuritiesTable });
_isDdeStarted = true;
}
private void StopDde()
{
_trader.StopExport(new[] { _trader.TradesTable, _trader.SecuritiesTable });
_isDdeStarted = false;
}
private void Window_Closing(object sender, CancelEventArgs e)
{
if (_trader != null)
{
if (_isDdeStarted) StopDde();
_trader.Dispose();
}
}
}
}
Код
<Window x:Class="SimpleCandle.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="675" Width="763" Closing="Window_Closing" Topmost="False" WindowStartupLocation="CenterScreen">
<Grid>
<EcngTradingXaml:CandleChart x:Name="Chart" x:FieldModifier="public" Margin="0,70,0,0" HorizontalAlignment="Left" Width="732" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="Path" VerticalAlignment="Top" Width="277" />
<Button Content="..." Height="23" HorizontalAlignment="Left" Margin="295,12,0,0" Name="FindPath" VerticalAlignment="Top" Width="23" Click="FindPath_Click" />
<Button Content="Подключиться" Height="23" HorizontalAlignment="Left" Margin="12,41,0,0" Name="btnConnect" VerticalAlignment="Top" Width="98" Click="btnConnect_Click" />
<Button Content="Экспорт DDE" Height="23" HorizontalAlignment="Left" Margin="116,41,0,0" Name="btnExportDde" VerticalAlignment="Top" Width="98" Click="btnExportDde_Click" IsEnabled="False" />
<Button Content="Свечки Реал" Height="23" HorizontalAlignment="Left" Margin="324,41,0,0" Name="btnDrawCandleReal" VerticalAlignment="Top" Width="98" Click="bntDrawCandleReal_Click" />
<Button Content="Свечки История" Height="23" HorizontalAlignment="Left" Margin="220,41,0,0" Name="btnDrawCandlHistory" VerticalAlignment="Top" Width="98" Click="btnDrawCandleHistory_Click"/>
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="463,41,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="544,41,0,0" Name="button2" VerticalAlignment="Top" Width="75" Click="button2_Click" />
</Grid>
</Window>
|
|
|
|