mirror of https://github.com/midoks/mdserver-web
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.5 KiB
102 lines
2.5 KiB
import ccxt
|
|
import talib
|
|
|
|
import sys
|
|
import os
|
|
import time
|
|
import pandas as pd
|
|
import pandas_ta as ta
|
|
from pprint import pprint
|
|
|
|
sys.path.append(os.getcwd() + "/plugins/cryptocurrency_trade/strategy")
|
|
import common
|
|
|
|
# cd /www/server/mdserver-web && source bin/activate
|
|
# python3 plugins/cryptocurrency_trade/ccxt/strategy/rsi_robot.py run
|
|
|
|
|
|
pd.set_option('display.max_rows', None)
|
|
|
|
exchange = common.initEx()
|
|
|
|
# 查看隐形方法
|
|
# print(dir(exchange))
|
|
|
|
|
|
exchange.load_markets()
|
|
|
|
entry_rsi = 30
|
|
exit_rsi = 40
|
|
|
|
|
|
symbol = 'XRP/USDT'
|
|
timeframe = '15m'
|
|
|
|
tf_mult = exchange.parse_timeframe(timeframe) * 1000
|
|
|
|
|
|
def indicators(data):
|
|
|
|
data['rsi'] = data.ta.rsi(length=10)
|
|
data['ema'] = data.ta.ema(length=200)
|
|
|
|
# close_p = data['close'].values
|
|
# data['rsi'] = talib.RSI(close_p, timeperiod=10)
|
|
# data['ema'] = talib.EMA(close_p, timeperiod=200)
|
|
return data
|
|
|
|
|
|
def check_buy_sell_signals(df):
|
|
last_row_index = len(df.index) - 1
|
|
lastest_rsi = round(df['rsi'].iloc[-1], 2)
|
|
lastest_price = round(df['close'].iloc[-1], 5)
|
|
lastest_ema = round(df['ema'].iloc[-1], 5)
|
|
lastest_ts = df['timestamp'].iloc[-1]
|
|
|
|
msg = "lastest_rsi:" + str(lastest_rsi) + " < entry_rsi:" + str(entry_rsi)
|
|
msg += ",lastest_price:" + \
|
|
str(lastest_price) + " > lastest_ema:" + str(lastest_ema)
|
|
print(msg)
|
|
|
|
long_cond = (lastest_rsi < entry_rsi) and (lastest_price > lastest_ema)
|
|
if long_cond:
|
|
print("买入")
|
|
order = exchange.create_market_buy_order(symbol, 1)
|
|
|
|
closed_orders = exchange.fetchClosedOrders(symbol, limit=2)
|
|
if len(closed_orders) > 0:
|
|
print("closed_orders:", closed_orders)
|
|
most_recent_closed_order = closed_orders[-1]
|
|
diff = lastest_ts - most_recent_closed_order['timestamp']
|
|
last_buy_signal_cnt = int(diff / tf_mult)
|
|
|
|
exit_cond = (lastest_rsi > exit_rsi) and (last_buy_signal_cnt > 10)
|
|
if exit_cond:
|
|
print("卖出")
|
|
order = exchange.create_market_sell_order(symbol, 1)
|
|
return
|
|
|
|
|
|
def runBot():
|
|
bars = exchange.fetch_ohlcv(symbol, timeframe=timeframe, limit=200)
|
|
df = pd.DataFrame(bars[:], columns=['timestamp',
|
|
'open', 'high', 'low', 'close', 'volume'])
|
|
df['dt'] = pd.to_datetime(df['timestamp'], unit='ms')
|
|
|
|
df = indicators(df).tail(30)
|
|
|
|
check_buy_sell_signals(df)
|
|
|
|
|
|
def longRunBot():
|
|
while True:
|
|
runBot()
|
|
time.sleep(10)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
func = sys.argv[1]
|
|
if func == 'run':
|
|
longRunBot()
|
|
else:
|
|
print('error')
|
|
|