Конвертация из csv в bin
Atom Reply
3/10/2013


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

Вопрос в общем то у меня был простой, как котировки из обычного текстового файла закинуть, либо в 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 - а в этой теме я не силён )

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



Thanks:




1 Answers
AlgoCoder

Avatar
Training
Date: 5/9/2019
Reply


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


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy