我正在尝试通过API调用https://api.kraken.com/0/private/AddOrder在Kraken中添加订单。我发现EAPI:在Kraken中插入新订单时出现无效的nonce错误。现在我只在按钮点击时一次只插入一个订单,但可能会出现插入多个订单的情况。我已经尝试了太多不同的解决方案来生成一个nonce但是,仍然发现了同样的问题。有人知道什么是错的吗?
private JsonObject QueryPrivate(string a_sMethod, string props = null)
{
// generate a 64 bit nonce using a timestamp at tick resolution
Int64 nonce = DateTime.Now.Ticks;
props = "nonce=" + nonce + props;
string path = string.Format("/{0}/private/{1}", _version, a_sMethod);
string address = _url + path;
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(address);
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.Method = "POST";
webRequest.Headers.Add("API-Key", _key);
byte[] base64DecodedSecred = Convert.FromBase64String(_secret);
var np = nonce + Convert.ToChar(0) + props;
var pathBytes = Encoding.UTF8.GetBytes(path);
var hash256Bytes = sha256_hash(np);
var z = new byte[pathBytes.Count() + hash256Bytes.Count()];
pathBytes.CopyTo(z, 0);
hash256Bytes.CopyTo(z, pathBytes.Count());
var signature = getHash(base64DecodedSecred, z);
webRequest.Headers.Add("API-Sign", Convert.ToBase64String(signature));
if (props != null)
{
using (var writer = new StreamWriter(webRequest.GetRequestStream()))
{
writer.Write(props);
}
}
//Make the request
try
{
//Wait for RateGate
_rateGate.WaitToProceed();
using (WebResponse webResponse = webRequest.GetResponse())
{
using (Stream str = webResponse.GetResponseStream())
{
using (StreamReader sr = new StreamReader(str))
{
string data = sr.ReadToEnd();
dynamic d = JObject.Parse(data);
return (JsonObject)JsonConvert.Import(data);
}
}
}
}
catch (WebException wex)
{
using (HttpWebResponse response = (HttpWebResponse)wex.Response)
{
using (Stream str = response.GetResponseStream())
{
using (StreamReader sr = new StreamReader(str))
{
string data = sr.ReadToEnd();
if (response.StatusCode != HttpStatusCode.InternalServerError)
{
throw;
}
return (JsonObject)JsonConvert.Import(sr);
}
}
}
}
}
答案 0 :(得分:0)
某些交换平台允许使用浮点类型 nonce,在您使用Kraken时根据Kraken Api documentation使用
nonce =总是增加无符号64位整数
Kraken将需要整数nonce 。
为什么无效的nonce?
在我看来,当您使用相同的nonce发送多个请求时会出现问题...
当您将时间戳转换为整数时,您将被允许每秒仅发送1个请求(因为相对于每秒更改的整数随机数的限制)
为了能够每秒发送多个请求,一个提示可能是将时间戳乘以1000然后转换为整数并使用此值作为随机数。
nonce=integer(1000*timestamp)
在这种情况下,您可能每秒发送超过1个请求(因为每个nonce将不同)但请记住:
交流平台有保障措施以防范 滥用/ DoS攻击。