← Zurück

Конвертация из csv в bin

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

Вопрос в общем то у меня был простой, как котировки из обычного текстового файла закинуть, либо в bin формат гидры, либо напрямую получить из них CandleSeries Вот что-то сделал. По крайней мере оно работает...


private void ConvertRoutine()
{
	TimeSpan timeFrame = TimeSpan.FromMinutes(5);
	CandleManager cm = new CandleManager();
	Security sec = new Security
	{
		Id = "EUR5@EUR",
		Code = "EUR5",
		Name = "EURUSD",
		MinStepSize = 0.0001M,
		ExchangeBoard = ExchangeBoard.Test,
	};
	CandleSeries cs = new CandleSeries(typeof(TimeFrameCandle), sec, timeFrame);
	cm.Start(cs, StartDate, EndDate);
	cm.Container.CandlesKeepTime = EndDate - StartDate;

	foreach (OHLC candle in candlesList)
	{
		if(candle.Date<StartDate || candle.Date>EndDate) continue;
		Candle newC = new TimeFrameCandle();
		newC.ClosePrice = candle.Close;
		newC.CloseTime = candle.Date;
		newC.CloseVolume = candle.Volume;
		newC.HighPrice = candle.High;
		newC.HighTime = candle.Date;
		newC.HighVolume = candle.Volume;
		newC.LowPrice = candle.Low;
		newC.LowTime = candle.Date;
		newC.LowVolume = candle.Volume;
		newC.OpenPrice = candle.Open;
		newC.OpenTime = candle.Date;
		newC.OpenVolume = candle.Volume;
		newC.Security = sec;
		newC.Arg = timeFrame;
		newC.RelativeVolume = 0;
		newC.Series = cs;
		newC.TotalPrice = candle.Close;
		newC.TotalVolume = candle.Volume;
		newC.State = CandleStates.Finished;
		cm.Container.AddCandle(cs, newC);
	}
	var storage = new StorageRegistry();
	var candleStorage =
		storage.GetCandleStorage<TimeFrameCandle, TimeSpan>(sec, timeFrame);
	candleStorage.Save(cs.GetCandles<TimeFrameCandle>());
}

Здесь candlesList это массив объектов


public class OHLC
{
	public DateTime Date { get; set; }
	public decimal Open { get; set; }
	public decimal High { get; set; }
	public decimal Low { get; set; }
	public decimal Close { get; set; }
	public int Volume { get; set; }
}

Его мы получаем считывая текстовой файл

Ccылка на простенький конвертер с подобным кодом Скрины-инструкции Код

**И собственно вопросы:

  • как то же самое сделать адекватным образом? :)
  • кроме того** Если просто прописать в References dllки Ecng.Common, Ecng.ComponentModel, Ecng.Serialization, StockSharp.Algo, StockSharp.BusinessEntities, StockSharp.Logging То при выполнении candleStorage.Save(cs.GetCandles<TimeFrameCandle>()); вылезает следующая ошибка: Инициализатор типа "Ecng.Reflection.Emit.AssemblyHolder" выдал исключение. Подробнее об ошибке по ссылке, чтобы не захламлять пост Ссылка на версию программы с ошибкой

Если же заменить StockSharp.Algo.dll в References на исходники - проект StockSharp.Algo, то всё работает Более того, если после этого удалить этот проект и опять поставить StockSharp.Algo.dll в References, то всё равно всё работает. Видимо что-то связанное с assembly - а в этой теме я не силён )

Спасибо тем, кто смог осилить этот пост ))

War dieses Thema hilfreich?

Thema teilen

Kommentare (1)

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

AlgoCoder
AlgoCoder

Спасибо, всё работает. Излазил весь Git, документацию и форум, чтобы понять как заюзать S# API , чтобы сохранить свои произвольные свечи как это делает гидра (csv/bin), чтобы потом можно было работать с ними через исторический эмулятор. Единственное, модифицировал обращение к свечному хранилищу: var candleStorage = new StorageRegistry().GetCandleStorage(typeof(TimeFrameCandle), Security, Timeframe, new LocalMarketDataDrive(pathToStorage), StorageFormats.Binary); Возможно это кому-то поможет.