2017-02-06 5 views
1

J'essaye d'ajouter de l'ordre dans Kraken par appel API https://api.kraken.com/0/private/AddOrder. J'ai trouvé EAPI: Erreur de nonce invalide lors de l'insertion d'un nouvel ordre dans Kraken. Maintenant, je n'insère qu'une seule commande à la fois en cliquant sur le bouton, mais il peut y avoir une situation où plusieurs commandes seront insérées. J'ai essayé trop de solutions différentes pour générer un nonce Mais, toujours trouvé le même problème. Est-ce que quelqu'un sait ce qui ne va pas?Kraken API: EAPI: nonce invalide dans C#

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); 
        } 
       } 
      } 
     } 
    } 

Répondre

0

Certaines plates-formes d'échange permettent l'utilisation de à flotteur nonce, dans votre cas que vous utilisez Kraken et selon Kraken Api documentation,

nonce = toujours croissante non signé 64 bits entier

Kraken nécessitera un entier nonce.


Pourquoi nonce invalide?

À mon avis, le problème se produit lorsque vous avez envoyé plus d'une demande avec le même ... nonce

Lorsque vous convertissez l'horodatage à un nombre entier, vous serez sera autorisé par conséquent à envoyer seulement 1 demande par deuxième (parce que la limitation par rapport au nonce entier change à chaque seconde)

afin d'avoir la capacité de envoyer plus d'une demande par seconde, un des conseils pourraient être à timestamp multiplier par 1000 puis convertir en entier et utilisez cette valeur comme nonce.

nonce=integer(1000*timestamp) 

Dans ce cas, vous pouvez envoyé plus de 1 demande par seconde (parce que chaque nonce sera différent) mais rappelez-vous que:

plate-forme d'échange

des clauses de sauvegarde en place pour protéger contre abus/DoS attaques.