update
This commit is contained in:
parent
73caaffef8
commit
373f8c96ff
31
datasource/alltick.py
Normal file
31
datasource/alltick.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import requests
|
||||||
|
import urllib.parse
|
||||||
|
import json
|
||||||
|
|
||||||
|
token = '6c7ba077eee07f6f270e219d4848700e-c-app'
|
||||||
|
base_stock_url = 'https://quote.tradeswitcher.com/quote-stock-b-api/batch-kline'
|
||||||
|
base_others_url = 'https://quote.tradeswitcher.com/quote-b-api/batch-kline'
|
||||||
|
test_headers = {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_klines(type, symbols, interval):
|
||||||
|
query = {
|
||||||
|
"trace": "3baaa938-f92c-4a74-a228-fd49d5e2f8bc-1678419657806",
|
||||||
|
"data": {
|
||||||
|
"code": "AAPL.US",
|
||||||
|
"kline_type": 8,
|
||||||
|
"kline_timestamp_end": 0,
|
||||||
|
"query_kline_num": 500,
|
||||||
|
"adjust_type": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
url = base_stock_url + f"/kline?token={token}"
|
||||||
|
print(url)
|
||||||
|
data = requests.get(url, headers=test_headers).json()
|
||||||
|
print(data)
|
||||||
|
|
||||||
|
|
||||||
|
get_klines()
|
||||||
9
dingding.py
Normal file
9
dingding.py
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import requests
|
||||||
|
import setting
|
||||||
|
|
||||||
|
url = 'https://oapi.dingtalk.com/robot/send?access_token=c197bfacc77010e92804ecdbb6a6e0f95f86d9e7e4968fb35ec68720eeec8fa8'
|
||||||
|
|
||||||
|
# 发送消息
|
||||||
|
def send_message(text):
|
||||||
|
formData = {"msgtype":"text","text":{"content": text},"isAtAll":1}
|
||||||
|
requests.post(url, data= formData)
|
||||||
2
main.py
2
main.py
@ -13,7 +13,7 @@ times = ["00:00", "04:00", "08:00", "12:00", "16:00", "20:00"]
|
|||||||
for t in times:
|
for t in times:
|
||||||
schedule.every().day.at(t).do(vegas.run_crypto, interval = '4h')
|
schedule.every().day.at(t).do(vegas.run_crypto, interval = '4h')
|
||||||
|
|
||||||
version = 'V1.3'
|
version = 'V1.4'
|
||||||
print(f'Running... {version}')
|
print(f'Running... {version}')
|
||||||
telegram_sender.send_message(setting.chat_id, f'☕️ Strategy is updated!\r\n\r\nVersion: {version}')
|
telegram_sender.send_message(setting.chat_id, f'☕️ Strategy is updated!\r\n\r\nVersion: {version}')
|
||||||
while True:
|
while True:
|
||||||
|
|||||||
59
monitors/move.py
Normal file
59
monitors/move.py
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
from binance.spot import Spot
|
||||||
|
import talib
|
||||||
|
import numpy as np
|
||||||
|
import pandas as pd
|
||||||
|
import datasource.crypto
|
||||||
|
import time,setting
|
||||||
|
import telegram_sender
|
||||||
|
from datasource import crypto
|
||||||
|
from datetime import datetime
|
||||||
|
import dingding
|
||||||
|
|
||||||
|
|
||||||
|
# crossover 函数:检测上穿信号
|
||||||
|
def crossover(series1, series2):
|
||||||
|
return (series1 > series2) & (series1.shift(1) <= series2.shift(1))
|
||||||
|
|
||||||
|
# crossunder 函数:检测下穿信号
|
||||||
|
def crossunder(series1, series2):
|
||||||
|
return (series1 < series2) & (series1.shift(1) >= series2.shift(1))
|
||||||
|
|
||||||
|
## 检查信号
|
||||||
|
def stratergy_run(symbol, interval, df, debug):
|
||||||
|
maxDifference = 0.005
|
||||||
|
|
||||||
|
## 计算 ema
|
||||||
|
df['ema5'] = talib.EMA(df['close'], timeperiod=5)
|
||||||
|
df['ema10'] = talib.EMA(df['close'], timeperiod=10)
|
||||||
|
df['ema30'] = talib.EMA(df['close'], timeperiod=30)
|
||||||
|
df['ema144'] = talib.EMA(df['close'], timeperiod=144)
|
||||||
|
|
||||||
|
shortDiff = abs(df['ema5'] - df['ema10']) / df['ema10']
|
||||||
|
midDiff = abs(df['ema10'] - df['ema30']) / df['ema30']
|
||||||
|
longDiff = abs(df['ema30'] - df['ema144']) / df['ema144']
|
||||||
|
|
||||||
|
df['priceCheck'] = (longDiff <= maxDifference) & (midDiff <= maxDifference) & (shortDiff <= maxDifference)
|
||||||
|
df['isLongArrangement'] = (df['ema5'] > df['ema10']) & (df['ema10'] > df['ema30']) & (df['ema30'] > df['ema144'])
|
||||||
|
df['preLongArrangement'] = (df['ema5'].shift(1) > df['ema10'].shift(1)) & (df['ema10'].shift(1) > df['ema30'].shift(1)) & (df['ema30'].shift(1) > df['ema144'].shift(1))
|
||||||
|
|
||||||
|
latest = df.iloc[-1]
|
||||||
|
isbullish = latest['preLongArrangement'] == False & latest['isLongArrangement'] == True & latest['priceCheck'] ==True
|
||||||
|
print(f"{symbol} bullish: {isbullish}")
|
||||||
|
if(isbullish):
|
||||||
|
message = f"⭐️信号策略⭐️\r\n\r\n"
|
||||||
|
message += f"策略:【趋势追踪V1.0】\r\n"
|
||||||
|
message += f"品种: {symbol}\r\n"
|
||||||
|
message += f"周期: {interval}\r\n\r\n"
|
||||||
|
message += f"信号: 【启动】\r\n\r\n"
|
||||||
|
|
||||||
|
dingding.send_message(message)
|
||||||
|
|
||||||
|
|
||||||
|
def run_crypto(interval, debug=False):
|
||||||
|
|
||||||
|
symbols = ['BTCUSDT',"ETHUSDT",'LTCUSDT','DOGEUSDT','FTMUSDT','FILUSDT','OPUSDT','SOLUSDT','BNBUSDT','BCHUSDT','ETCUSDT','ARUSDT']
|
||||||
|
for s in symbols:
|
||||||
|
df = crypto.get_klines(s, interval)
|
||||||
|
stratergy_run(s,interval, df, debug)
|
||||||
|
|
||||||
|
time.sleep(1)
|
||||||
42
monitors/twitter.py
Normal file
42
monitors/twitter.py
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
import tweepy
|
||||||
|
import time
|
||||||
|
|
||||||
|
# 替换为你的 Twitter API 密钥
|
||||||
|
API_KEY = 'PvmpsQ03urOzrZLxFRaTlq1e2'
|
||||||
|
API_KEY_SECRET = 'SY2xcGOJBVRO8pStF23Al5lHgXRJ95b9gzHuOdX6sI40D9IZ0Z'
|
||||||
|
ACCESS_TOKEN = '209453217-1TBd7HtWSrzVc24ZYVzb3JwbOtxPxGuqRwq4bXuW'
|
||||||
|
ACCESS_TOKEN_SECRET = 'oU39wnIOCwILHZ2RXbzHSGnS9e0SAsvtwF6PhyhDU0Hra'
|
||||||
|
BEARER_TOKEN = 'AAAAAAAAAAAAAAAAAAAAAN3VtQEAAAAAKSMZ3VcPmGVwMgxIjX8yeb9Fbow%3DXl2BW9tUi5vn1y6uFpcA8DsyXp56yd0MQnmGhheWK04tFKPxDf'
|
||||||
|
|
||||||
|
# 认证到 Twitter API
|
||||||
|
client = tweepy.Client(bearer_token=BEARER_TOKEN,
|
||||||
|
consumer_key=API_KEY,
|
||||||
|
consumer_secret=API_KEY_SECRET,
|
||||||
|
access_token=ACCESS_TOKEN,
|
||||||
|
access_token_secret=ACCESS_TOKEN_SECRET)
|
||||||
|
|
||||||
|
# 指定要监控的 Twitter 账号
|
||||||
|
twitter_username = 'whale_alert'
|
||||||
|
|
||||||
|
# 获取用户ID
|
||||||
|
user = client.get_user(username=twitter_username)
|
||||||
|
user_id = user.data.id
|
||||||
|
|
||||||
|
# 已处理推文的ID集合
|
||||||
|
processed_tweet_ids = set()
|
||||||
|
|
||||||
|
def monitor_tweets(user_id):
|
||||||
|
# 获取该用户最新的推文
|
||||||
|
response = client.get_users_tweets(id=user_id, max_results=5)
|
||||||
|
tweets = response.data
|
||||||
|
|
||||||
|
# 处理和打印新的推文
|
||||||
|
for tweet in tweets:
|
||||||
|
if tweet.id not in processed_tweet_ids:
|
||||||
|
print(f'{tweet.id} - {tweet.text}')
|
||||||
|
processed_tweet_ids.add(tweet.id)
|
||||||
|
|
||||||
|
# 定期监控推文(例如每隔 60 秒)
|
||||||
|
while True:
|
||||||
|
monitor_tweets(user_id)
|
||||||
|
time.sleep(60)
|
||||||
@ -7,6 +7,7 @@ import time,setting
|
|||||||
import telegram_sender
|
import telegram_sender
|
||||||
from datasource import crypto
|
from datasource import crypto
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
import dingding
|
||||||
|
|
||||||
|
|
||||||
# crossover 函数:检测上穿信号
|
# crossover 函数:检测上穿信号
|
||||||
@ -18,7 +19,7 @@ def crossunder(series1, series2):
|
|||||||
return (series1 < series2) & (series1.shift(1) >= series2.shift(1))
|
return (series1 < series2) & (series1.shift(1) >= series2.shift(1))
|
||||||
|
|
||||||
## 检查信号
|
## 检查信号
|
||||||
def stratergy_run(symbol, interval,df):
|
def stratergy_run(symbol, interval, df, debug):
|
||||||
## 计算 ema
|
## 计算 ema
|
||||||
df['ema13'] = talib.EMA(df['close'], timeperiod=13)
|
df['ema13'] = talib.EMA(df['close'], timeperiod=13)
|
||||||
df['ema144'] = talib.EMA(df['close'], timeperiod=144)
|
df['ema144'] = talib.EMA(df['close'], timeperiod=144)
|
||||||
@ -63,16 +64,22 @@ def stratergy_run(symbol, interval,df):
|
|||||||
|
|
||||||
print(f"【{symbol} - {interval}】 is checked!")
|
print(f"【{symbol} - {interval}】 is checked!")
|
||||||
if direction != "":
|
if direction != "":
|
||||||
|
if debug == False:
|
||||||
telegram_sender.send_message(setting.chat_id, message)
|
telegram_sender.send_message(setting.chat_id, message)
|
||||||
|
dingding.send_message(message)
|
||||||
print(f"【{symbol} - {interval}】 is singaled!")
|
print(f"【{symbol} - {interval}】 is singaled!")
|
||||||
|
else:
|
||||||
|
print(message)
|
||||||
|
|
||||||
def run_crypto(interval):
|
|
||||||
|
def run_crypto(interval, debug=False):
|
||||||
print('Vegas策略运行.')
|
print('Vegas策略运行.')
|
||||||
|
|
||||||
|
# symbols = crypto.get_symbols()
|
||||||
# symbols = crypto.get_top_binance_usdt_pairs(10)
|
# symbols = crypto.get_top_binance_usdt_pairs(10)
|
||||||
symbols = ['BTCUSDT',"ETHUSDT",'LTCUSDT','DOGEUSDT','FTMUSDT','FILUSDT','OPUSDT','SOLUSDT','BNBUSDT','BCHUSDT','ETCUSDT','ARUSDT']
|
symbols = ['BTCUSDT',"ETHUSDT",'LTCUSDT','DOGEUSDT','FTMUSDT','FILUSDT','OPUSDT','SOLUSDT','BNBUSDT','BCHUSDT','ETCUSDT','ARUSDT']
|
||||||
for s in symbols:
|
for s in symbols:
|
||||||
df = crypto.get_klines(s, interval)
|
df = crypto.get_klines(s, interval)
|
||||||
stratergy_run(s,interval, df)
|
stratergy_run(s,interval, df, debug)
|
||||||
|
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
@ -5,3 +5,4 @@ pandas
|
|||||||
requests
|
requests
|
||||||
schedule
|
schedule
|
||||||
TA_Lib
|
TA_Lib
|
||||||
|
tweepy
|
||||||
Loading…
Reference in New Issue
Block a user