Формат данных для Гидры


Формат данных для Гидры
Atom
4/3/2012


В версии 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:

Code
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:

Code
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));
					}
				}
			}
		}
	}
}

Tags:


Thanks:


Mikhail Sukhov

Avatar
Date: 4/5/2012
Reply


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



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

anothar

Avatar
Date: 4/19/2012
Reply


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

Alexander

Avatar
Date: 4/19/2012
Reply


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


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

anothar

Avatar
Date: 4/19/2012
Reply


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

fish

Avatar
Date: 7/13/2012
Reply


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

anothar

Avatar
Date: 7/13/2012
Reply


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

fish

Avatar
Date: 7/13/2012
Reply


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

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

anothar

Avatar
Date: 7/14/2012
Reply


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

chudokos

Avatar
Date: 5/1/2013
Reply


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


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


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

loading
clippy