Jump to content
QweR1ty

отправка запросов к API Poloniex

Recommended Posts

Друзья, всем привет. Кто делал себе бота для биржи? Решил написать себе бота на delphi. Уже больше суток мучаюсь с этим делом. Вот кусок кода:

 

nonce := FormatDateTime('yyyymmddhhnnsszzz',now);  

post := TStringStream.Create;  

post.WriteString('command=returnBalances&nonce='+ nonce);  

sign:=SHA512DigestToHex(CalcHMAC_SHA512(Secret,post.DataString));  

IdHttp1.Request.CustomHeaders.FoldLines := false;  

idhttp1.Request.CustomHeaders.Values['Key']:=API-Key;  

idhttp1.Request.CustomHeaders.Values['Sign']:=sign;  

Memo1.Text:= idhttp1.Post('https://www.poloniex.com/tradingApi', post);

 

Получаю ответ: {"error":"Invalid command."}

 

Вот сама документация по API - https://poloniex.com/support/api .В документации также есть ссылка на пример кода phyton и php, но этот код не особо понимаю.

 

 В чем может быть проблема? подскажите, пожалуйста :)

Share this post


Link to post
Share on other sites

Команда у тебя должна быть "returnBalances" и все, без всяких "command=returnBalances&nonce="

Edited by Lordaster

Share this post


Link to post
Share on other sites

А как же уникальное целое число? пишут, что оно тоже нужно. У вас уже был опыт написания подобных программ?

Команда у тебя должна быть "returnBalances" и все, без всяких "command=returnBalances&nonce="

Additionally, all queries must include a "nonce" POST parameter. The nonce parameter is an integer which must always be greater than the previous nonce used.

Share this post


Link to post
Share on other sites

Делал на питоне. Не силен в дельфи, но там передаешь всего два параметра (саму команду и nonce).Вот смотри как это реализовано у меня

def returnAvailableAccountBalances():
    nonce = int(time.time() * 1000)
    parms = {"nonce": nonce,
             "command": 'returnAvailableAccountBalances'}
    parms = urllib.urlencode(parms)

    sign = hmac.new(api_secret, parms, hashlib.sha512).hexdigest()
    headers = {"Sign": sign,
               "Key": api_key,
               }

    public = urllib2.urlopen(urllib2.Request('https://poloniex.com/tradingApi', parms, headers))

    balance = json.loads(public.read())
    return balance

Share this post


Link to post
Share on other sites

 

 

Команда у тебя должна быть "returnBalances" и все, без всяких "command=returnBalances&nonce="

Неправильный ответ.  Все нужно.   И вашем коде это есть.   И command и nonce.

 

 

На перле вариант

sub post_polon_api {
  my ($uri, $key, $secret, $params) = @_;

  $req = HTTP::Request->new( 'POST', $uri );
  $req->header( 'Content-Type' => 'application/x-www-form-urlencoded' );
  $req->header( 'Key' => $key );
  $req->header( 'Sign' => hmac_sha512_hex($params, $secret) );
  $req->content( $params );

  my $lwp = LWP::UserAgent->new;
  $lwp->agent("Mozilla/5.0 (Windows NT 6.3; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0");
  return $lwp->request( $req );
  undef $lwp;
};


$method = 'GET';
$command = 'returnAvailableAccountBalances';
$nonce = time;
$params = "nonce=$nonce&method=$method&command=$command";

my $result = post_polon_api($uri,$polon_key,$polon_secret,$params);
$content = $result->content;

Share this post


Link to post
Share on other sites

 

 

nonce := FormatDateTime('yyyymmddhhnnsszzz',now);

Возможно у вас проблема с nonce. Потому что целое число - тип Integer может принимать значение до 2^31  = 2 147 483 647

В вашем случае это значение сильно больше.  Попробуйте использовать формат Unix Time в качестве nonce.

Нету делфи под рукой, что-нибудь типа такого напишите http://www.delphisources.ru/pages/faq/base/dt_to_unix_ts.html

Share this post


Link to post
Share on other sites

Возможно у вас проблема с nonce. Потому что целое число - тип Integer может принимать значение до 2^31  = 2 147 483 647

В вашем случае это значение сильно больше.  Попробуйте использовать формат Unix Time в качестве nonce.

