ra81
|
Дата: 18.03.2013
VassilSanych Существующий код RtsHistorySource не грузит вчерашнюю вечорку из-за того, что она хранится в сегодняшних файлах TE*.zip , а грузятся только FT*.zip. Доработка исходниковГонял только именно для загрузки вчерашних данных фьюча РТС. К Гидре не прикручивал. Поэтому как оно дружит с Гидрой, не знаю. Пишите, в чём ошибся. Да была такая трабла в гидре уже давно. И не фиксилась как-то.
|
|
Спасибо:
|
|
|
|
|
VassilSanych
|
Дата: 18.03.2013
ra81 была такая трабла в гидре уже давно. И не фиксилась как-то. В Гидре оно не особенно и нужно было. Сказали "не грузите последний день" и ладно. А раз уж открытое API, то пусть работает, как надо. Ещё бы избавиться от дикой связности. Надоело уже заглушки лепить, где попало.
|
|
Спасибо:
|
|
|
|
|
VassilSanych
|
Дата: 18.03.2013
|
|
|
|
Собственно, загрузка вчерашних данных Код
public class DumbSecurityStorage : ISecurityStorage
{
private Security _security;
public Security LoadBy(string fieldName, object fieldValue)
{
return _security;
}
public void Save(Security security)
{
_security = security;
}
}
... Код
......
IEnumerable<Trade> GetTradesFromFinam(DateTime date)
{
var storage = new DumbSecurityStorage();
storage.Save(Security);
var source = new FinamHistorySource(storage) { DumpFolder = GetTempPath() };
var finamMarketId = (long)Settings["HistoryFinamMarketId"]; //14 //todo: проверка
var finamSecurityId = (long)Settings["HistoryFinamSecurityId"]; //82813; //todo: проверка
Security.ExtensionInfo["FinamMarketId"] = finamMarketId;
Security.ExtensionInfo["FinamSecurityId"] = finamSecurityId;
return source.GetTrades(Security, date);
}
IEnumerable<Trade> GetTradesFromRts(DateTime date)
{
var storage = new DumbSecurityStorage();
storage.Save(Security);
var source = new RtsHistorySource(storage) { DumpFolder = GetTempPath() };
var trades = new Dictionary<Security, IList<Trade>>();
source.LoadTrades(date, trades);
if (!trades.ContainsKey(Security))
throw new ApplicationException("Не получены данные за прошлый день");
return trades[Security];
}
private string GetTempPath()
{
var tradeStoragePath = (string)Settings["HistoryTradeStoragePath"]; //todo: проверка
var tempPath = Path.Combine(tradeStoragePath, "TemporaryFiles");
if (!Directory.Exists(tempPath))
Directory.CreateDirectory(tempPath);
return tempPath;
}
DateTime GetLastDateBefore(DateTime date)
{
do
{
date = date.AddDays(-1);
if (ExchangeBoard.Forts.WorkingTime.IsTradeDate(date, true))
return date;
} while (true);
}
/// <summary>
/// Добавление в список свечей данных из хранилища
/// </summary>
private void AddHistoryCandles()
{
var storageRegistry = new StorageRegistry();
var tradeStoragePath = (string)Settings["HistoryTradeStoragePath"]; //todo: проверка
((LocalMarketDataDrive)storageRegistry.DefaultDrive).Path = tradeStoragePath;
var storage = storageRegistry.GetTradeStorage(Security);
var thisDate = LoggingHelper.Now.Date;
var lastDate = GetLastDateBefore(thisDate);
switch ((string)Settings["HistorySource"]) //todo: проверка
{
case "RTS":
if (!storage.Dates.Contains(thisDate))
{
var trades = GetTradesFromRts(lastDate);
//
storage.Save(trades.Where(t => t.Time > lastDate && t.Price > 0));
//пропуск закачки более старых (нужна закачка целыми днями) и игнорирование ошибки данных
// на ftp ртс данные выложены по сессиям с 19.00 до 19.00
trades = GetTradesFromRts(thisDate);
storage.Save(trades.Where(t => t.Time < thisDate && t.Price > 0));
//пропуск закачки сегодняшних и игнорирование ошибки данных
}
break;
case "Finam":
if (!storage.Dates.Contains(lastDate))
{
var trades = GetTradesFromFinam(lastDate);
storage.Save(trades);
}
break;
default:
if (!storage.Dates.Contains(lastDate))
{
//var trades = GetTradesFromTxt(@"E:\Downloads\RIH3_130312_130312.txt");
var trades = GetTradesFromTxt(string.Format(
"{0}{1}_{2}_{2}.txt",
tradeStoragePath, Security.Code, lastDate));
storage.Save(trades);
}
break;
}
// берём только сделки раньше тех, что есть в таблице
var lastTimeSource = Trader.Trades.Select(t => t.Time);
var lastTime = lastTimeSource.Any() ? lastTimeSource.Min() : thisDate;
var source = new TradeStorageCandleBuilderSource
{
StorageRegistry = storageRegistry,
Filter = trade => trade.Time > lastDate && trade.Time < lastTime,
};
TraderBuilder.CandleManager.Sources.OfType<TickCandleBuilder>().Single().Sources.Add(source);
}
protected override void OnStarted()
{
try
{
Trader = TraderBuilder.BuildTrader();
OrderHelper = TraderBuilder.OrderHelper;
if (Trader == null)
throw new ApplicationException(string.Format("Отсутствует трейдер {0}.", TraderBuilder.Title));
_strategyStartTime = Trader.GetMarketTime(ExchangeBoard.Forts.Exchange);
Portfolio = PortfolioSelector.GetPortfolio(Trader);
if (Portfolio == null)
throw new ApplicationException(string.Format("Отсутствует портфель {0}.", PortfolioSelector.Title));
Security = SecuritySelector.GetSecurity(Trader);
if (Security == null)
throw new ApplicationException(string.Format("Отсутствует инструмент {0}.", SecuritySelector.Title));
Trader.RegisterSecurity(Security);
Trader.RegisterMarketDepth(Security);
if (VolumeSizer != null)
{
Volume = VolumeSizer.GetVolume(Portfolio, Security);
this.AddInfoLog("Объем: {0}", Volume);
}
AddHistoryCandles();
Series = new CandleSeries(
CandleFrameType, Security, FrameSize) { WorkingTime = ExchangeBoard.Forts.WorkingTime };
// Если Security - это WeightedIndexSecurity, то _series не заполняется
Series
.WhenCandlesFinished()
.Do(ProcessCandle)
.Apply(this);
TraderBuilder.CandleManager.Start(Series);
base.OnStarted();
}
catch (Exception ex)
{
this.AddErrorLog(ex);
Stop();
}
}
......
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 18.03.2013
VassilSanych Сказали "не грузите последний день" и ладно. Получается, вечерка все таки попадает со временем в те файлы, что Гидра парсит? Надо просто подождать, так?
|
|
Спасибо:
|
|
|
|
|
VassilSanych
|
Дата: 18.03.2013
Mikhail Sukhov Получается, вечерка все таки попадает со временем в те файлы, что Гидра парсит? Надо просто подождать, так? Так. Но при торговле мне необходимы именно ВЧЕРАШНИЕ данные, а не позавчерашние или месячной давности.
|
|
Спасибо:
|
|
|
|
|
Moadip
|
Дата: 18.03.2013
VassilSanych Mikhail Sukhov Получается, вечерка все таки попадает со временем в те файлы, что Гидра парсит? Надо просто подождать, так? Так. Но при торговле мне необходимы именно ВЧЕРАШНИЕ данные, а не позавчерашние или месячной давности. Не вижу особой проблемы что текущий API/Гидра не сохраняет вечерку вчерашнего дня, остальные то вечерки сохраняются. ИМХО, данные надо собирать самому, различные паблик источники это крайность, если были пропуски или надо протестировать на истории. Ftp RTS кстати не эталон, там тоже бывают битые данные.
|
|
Спасибо:
|
|
|
|
|
VassilSanych
|
Дата: 18.03.2013
Moadip Не вижу особой проблемы что текущий API/Гидра не сохраняет вечерку вчерашнего дня, остальные то вечерки сохраняются. ИМХО, данные надо собирать самому, различные паблик источники это крайность, если были пропуски или надо протестировать на истории. Ftp RTS кстати не эталон, там тоже бывают битые данные. Резервные источники надёжнее. Пара битых тиков - не проблема. Проблема - отсутствие данных. Качать данные самому в непрерывном режиме - это уже другая задача. Чтобы иметь промышленную надёжность, надо иметь промышленные поддержку, администрирование и резервирование. Пусть уж этим РТС занимается. Или Финам.
|
|
Спасибо:
|
|
|
|
|
ra81
|
Дата: 19.03.2013
Странный подход к проблеме. Если данные не качаются то не надо их качать сегодня. Они закачаются завтра. Я так понял что исправление достаточно легко вставить. Но не вставили.
Для большинства вообще пофиг сколько там битых тиков придет, главное чтобы более менее можно было построить свечки по вчерашней сессии. Не все брокеры дают историю толковую за вчера и позавчера итд.
|
|
Спасибо:
|
|
|
|