87 lines
5.4 KiB
Python
87 lines
5.4 KiB
Python
# coding=utf-8
|
||
import ujson
|
||
from binance.websocket.spot.websocket_client import SpotWebsocketClient as WebsocketClient
|
||
import time
|
||
import requests
|
||
import datetime
|
||
import pymysql
|
||
import math
|
||
from stock_indicators import indicators
|
||
from stock_indicators.indicators.common.quote import Quote
|
||
|
||
class NochainDbIf:
|
||
def __init__(self, host="172.17.0.1", port=4423, user="root", password="2GS@bPYcgiMyL14A", dbname="btcdb"):
|
||
self.conn = pymysql.connect(host=host, port=port, user=user, password=password, database=dbname, cursorclass=pymysql.cursors.DictCursor)
|
||
print("init nochain db suceess!")
|
||
# 可能用于与数据库交互。该方法是构造函数,它使用库设置与MySQL数据库的连接。
|
||
# 以下是该方法的作用的细分:__init__
|
||
# 它需要几个参数这些参数用于连接到MySQL数据库。如果未提供这些参数,则使用默认值。
|
||
# 在该方法中,它使用提供的参数建立与MySQL数据库的连接。
|
||
# 该参数指定结果应作为字典而不是元组返回,这样可以更方便地访问数据。cursorclass = pymysql.cursors.DictCursor
|
||
# 最后,它打印一条消息,指示数据库连接的初始化成功。
|
||
def get_ssr(self):
|
||
with self.conn.cursor() as cursor:
|
||
sql_cmd = "SELECT unixdt,ssr FROM nochainv3b order by unixdt"
|
||
cursor.execute(sql_cmd)
|
||
self.conn.commit()
|
||
return cursor.fetchall()
|
||
# 该方法似乎旨在从名为nochainv2b的MySQL数据库表中检索数据。下面是此方法的细分:get_ssr
|
||
# 它使用上下文管理器 () 自动处理游标,并确保在执行查询后正确关闭连接。with
|
||
# 在上下文管理器中,它准备一个SQL命令来从nochainv2b表中选择数据。该命令选择unixdt和ssr列,并按unixdt对结果进行排序。
|
||
# 它使用光标的方法执行SQL命令。execute
|
||
# 执行命令后,它使用.如果对数据库进行了任何需要永久保存的更改,则此步骤是必需的。self.conn.commit()
|
||
# 最后,它返回查询的结果 ,它以字典列表的形式检索查询返回的所有行,其中每个字典表示一行,其中列名作为键和相应的值。cursor.fetchall()
|
||
def update_ssr(self, dt, ssrosc):
|
||
with self.conn.cursor() as cursor:
|
||
sql_update = "UPDATE nochainv3b SET unixdt='%s', ssrosc='%s' WHERE unixdt='%s'" %(dt, ssrosc, dt)
|
||
print(sql_update)
|
||
cursor.execute(sql_update)
|
||
self.conn.commit()
|
||
# 该方法将更新MySQL数据库nochainv2b表中的数据。下面是此方法的细分:update_ssr
|
||
# 它需要两个参数:dt(可能表示时间戳)和ssrosc(可能表示与SSR相关的某个值)。
|
||
# 在该方法中,它准备一个SQLUPDATE命令来更新nochainv2b表中特定列的列。
|
||
# 该字符串的格式为dt和ssrosc的值,以动态构造SQL命令。这是潜在的风险,因为它开启了SQL注入攻击的可能性。改用参数化查询更安全。
|
||
# 然后,该方法打印出构造的SQL命令以进行调试。
|
||
# 它使用光标的方法执行SQL命令。execute
|
||
# 执行命令后,它会提交事务,使更改永久化。self.conn.commit()
|
||
# 但是,SQL命令中存在一个潜在问题:在设置新值和WHERE子句的条件时使用相同的值。这可能不按预期运行,因为它将更新与给定.
|
||
# 如果打算更新特定行,则可能需要相应地调整WHERE子句。
|
||
def rollback(self):
|
||
self.conn.rollback()
|
||
# 它对当前数据库连接执行回滚操作。以下是它的作用:rollback
|
||
# 它在数据库连接 () 上调用该方法。rollback self.conn
|
||
# 此操作将当前事务期间所做的任何未提交的更改还原到以前的状态。
|
||
# 当事务期间出现错误时,通常使用回滚,允许您还原在错误发生之前所做的任何更改。
|
||
def nochain():
|
||
try:
|
||
dbif = NochainDbIf()
|
||
ssr_ma = dbif.get_ssr()
|
||
#print(ssr_ma)
|
||
quotes_list = []
|
||
for item in ssr_ma:
|
||
print(item["unixdt"])
|
||
quotes_list.append(Quote(item["unixdt"],0,0,0,item["ssr"],0))
|
||
#print(quotes_list)
|
||
ssr_osc = indicators.get_bollinger_bands(quotes_list, 200, 2)
|
||
for item in ssr_osc:
|
||
if item.z_score is not None:
|
||
#print(item.date, item.sma, item.percent_b, item.z_score, item.width)
|
||
#dbif.update_ssr(item.date, item.z_score)
|
||
break
|
||
print("ok")
|
||
except Exception as e:
|
||
#dbif.rollback();
|
||
print(e)
|
||
finally:
|
||
print("end")
|
||
nochain()
|
||
# 可能使用该nochain类计算从 MySQL 数据库获取的 SSR(大概是卖空比率)数据上的布林带。NochainDbIf
|
||
# 以下是该函数功能的细分:
|
||
# 它首先创建类的实例以建立与数据库的连接。NochainDbIf
|
||
# 它使用实例的方法从数据库中检索 SSR 数据。get_ssr NochainDbIf
|
||
# 它使用检索到的 SSR 数据构造对象列表。Quote
|
||
# 它使用模块中的函数计算布林带。get_bollinger_bandsindicators
|
||
# 它遍历计算出的布林带,并打印有关每个带的一些信息。
|
||
# 目前,它似乎已注释掉了使用计算出的布林带更新数据库中 SSR 数据的部分。
|
||
# 如果在此过程中发生任何异常,它将捕获异常,打印它,然后继续。
|
||
# 最后,无论该过程是成功还是遇到错误,它都会打印“结束” |