Skip to content

Instantly share code, notes, and snippets.

@rcknight
Last active December 14, 2015 08:29
Show Gist options
  • Save rcknight/5058078 to your computer and use it in GitHub Desktop.
Save rcknight/5058078 to your computer and use it in GitHub Desktop.
Placing events from the mtgox api into event store
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; }
}
}
@rcknight
Copy link
Author

rcknight commented Mar 4, 2013

Requires WebSocket4Net (from nuget)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment