Created
February 20, 2020 10:05
-
-
Save jat001/cdeb6718adbc89a2b044a00db88ddb10 to your computer and use it in GitHub Desktop.
Sell HNS automatically
This file contains 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
#!/usr/bin/env python3 | |
# -*- coding: utf-8 -*- | |
import sys | |
from decimal import Decimal | |
from datetime import datetime | |
try: | |
import requests | |
import simplejson as json | |
except ImportError: | |
raise ImportError('You must install requests and simplejson first!') | |
namebase_cookie = 's:' | |
btc_address = 'bc1q3hkc265vxqu8dk4dkk68sf607086vmckwm2z6e' | |
# The unit of expect_prices is mBTC! 1 BTC = 1,000 mBTC. the smallest unit of mBTC is 1e−5 | |
expect_prices = [ | |
# min unit price (mBTC per HNS), max unit price (mBTC per HNS), the amount of HNS to sell | |
('0.02', 999, 5000), | |
(0, '0.005', 3000), | |
('0.018', '0.01999', 2000), | |
] | |
reserve_amount = 500 | |
def time(): | |
return datetime.now().isoformat() | |
def normalize(d): | |
return '{:f}'.format(d.normalize()) | |
def prin(*args, **kwargs): | |
args = [normalize(arg) if isinstance(arg, Decimal) else arg for arg in args] | |
return print(time(), *args, **kwargs) | |
def get_hns_balance(s): | |
r = s.get('https://www.namebase.io/api/user') | |
# Format: str Unit: μHNS | |
balance = Decimal(r.json()['hns_balance']) / 1000 / 1000 | |
prin('You have', balance, 'HNS.') | |
return balance | |
def get_current_price(s, p): | |
r = s.get('https://www.namebase.io/api/exchange/sell', timeout=2) | |
# Format: float Unit: BTC | |
price = r.json(use_decimal=True)['price'] * 1000 | |
if p: | |
prin('Current price is', price, 'mBTC.') | |
return price | |
def sell_hns(amount, s): | |
r = s.post('https://www.namebase.io/api/exchange/trade/hns/btc', json={ | |
'address': btc_address, | |
'amount': normalize(amount * 1000 * 1000), | |
}) | |
# {'success': bool, 'txHash': str, 'baseAmount': str HNS, 'quoteAmount': str BTC, 'user': {'hns_balance': str μHNS}} | |
# {'errorCode': str, 'errorData': dict} | |
res = r.json() | |
if 'success' in res and res['success']: | |
balance = Decimal(res['user']['hns_balance']) / 1000 / 1000 | |
prin('Sold', Decimal(res['baseAmount']), 'HNS for', Decimal(res['quoteAmount']) / 1000, 'mBTC.', | |
'You have', balance, 'HNS left.') | |
else: | |
prin('Sell HNS failed:', 'errorCode' in res and res['errorCode'] or 'UnknownError', file=sys.stderr) | |
balance = get_hns_balance(s) | |
return balance | |
def run(): | |
with requests.Session() as s: | |
requests.utils.add_dict_to_cookiejar(s.cookies, { | |
'namebase-main': namebase_cookie, | |
}) | |
balance = get_hns_balance(s) | |
reserved = Decimal(reserve_amount) | |
i = 0 | |
while True: | |
if balance <= reserved: | |
prin('The reserve amount is', reserved, 'HNS, but you only have', balance, 'HNS.') | |
break | |
try: | |
price = get_current_price(s, i % 10 == 0) | |
for inx, (min_price, max_price, amount) in enumerate(expect_prices): | |
if Decimal(min_price) <= price <= Decimal(max_price): | |
amount = Decimal(amount) | |
if amount > balance: | |
amount = balance | |
if balance - amount < reserved: | |
amount = balance - reserved | |
prin('Selling', amount, 'HNS for', price, 'mBTC each.') | |
balance = sell_hns(amount, s) | |
expect_prices.pop(inx) | |
break | |
except Exception as e: | |
prin(e, file=sys.stderr) | |
i += 1 | |
if __name__ == '__main__': | |
run() |
再解释下expect_prices
,就跟交易所挂单一样,只不过不占用任何实际额度,优先级从前到后,匹配到第一个就停止,卖出成功后该规则自动失效,一直到余额<=reserve_amount
为止。
expect_prices = [
('0.02', 999, 5000),
(0, '0.005', 3000),
('0.018', '0.01999', 2000),
]
reserve_amount = 500
针对这个示例说明,假设我现在有4000HNS,我的心理价位是0.02mBTC/HNS,所以我第一条规则就设置了当价格>=0.02mBTC/HNS时,卖出5000HNS,因为我只有4000HNS,还设置了保留500HNS,如果价格涨到0.02BTC/HNS,那么脚本就会卖出3500HNS。但HNS的价格一直在跌,我怕不仅涨不到我的心理价位,还会一直跌下去,所以我设置了当价格低于0.005mBTC/HNS时,卖出3000HNS以止损。不过无论是0.02还是0.005,都距离现在的行情有些距离,所以我在第三条设置了当价格为0.018-0.01999mBTC/HNS,卖出2000HNS以保证收益,所以只要这条规则被触发过,那就只剩下4000-2000-500=1500HNS
可卖了。如果价格一直往上涨,直到大于0.02mBTC/HNS,那么我的收益当然比不加最后一条规则要少,但如果价格涨到0.018mBTC/HNS后又一路下跌,那么我至少保证了2000HNS*0.018mBTC/HNS=36mBTC
的收益
https://www.namebase.io/pro
发现这里能直接挂单。。。已售。
https://www.namebase.io/pro
发现这里能直接挂单。。。已售。
我也是一开始没发现,白写了个脚本
https://www.namebase.io/pro
发现这里能直接挂单。。。已售。我也是一开始没发现,白写了个脚本
我也是。。。。看着你这个挂单,后面发现朋友说那里能挂单。
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
就一脚本,啥参数不改都跑不起来,上面这4个参数都是让你改的
namebase_cookie
不设连价格都获取不了,btc_address
改成你自己的,reserve_amount
不看好这币的前景就设成0,看好的话想留多少自己设,expect_prices
说不定明天又腰斩了,根据行情和自己的心理价位设