192 lines
6.3 KiB
Python
192 lines
6.3 KiB
Python
# coding=utf-8
|
|
import ujson
|
|
from binance.websocket.spot.websocket_client import SpotWebsocketClient as WebsocketClient
|
|
import time
|
|
import requests
|
|
#from loguru import logger
|
|
import datetime
|
|
import pymysql
|
|
import math
|
|
|
|
|
|
class NochainDbIf:
|
|
def __init__(self, host="172.17.0.1", port=4423, user="root", password="2GS@bPYcgiMyL14A", dbname="ethdb"):
|
|
self.conn = pymysql.connect(host=host, port=port, user=user, password=password, database=dbname,
|
|
cursorclass=pymysql.cursors.DictCursor)
|
|
print("init nochain db suceess!")
|
|
|
|
def save(self, day, price, ma350x2, ma111, ma350x1, ma350x1r6, ma350x3, ma350x5):
|
|
with self.conn.cursor() as cursor:
|
|
sql_insert = "REPLACE INTO `nochainv3a` (`unixdt`, `price`, `ma350x2`, `ma111`, ma350x1, ma350x1r6, ma350x3, ma350x5) VALUES (FROM_UNIXTIME(%s), %s, %s, %s, %s, %s, %s, %s)"
|
|
# print(sql_insert)
|
|
cursor.execute(sql_insert, (day, price, ma350x2, ma111, ma350x1, ma350x1r6, ma350x3, ma350x5))
|
|
self.conn.commit()
|
|
|
|
def prepare_maxxx(prices, day, madays):
|
|
total = 0
|
|
cnt = 0
|
|
for i in range(madays):
|
|
if day in prices:
|
|
total += prices[day]
|
|
cnt += 1
|
|
# print(day, total, cnt)
|
|
day = str(int(day) - 3600 * 24)
|
|
|
|
if cnt > 0:
|
|
return total / cnt
|
|
return 0
|
|
|
|
def prepare_ma350(prices, day):
|
|
return prepare_maxxx(prices, day, 350)
|
|
|
|
def prepare_ma111(prices, day):
|
|
return prepare_maxxx(prices, day, 111)
|
|
|
|
def prepare_gold_ratio(prices):
|
|
ma350x1 = {}
|
|
ma350x1r6 = {}
|
|
ma350x2 = {}
|
|
ma350x3 = {}
|
|
ma350x5 = {}
|
|
for day in prices:
|
|
ma350x1[day] = prepare_maxxx(prices, day, 350)
|
|
ma350x1r6[day] = ma350x1[day] * 1.6
|
|
ma350x2[day] = ma350x1[day] * 2
|
|
ma350x3[day] = ma350x1[day] * 3
|
|
ma350x5[day] = ma350x1[day] * 5
|
|
|
|
return ma350x1, ma350x1r6, ma350x2, ma350x3, ma350x5
|
|
|
|
def calc_pi_cycle_top(dbif, prices):
|
|
ma350x2 = {}
|
|
ma111 = {}
|
|
for day in prices:
|
|
ma350x2[day] = prepare_ma350(prices, day) * 2
|
|
ma111[day] = prepare_ma111(prices, day)
|
|
return ma350x2, ma111
|
|
|
|
def get_current_utc():
|
|
curtime = time.gmtime(time.time())
|
|
daystr = time.strftime("%d %b %Y", curtime)
|
|
dayutc = int(time.mktime(time.strptime(daystr, "%d %b %Y")))
|
|
return dayutc
|
|
|
|
def get_current_price():
|
|
url = "https://data.messari.io/api/v1/assets/eth/metrics/market-data&interval=1d"
|
|
header_set = {}
|
|
header_set["x-messari-api-key"] = "aH2pyj5i4QGo1k1gLxXEbIJ5RJr+FYKLEWk6cRT6RuSc6lRY"
|
|
response_price = requests.get(url, headers=header_set)
|
|
if response_price.status_code == 200:
|
|
priceweb = ujson.loads(response_price.content)
|
|
if "data" in priceweb:
|
|
priceset = priceweb["data"]
|
|
if "market_data" in priceset:
|
|
pricedata = priceset["market_data"]
|
|
if "price_usd" in pricedata:
|
|
price = pricedata["price_usd"]
|
|
return price
|
|
return None
|
|
|
|
|
|
def get_history_price(coin_id):
|
|
prices = {}
|
|
|
|
dayutc = get_current_utc()
|
|
price = get_current_price()
|
|
if price is not None:
|
|
prices[str(dayutc)] = price
|
|
print("start...", dayutc, price)
|
|
|
|
dayt = time.gmtime()
|
|
daystr = time.strftime("%Y", dayt)
|
|
year = int(daystr)
|
|
end_year = year
|
|
while True:
|
|
# if end_year < 2022:
|
|
# break
|
|
url = ""
|
|
if end_year != year:
|
|
start_year = end_year
|
|
url = "https://data.messari.io/api/v1/assets/" + coin_id + "/metrics/price/time-series?start="
|
|
else:
|
|
url = "https://data.messari.io/api/v1/assets/" + coin_id + "/metrics/price/time-series?after=" + str(
|
|
year) + "-01-01&order=descending&interval=1d"
|
|
# now_time = time.gmtime()
|
|
# daystr = time.strftime("%Y-%m-%d", now_time)
|
|
# url = url + daystr + "&order=desc&format=json"
|
|
if end_year != year:
|
|
url = url + str(start_year) + "-01-01&end=" + str(end_year) + "-12-31&interval=1d&order=descending&interval=1d"
|
|
header_set = {}
|
|
header_set["x-messari-api-key"] = "aH2pyj5i4QGo1k1gLxXEbIJ5RJr+FYKLEWk6cRT6RuSc6lRY"
|
|
# header_set["Content-Type"] = "application/json"
|
|
print(header_set, url)
|
|
response_supply = requests.get(url, headers=header_set)
|
|
# print(response_supply)
|
|
if response_supply.status_code == 200:
|
|
#print(response_supply.content)
|
|
supplyweb = ujson.loads(response_supply.content)
|
|
if "data" in supplyweb:
|
|
supplyset = supplyweb["data"]
|
|
if "values" in supplyset:
|
|
valueset = supplyset["values"]
|
|
if valueset is not None:
|
|
for supply in valueset:
|
|
dayutc = int(supply[0] / 1000)
|
|
s = supply[1]
|
|
prices[str(dayutc)] = float(s)
|
|
# print(s, dayutc, supplys[str(dayutc)])
|
|
# break
|
|
else:
|
|
break
|
|
else:
|
|
break
|
|
end_year -= 1
|
|
time.sleep(2)
|
|
return prices
|
|
|
|
def get_eth_history_price():
|
|
return get_history_price("ethereum")
|
|
|
|
def nochain():
|
|
global dbif
|
|
dbif = NochainDbIf()
|
|
print("prepare...")
|
|
prices = get_eth_history_price()
|
|
#print(prices)
|
|
|
|
ma350x2, ma111 = calc_pi_cycle_top(dbif, prices)
|
|
print("calc_pi_cycle_top ok.")
|
|
ma350x1, ma350x1r6, ma350x2, ma350x3, ma350x5 = prepare_gold_ratio(prices);
|
|
print("prepare_gold_ratio ok.")
|
|
for day in prices:
|
|
#print(day)
|
|
ma350x21 = 0
|
|
if day in ma350x2:
|
|
ma350x21 = ma350x2[day]
|
|
ma1111 = 0
|
|
if day in ma111:
|
|
ma1111 = ma111[day]
|
|
|
|
ma350x11 = 0
|
|
if day in ma350x1:
|
|
ma350x11 = ma350x1[day]
|
|
|
|
ma350x1r61 = 0
|
|
if day in ma350x1r6:
|
|
ma350x1r61 = ma350x1r6[day]
|
|
|
|
ma350x31 = 0
|
|
if day in ma350x3:
|
|
ma350x31 = ma350x3[day]
|
|
|
|
ma350x51 = 0
|
|
if day in ma350x5:
|
|
ma350x51 = ma350x5[day]
|
|
|
|
# print(day, prices[day], ma350x21, ma1111, supply, issue, s2f_ratio1, s2f_deflection1)
|
|
dbif.save(int(day), prices[day], ma350x21, ma1111, ma350x11,
|
|
ma350x1r61, ma350x31, ma350x51)
|
|
#print("save ok.")
|
|
|
|
nochain()
|