import json
import time
from datetime import datetime
import numpy as np
np.set_printoptions(suppress=True)
import pandas as pd
import requests
import _thread
class DingTalk_Base:
def __init__(self):
self.__headers = {'Content-Type': 'application/json;charset=utf-8'}
self.url = ''
def send_msg(self, text):
json_text = {
"msgtype": "text",
"text": {
"content": text
}
}
try:
requests.post(self.url, json.dumps(json_text), headers=self.__headers,
timeout=10)
except requests.exceptions.RequestException as e:
Log(f"发送消息失败: {e}")
class DingTalk_Disaster_3(DingTalk_Base):
def __init__(self):
super().__init__()
self.url = 'http://127.0.0.1:2222/your_endpoint'
def ding_log():
global log_list
ding = DingTalk_Disaster_3()
while True:
if len(log_list) != 0:
ding.send_msg(log_list[0])
del log_list[0]
Sleep(300)
else:
Sleep(300)
def Log_def(msg1, msg2):
global log_list
msg_info = str(msg1) + str(msg2)
log_list.append(msg_info)
Log(msg_info)
def calculate_vwap_np(records):
if len(records) != 168:
return "未知"
prices = np.array([(record["High"] + record["Low"] + record["Close"]) / 3 for record in records])
volumes = np.array([record["Volume"] for record in records])
vwap = np.sum(prices * volumes) / np.sum(volumes)
return vwap
def calculate_bollinger_bands_np(vwap, records, std_dev, std_dev2):
if len(records) != 168:
return "未知", "未知", "未知", "未知"
high_std_dev = calculate_std_dev_np(records, "High")
low_std_dev = calculate_std_dev_np(records, "Low")
upper_band = vwap + std_dev * high_std_dev
lower_band = vwap - std_dev * low_std_dev
upper_band2 = vwap + std_dev2 * high_std_dev
lower_band2 = vwap - std_dev2 * low_std_dev
return upper_band, lower_band, upper_band2, lower_band2
def calculate_std_dev_np(records, price_key):
prices = np.array([record[price_key] for record in records])
std_dev = np.std(prices)
return std_dev
class mytrade():
def __init__(self, symbol_code):
self.symbol = symbol_code
self.period_list = [1 * 60 * 60, 4 * 60 * 60]
self.period_name_list = ["1h", "4h"]
self.last_time_list = []
exchange.SetCurrency(self.symbol)
for period in self.period_list:
records = _C(exchange.GetRecords, period)
self.last_time_list.append(records[-1]["Time"])
Sleep(200)
def poll(self):
exchange.SetCurrency(self.symbol)
exchange.SetMaxBarLen(168)
for i in range(len(self.period_list)):
Sleep(200)
period = self.period_list[i]
period_name = self.period_name_list[i]
records = _C(exchange.GetRecords, period)
print('成功获取{}的{}根K线数据:'.format(self.symbol, len(records)))
if records[-1]["Time"] != self.last_time_list[i]:
self.last_time_list[i] = records[-1]["Time"]
now_price = records[-1]["Close"]
str1 = "在最近一次计算中," + self.symbol + " " + period_name + "" + "价格约为$" + str(now_price) + "。"
vwap = calculate_vwap_np(records)
upper_band, lower_band, upper_band2, lower_band2 = calculate_bollinger_bands_np(vwap, records, 2, 3)
if period_name == "1h":
if now_price > upper_band2:
str2 = f"如果您是短线交易者,那么从短期来看,目前价格上涨过猛,已远高于正常波动水平,请警惕回调,下方第一支撑位为{upper_band},第二支撑位为{vwap}(平均筹码价格水平,关键位置)"
elif now_price > upper_band:
str2 = f"如果您是短线交易者,那么从短期来看,目前价格处于高位,上方压力位为{upper_band2},下方第一支撑位为{upper_band},第二支撑位为{vwap}(平均筹码价格水平,关键位置)"
elif now_price > vwap:
str2 = f"如果您是短线交易者,那么从短期来看,目前价格运行较为平稳,上方第一压力位为{upper_band},第二压力位为{upper_band2},下方第一支撑位为{vwap}(平均筹码价格水平,关键位置),第二支撑位为{lower_band}"
elif now_price > lower_band:
str2 = f"如果您是短线交易者,那么从短期来看,目前价格运行较为平稳,上方第一压力位为{vwap}(平均筹码价格水平,关键位置),第二压力位为{upper_band},下方第一支撑位为{lower_band},第二支撑位为{lower_band2}"
elif now_price > lower_band2:
str2 = f"如果您是短线交易者,那么从短期来看,目前价格处于低位,上方第一压力位为{lower_band},第二压力位为{vwap}(平均筹码价格水平,关键位置),下方支撑位为{lower_band2}"
else:
str2 = f"如果您是短线交易者,那么从短期来看,目前价格下跌急速,已远低于正常波动水平,随时可能止跌回升,上方第一压力位为{lower_band},第二压力位为{vwap}(平均筹码价格水平,关键位置)"
Log_def(str1, str2)
elif period_name == "4h":
if now_price > upper_band2:
str2 = f"如果您是中长线交易者,那么从中长期来看,目前价格上涨过猛,已远高于正常波动水平,请警惕回调,下方第一支撑位为{upper_band},第二支撑位为{vwap}(平均筹码价格水平,关键位置)"
elif now_price > upper_band:
str2 = f"如果您是中长线交易者,那么从中长期来看,目前价格处于高位,上方压力位为{upper_band2},下方第一支撑位为{upper_band},第二支撑位为{vwap}(平均筹码价格水平,关键位置)"
elif now_price > vwap:
str2 = f"如果您是中长线交易者,那么从中长期来看,目前价格运行较为平稳,上方第一压力位为{upper_band},第二压力位为{upper_band2},下方第一支撑位为{vwap}(平均筹码价格水平,关键位置),第二支撑位为{lower_band}"
elif now_price > lower_band:
str2 = f"如果您是中长线交易者,那么从中长期来看,目前价格运行较为平稳,上方第一压力位为{vwap}(平均筹码价格水平,关键位置),第二压力位为{upper_band},下方第一支撑位为{lower_band},第二支撑位为{lower_band2}"
elif now_price > lower_band2:
str2 = f"如果您是中长线交易者,那么从中长期来看,目前价格处于低位,上方第一压力位为{lower_band},第二压力位为{vwap}(平均筹码价格水平,关键位置),下方支撑位为{lower_band2}"
else:
str2 = f"如果您是中长线交易者,那么从中长期来看,目前价格下跌急速,已远低于正常波动水平,随时可能止跌回升,上方第一压力位为{lower_band},第二压力位为{vwap}(平均筹码价格水平,关键位置)"
Log_def(str1, str2)
def main():
global log_list
log_list = ['sdfsfsdfsdfdfsd']
try:
_thread.start_new_thread(ding_log, ())
except Exception as e:
Log("错误信息:", e)
raise Exception("stop")
trade_list = []
symbol_code_list = symbol_input.split(",")
for symbol_code in symbol_code_list:
trade_class = mytrade(symbol_code)
trade_list.append(trade_class)
while True:
for trade_class1 in trade_list:
trade_class1.poll()