Created
September 4, 2017 17:51
-
-
Save muhlucas/6a52aebb149dc86ba28f2a2247b43e17 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
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")); | |
} |
This file contains hidden or 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
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