Skip to content

Instantly share code, notes, and snippets.

@muhlucas
Created September 4, 2017 17:51
Show Gist options
  • Save muhlucas/6a52aebb149dc86ba28f2a2247b43e17 to your computer and use it in GitHub Desktop.
Save muhlucas/6a52aebb149dc86ba28f2a2247b43e17 to your computer and use it in GitHub Desktop.
public void CreateStoreOrder(string currencyCode, string orderAction, decimal price, decimal amount, decimal totalLimit, long? orderId){
Int64 requestId = (Int64)(DateTime.UtcNow - UnixEpoch).TotalSeconds; // Usa Unix Timestamp como requestId
var request = (HttpWebRequest)WebRequest.Create("https://api.blinktrade.com/tapi/v1/message");
var postData = new
{
MsgType = "D",
ClOrdID = requestId,
Symbol = "BTCBRL",
Side = (orderAction == "Buy") ? "1" : "2",
OrdType = "2", // limit
OrderQty = (Int64)(amount * 1e8m), // in satoshis
Price = (Int64)(price * 1e8m), // in satoshis
BrokerID = 4 //4 - foxbit, 5 - testnet
};
string nonce = ((Int64)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds).ToString(CultureInfo.InvariantCulture);
request.Method = "POST";
request.ContentType = "application/json";
request.Headers.Add("APIKey", apiKey);
request.Headers.Add("Nonce", nonce);
request.Headers.Add("Signature", HashMac(apiSecret, nonce));
var httpResponse = (HttpWebResponse)request.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
order = JsonConvert.DeserializeObject<OrderResult>(result);
}
var orderQty = (Int64)(amount * 1e8m);
if (order.Status == 200)
{
OrderResponse orderRes = null;
var successTypes = new string[] { "1", "2" };
orderRes = order.Responses.LastOrDefault(w => w.ExecID.HasValue && successTypes.Contains(w.ExecType));
var anotherExecutions = order.Responses.Any(w => w != null && w.OrdStatus != null && w.OrdStatus.Equals("2"));
if (!anotherExecutions)
{
var cancelResponse = CancelOrderBlinktrade(requestId);
orderRes = cancelResponse.Responses.LastOrDefault(x => x.OrdStatus != null);
}
if (orderRes == null)
{
orderRes = ConsultOrder(requestId);
if(orderRes == null || !successTypes.Contains(orderRes.OrdStatus))
{
CancelOrder(requestId);
}
}
return Task.FromResult<OrderResponse>(orderRes);
}
}
public OrderResult CancelOrderBlinktrade(Int64 requestId)
{
var request = (HttpWebRequest)WebRequest.Create(ConfigurationManager.AppSettings["BLINKTRADE_API_MSG_URL"]);
var apiKey = ConfigurationManager.AppSettings["BLINKTRADE_APIKEY"];
var apiSecret = ConfigurationManager.AppSettings["BLINKTRADE_2FA"];
OrderResult order;
var postData = new
{
MsgType = "F",
ClOrdID = requestId
};
string nonce = ((Int64)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds).ToString(CultureInfo.InvariantCulture);
request.Method = "POST";
request.ContentType = "application/json";
request.Headers.Add("APIKey", apiKey);
request.Headers.Add("Nonce", nonce);
request.Headers.Add("Signature", HashMac(apiSecret, nonce));
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
string json = JsonConvert.SerializeObject(postData);
streamWriter.Write(json);
}
var httpResponse = (HttpWebResponse)request.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
order = JsonConvert.DeserializeObject<OrderResult>(result);
}
return order.Status == 200 ? order : null;
}
public OrderResponse ConsultOrder(Int64? requestId = null, Int64? orderId = null)
{
var request = (HttpWebRequest)WebRequest.Create(ConfigurationManager.AppSettings["BLINKTRADE_API_MSG_URL"]);
var apiKey = ConfigurationManager.AppSettings["BLINKTRADE_APIKEY"];
var apiSecret = ConfigurationManager.AppSettings["BLINKTRADE_2FA"];
var UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var postData = new
{
MsgType = "U4",
OrdersReqID = (Int64)(DateTime.UtcNow - UnixEpoch).TotalSeconds,
Page = 0,
PageSize = 20
};
string nonce = ((Int64)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds).ToString(CultureInfo.InvariantCulture);
request.Method = "POST";
request.ContentType = "application/json";
request.Headers.Add("APIKey", apiKey);
request.Headers.Add("Nonce", nonce);
request.Headers.Add("Signature", HashMac(apiSecret, nonce));
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
string json = JsonConvert.SerializeObject(postData);
streamWriter.Write(json);
}
var httpResponse = (HttpWebResponse)request.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
var convertResult = JsonConvert.DeserializeObject<ResultListOrders>(result);
OrderResponse orderResult = null;
for(int i = 0; i < convertResult.Responses.Count; i++)
{
for(int j = 0; j < convertResult.Responses[i].OrdListGrp.Count; j++)
{
if ((requestId.HasValue && convertResult.Responses[i].OrdListGrp[j][convertResult.Responses[i].Columns.FindIndex(e => e.Equals("ClOrdID"))].Equals(requestId.Value.ToString()))
|| (orderId.HasValue && convertResult.Responses[i].OrdListGrp[j][convertResult.Responses[i].Columns.FindIndex(e => e.Equals("OrderID"))].Equals(orderId.Value.ToString())))
{
var order = convertResult.Responses[i].OrdListGrp[j];
orderResult = new OrderResponse()
{
ClOrdID = order[convertResult.Responses[i].Columns.FindIndex(e => e.Equals("ClOrdID"))],
OrderID = long.Parse(order[convertResult.Responses[i].Columns.FindIndex(e => e.Equals("OrderID"))]),
CumQty = long.Parse(order[convertResult.Responses[i].Columns.FindIndex(e => e.Equals("CumQty"))]),
OrdStatus = order[convertResult.Responses[i].Columns.FindIndex(e => e.Equals("OrdStatus"))],
LeavesQty = long.Parse(order[convertResult.Responses[i].Columns.FindIndex(e => e.Equals("LeavesQty"))]),
CxlQty = long.Parse(order[convertResult.Responses[i].Columns.FindIndex(e => e.Equals("CxlQty"))]),
AvgPx = long.Parse(order[convertResult.Responses[i].Columns.FindIndex(e => e.Equals("AvgPx"))]),
Symbol = order[convertResult.Responses[i].Columns.FindIndex(e => e.Equals("Symbol"))],
Side = order[convertResult.Responses[i].Columns.FindIndex(e => e.Equals("Side"))],
OrdType = order[convertResult.Responses[i].Columns.FindIndex(e => e.Equals("OrdType"))],
OrderQty = long.Parse(order[convertResult.Responses[i].Columns.FindIndex(e => e.Equals("OrderQty"))]),
Price = long.Parse(order[convertResult.Responses[i].Columns.FindIndex(e => e.Equals("Price"))]),
OrderDate = DateTime.Parse(order[convertResult.Responses[i].Columns.FindIndex(e => e.Equals("OrderDate"))]),
Volume = order[convertResult.Responses[i].Columns.FindIndex(e => e.Equals("Volume"))],
TimeInForce = order[convertResult.Responses[i].Columns.FindIndex(e => e.Equals("TimeInForce"))]
};
}
}
}
return orderResult;
}
}
public static string HashMac(string key, string text)
{
string result;
var keyByte = Encoding.UTF8.GetBytes(key);
using (var hmacsha256 = new HMACSHA256(keyByte))
{
hmacsha256.ComputeHash(Encoding.UTF8.GetBytes(text));
result = ByteToString(hmacsha256.Hash);
}
return result;
}
private static string ByteToString(byte[] buff)
{
return buff.Aggregate("", (current, t) => current + t.ToString("X2"));
}
public class OrderResponse
{
public string MsgType { get; set; }
public Int64? OrderID { get; set; }
public Int64? ExecID { get; set; }
public string ExecType { get; set; }
public string OrdStatus { get; set; }
public Int64 LeavesQty { get; set; }
public string Symbol { get; set; }
public Int64 OrderQty { get; set; }
public Int64 LastShares { get; set; }
public Int64 LastPx { get; set; }
public Int64 CxlQty { get; set; }
public string TimeInForce { get; set; }
public Int64 CumQty { get; set; }
public string ClOrdID { get; set; }
public string OrdType { get; set; }
public string Side { get; set; }
public Int64 Price { get; set; }
public string ExecSide { get; set; }
public Int64 AvgPx { get; set; }
public DateTime? OrderDate { get; set; }
public string Volume { get; set; }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment