Files
coinbus-data/coinbus/nochain_eth_lyq.py
2025-10-11 18:06:48 +08:00

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()