Last active
December 14, 2015 08:29
-
-
Save rcknight/5058078 to your computer and use it in GitHub Desktop.
Placing events from the mtgox api into event store
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Net; | |
using System.Text; | |
using EventStore.ClientAPI; | |
using Newtonsoft.Json; | |
using SimpleJson; | |
using SuperSocket.ClientEngine; | |
using WebSocket4Net; | |
namespace websockets_test | |
{ | |
class Program | |
{ | |
private static WebSocket websocket; | |
private static EventStoreConnection es; | |
static void Main(string[] args) | |
{ | |
websocket = new WebSocket("ws://websocket.mtgox.com/mtgox"); | |
es = EventStoreConnection.Create(); | |
es.Connect(new IPEndPoint(IPAddress.Loopback, 1113)); | |
websocket.MessageReceived += ClientOnMessage; | |
websocket.Closed += WebsocketOnClosed; | |
websocket.Error += WebsocketOnError; | |
websocket.Open(); | |
Console.WriteLine("Enter to quit."); | |
Console.ReadLine(); | |
} | |
private static void WebsocketOnError(object sender, ErrorEventArgs errorEventArgs) | |
{ | |
Console.WriteLine("Websocket error: {0}", errorEventArgs.Exception.Message); | |
Console.WriteLine("Socket State: {0}",websocket.State.ToString()); | |
while(websocket.State != WebSocketState.Closed) | |
{ | |
websocket.Close(); | |
} | |
} | |
private static void WebsocketOnClosed(object sender, EventArgs eventArgs) | |
{ | |
Console.WriteLine("Websocket connection closed. Reconnecting"); | |
websocket.Open(); | |
Console.WriteLine("Reconnected"); | |
} | |
private static void ClientOnMessage(object sender, MessageReceivedEventArgs e) | |
{ | |
var deserialized = JsonConvert.DeserializeObject<MtGoxMessage>(e.Message); | |
if (!string.IsNullOrEmpty(deserialized.Private)) | |
{ | |
var header = EncodeString(JsonConvert.SerializeObject(new {deserialized.Channel, deserialized.Op, deserialized.Origin, deserialized.Private})); | |
switch (deserialized.Private) | |
{ | |
case "trade": | |
var encodedTrade = EncodeString(deserialized.Trade.ToString()); | |
es.AppendToStreamAsync("mtgox-trades", ExpectedVersion.Any, | |
new EventData(Guid.NewGuid(), "trade", true, encodedTrade, header)); | |
break; | |
case "ticker": | |
//Console.WriteLine("{0}: Last Price - {1}",DateTime.Now.ToString(),deserialized.Ticker.last.display); | |
//ticker is weird, have to deserialize and reserialize | |
var encodedTicker = EncodeString(JsonConvert.SerializeObject(deserialized.Ticker)); | |
es.AppendToStreamAsync("mtgox-ticker", ExpectedVersion.Any, | |
new EventData(Guid.NewGuid(), "tick", true, encodedTicker, header)); | |
break; | |
case "depth": | |
var encodedDepth = EncodeString(deserialized.Depth.ToString()); | |
es.AppendToStreamAsync("mtgox-depth", ExpectedVersion.Any, | |
new EventData(Guid.NewGuid(), "depthChange", true, encodedDepth, header)); | |
break; | |
default: | |
Console.WriteLine("Unknown message type: " + deserialized.Private); | |
break; | |
} | |
} | |
} | |
private static byte[] EncodeString(string json) | |
{ | |
return Encoding.UTF8.GetBytes(json); | |
} | |
} | |
public class MtGoxMessage | |
{ | |
public string Channel { get; set; } | |
public string Op { get; set; } | |
public string Origin { get; set; } | |
public string @Private { get; set; } | |
public TickerMessage Ticker { get; set; } | |
public JsonObject Trade { get; set; } | |
public JsonObject Depth { get; set; } | |
public JsonObject Result { get; set; } | |
} | |
public class TickerMessage | |
{ | |
public TickerEntry avg { get; set; } | |
public TickerEntry buy { get; set; } | |
public TickerEntry high { get; set; } | |
public TickerEntry last { get; set; } | |
public TickerEntry last_local { get; set; } | |
public TickerEntry last_orig { get; set; } | |
public TickerEntry low { get; set; } | |
public TickerEntry sell { get; set; } | |
public TickerEntry vol { get; set; } | |
public TickerEntry vwap { get; set; } | |
} | |
public class TickerEntry | |
{ | |
public String currency { get; set; } | |
public String display { get; set; } | |
public Decimal value { get; set; } | |
public long value_int { get; set; } | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Requires WebSocket4Net (from nuget)