Нету делфи под рукой, что-нибудь типа такого напишите http://www.delphisources.ru/pages/faq/base/dt_to_unix_ts.html

nonce имеет тип string, т.е. строка символов.Если я не ошибаюсь, то при POST запросах всегда отправляется текстовые значения. Попробовал присвоить значение nonce ='1', но результат тот же. 

К сожалению, я питон и перл не понимаю, но вроде у вас все аналогично)

Share this post


Link to post
Share on other sites

 

 

nonce имеет тип string, т.е. строка символов.Если я не ошибаюсь

 

Additionally, all queries must include a "nonce" POST parameter. The nonce parameter is an integer which must always be greater than the previous nonce used.

https://poloniex.com/support/api/

 

Неважно как Вы его храните в коде.  В POST запросе, конечно, это строка.

Share this post


Link to post
Share on other sites

У вас есть рабочая прога? Сможете через сниффер показать заголовки и post data запроса? Может я забыл какой-то параметр 

Share this post


Link to post
Share on other sites

POST / HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0
Content-Type: application/x-www-form-urlencoded
Key: XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX
Sign: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Content-Length: 50

nonce=1486010106&method=GET&command=returnBalances

Share this post


Link to post
Share on other sites

попробуйте сначала отправить и получить ответ от публичного API, для которого не надо подписи

Share this post


Link to post
Share on other sites
POST / HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0
Content-Type: application/x-www-form-urlencoded
Key: XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX
Sign: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Content-Length: 50

nonce=1486010106&method=GET&command=returnBalances

нашел отличия. У меня нет параметра 'method=GET'. Спасибо, щас попробую добавить этот параметр

Edited by QweR1ty

Share this post


Link to post
Share on other sites
Попробовал присвоить значение nonce ='1'

в моем коде нонсе = кол-во секунд между текущей датой/временем и 1970.01.01 00:00:00 приведенное к строке (без пробелов)

в следующем запросе разумеется нонсе должно увеличится на некоторое значение

Edited by antontmn

Share this post


Link to post
Share on other sites

e46btc, добавил параметр. Проблема та же

antontmn, публичные GET запросы работают нормально. Unix время я тоже сегодня пробовал использовать в параметре nonce. Проблему это не решило(

Edited by QweR1ty

Share this post


Link to post
Share on other sites

 

 

В чем может быть проблема? подскажите, пожалуйста

сниферни какой запрос уходит

Share this post


Link to post
Share on other sites

@senya2k


есть варианты запроса, когда nonce равно единице, равно Unix time и также пробовал добавить параметр method=GET, но проблема та же


Кто-нибудь писал подобную прогу на Delphi? может с кодировкой что-то? уже не знаю в чем может быть проблема

post-44413-0-74926300-1486019951_thumb.png

post-44413-0-06117300-1486019952_thumb.png

Share this post


Link to post
Share on other sites

может это забыли?

 

 

Content-Type: application/x-www-form-urlencoded
Edited by antontmn

Share this post


Link to post
Share on other sites

может это забыли?

Казалось бы пустяк, но все заработало. Спасибо огромное :)

Share this post


Link to post
Share on other sites

@QweR1ty, ждем супер_бота )

таких уже полно...хотя кто его знает  :D

Share this post


Link to post
Share on other sites

Посмотрел код на перле, после этого более понято стало на дельфи. Интересные конструкции, буду знать.

Share this post


Link to post
Share on other sites

sign:=SHA512DigestToHex(CalcHMAC_SHA512(Secret,post.DataString));

 

А  SHA512 Вы из какой компоненты/библиотеки получаете?

Share this post


Link to post
Share on other sites

Уже сам нашел :)
Если вдруг кому понадобится, библиотека Fundamentals Library, потребуется подцепить к проекту последнюю версию Fundamentals Hash, в момент написания, была - 4.00.15
Fundamentals Code Library

Share this post


Link to post
Share on other sites
День добрый

может у кого то есть бот который на поло может стоп лосс + тейк профит поставить? чтобы можно было выставить покупку, если закуп проходит - тогда ставим стоп лосс на некое значение, а дальше по ситуации - если значение достигает тейк профита, то ордер на стоп лосс снимается и сливается по рынку(разумеется если в стакане хватает нужного количества), ну и минимальные настройки на все параметры. Есть вообще такое чудо у кого нибудь? 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...