Формат данных для Гидры
Atom
03.04.2012
Mikhail Sukhov


В версии S# 4.0 формат данных был 1.XXX. В версии S# 4.1 было два формата, 2.0 и 3.0. Ниже два скрипта. Первый переводит 1.XXX в 2.0. Второй переводит из 2.0 в 3.0. Кто использует Гидру 4.0, нужно использовать оба скрипта, и прогнать их друг за другом. Кто уже использовал 4.1, то прогнать только второй. Пути, естественно, заменить в коде.

Конвертация в формат 2.0:

Код
foreach (var secDir in Directory.EnumerateDirectories(@"d:\SS\D\HydraRi3"))
{
	if (Directory.EnumerateFiles(secDir).Any())
		continue;
				
	var dateDirs = Directory.GetDirectories(secDir);

	var prefixes = new[] { "trades", "quotes" };
	foreach (var prefix in prefixes)
	{
				
		var metaInfo = new Dictionary<DateTime, IDictionary<string, object>>();



		foreach (var dir in dateDirs)
		{
			var date = Path.GetFileName(dir).ToDateTime("yyyy_MM_dd");

			var files = Directory.GetFiles(dir);


			var meta = files.FirstOrDefault(f => Path.GetFileName(f) == prefix+".xml");
			var data = files.FirstOrDefault(f => Path.GetFileName(f) == prefix+".bin");
			if (null != meta)
			{
				CultureInfo.InvariantCulture.DoInCulture(() => metaInfo.Add(date, new XmlSerializer<IDictionary<string, object>>().Deserialize(meta)));

				File.Move(data, Path.Combine(secDir, prefix + "_" + Path.GetFileName(dir) + ".bin"));
			}
		}
		CultureInfo.InvariantCulture.DoInCulture(() => new XmlSerializer<IDictionary<DateTime, IDictionary<string, object>>>().Serialize(metaInfo, Path.Combine(secDir, prefix+".xml")));
	}

	foreach (var dir in dateDirs)
	{
		Directory.Delete(dir, true);
	}

	Console.WriteLine(Path.GetFileName(secDir));
}


Конвертация в формат 3.0:

Код
var input = @"d:\SS\D\HydraRi3";
var output = @"d:\SS\D\HydraRi5.1";

foreach (var secDir in Directory.EnumerateDirectories(input))
{
	var prefixes = new[] { "quotes", "trades", "orderLog" };
	var secId = Path.GetFileName(secDir);
	Directory.CreateDirectory(Path.Combine(output,secId));
	foreach (var prefix in prefixes)
	{
		var metafile = secDir + "\\" + prefix + ".xml";
		if (File.Exists(metafile))
		{
			IDictionary<DateTime, IDictionary<string, object>> data=null; 
			CultureInfo.InvariantCulture.DoInCulture(() => data = new XmlSerializer<IDictionary<DateTime, IDictionary<string, object>>>().Deserialize(metafile));
			//Directory.EnumerateFiles(secDir);
			foreach (var date in data.Keys)
			{
				var fileName = "{0}_{1}.bin".Put(prefix, date.ToString("yyyy_MM_dd"));
				fileName = Path.Combine(secDir,fileName);
				if (File.Exists(fileName))
				{
					var outSecDir = Path.Combine(output, secId, date.ToString("yyyy_MM_dd"));
					Directory.CreateDirectory(outSecDir);

					var outFile = Path.Combine(outSecDir, prefix + ".bin");
					using (var s = new FileStream(outFile, FileMode.Create, FileAccess.Write))
					{
						var dict = data[date];

						s.WriteByte(3); s.WriteByte(0);
						s.Write((int)dict["count"]);
						s.Write((decimal)dict["minStepSize"]);
						s.Write((decimal)0);
						s.Write(new DateTime(dict["firstTime"].To<long>()));
						s.Write(new DateTime(dict["prevTime"].To<long>()));

						if (prefix.Equals("trades"))
						{
							s.Write((long)dict["firstId"]);
							s.Write((long)dict["prevId"]);
							s.Write((decimal)dict["firstPrice"]);
							s.Write((decimal)dict["prevPrice"]); 
						}
						else if (prefix.Equals("quotes"))
						{
							s.Write((decimal)dict["firstPrice"]);
							s.Write((decimal)dict["prevPrice"]); 									
						}
						else if (prefix.Equals("orderLog"))
						{
							s.Write((long)dict["firstOrderId"]);
							s.Write((long)dict["firstTradeId"]);
							s.Write((long)dict["prevOrderId"]);
							s.Write((long)dict["prevTradeId"]);
							s.Write((decimal)dict["firstPrice"]);
							s.Write((decimal)dict["prevPrice"]);
						}

						s.WriteRaw(File.ReadAllBytes(fileName));
					}
				}
			}
		}
	}
}

Теги:


Спасибо:


Mikhail Sukhov

Фотография
Дата: 05.04.2012
Ответить


Новый формат в действии:



Слева (data2) старый формат. Справа (data) - новый формат. Тики по РТС + ММВБ. С начала по текущий день.
Спасибо:

anothar

Фотография
Дата: 19.04.2012
Ответить


Кому нужен конвертер с гуи-обращайтесь, куда-нить выложу.
Спасибо:

Alexander

Фотография
Дата: 19.04.2012
Ответить


anothar
Кому нужен конвертер с гуи-обращайтесь, куда-нить выложу.


Можно прям тут к сообщению приложить :)
Спасибо:

anothar

Фотография
Дата: 19.04.2012
Ответить


Конвертер из 2.0 в 3.0 с исходниками.
HydraConverter
Спасибо: OvcharenkoVI Mikhail Sukhov Кот Матроскин hobo VirKato

fish

Фотография
Дата: 13.07.2012
Ответить


а преемственность между стаканами не сохранилась? т.е. могу ли я тестировать на версии 1 формата стаканов, на новой версии библиотеки 4.1.2?
Спасибо:

anothar

Фотография
Дата: 13.07.2012
Ответить


По-моему проще сконвертировать и не мучаться со старыми версиями.
Спасибо:

fish

Фотография
Дата: 13.07.2012
Ответить


не могу конвертнуть! вот какой это формат? ниже в атаче прикрепил файл стакана

UPDATE файл не прикрепляется)))
Спасибо:

anothar

Фотография
Дата: 14.07.2012
Ответить


А конвертировать конвертером то не пробовали? Можно же сделать бекап и конвертнуть, а потом в гидре посмотреть -нормально ли отражаются данные.
Спасибо:

chudokos

Фотография
Дата: 01.05.2013
Ответить


anothar
А конвертировать конвертером то не пробовали? Можно же сделать бекап и конвертнуть, а потом в гидре посмотреть -нормально ли отражаются данные.


Вы бы могли, пожалуйста, еще раз выложить HydraCoverter, ссылка на dropbox уже не работает... Или может кто-то другой поделится.
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy