forked from freqtrade/freqtrade
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathanalyze.py
127 lines (109 loc) · 4.1 KB
/
analyze.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
from datetime import timedelta
import time
import arrow
import matplotlib
import logging
matplotlib.use("Qt5Agg")
import matplotlib.pyplot as plt
import requests
from pandas.io.json import json_normalize
from stockstats import StockDataFrame
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
def get_ticker_dataframe(pair):
"""
Analyses the trend for the given pair
:param pair: pair as str in format BTC_ETH or BTC-ETH
:return: StockDataFrame
"""
minimum_date = arrow.now() - timedelta(hours=2)
url = 'https://bittrex.com/Api/v2.0/pub/market/GetTicks'
params = {
'marketName': pair.replace('_', '-'),
'tickInterval': 'OneMin',
'_': minimum_date.timestamp * 1000
}
data = requests.get(url, params).json()
if not data['success']:
raise RuntimeError('BITTREX: {}'.format(data['message']))
data = [{
'close': t['C'],
'volume': t['V'],
'open': t['O'],
'high': t['H'],
'low': t['L'],
'date': t['T'],
} for t in data['result'] if arrow.get(t['T']) > minimum_date]
dataframe = StockDataFrame(json_normalize(data))
# calculate StochRSI
rsi = dataframe['rsi_{}'.format(14)]
rolling = rsi.rolling(window=14, center=False)
low = rolling.min()
high = rolling.max()
dataframe['stochrsi'] = (rsi - low) / (high - low)
return dataframe
def populate_trends(dataframe):
"""
Populates the trends for the given dataframe
:param dataframe: StockDataFrame
:return: StockDataFrame with populated trends
"""
#dataframe.loc[
# (dataframe['stochrsi'] < 0.20)
# & (dataframe['close_12_ema'] <= dataframe['close_26_ema']),
# 'bullish'
#] = 1
dataframe.loc[
(dataframe['stochrsi'] < 0.20), 'underpriced'
] = 1
dataframe.loc[dataframe['underpriced'] == 1, 'buy'] = dataframe['close']
return dataframe
def get_buy_signal(pair):
"""
Calculates a buy signal based on StochRSI indicator
:param pair: pair in format BTC_ANT or BTC-ANT
:return: True if pair is underpriced, False otherwise
"""
dataframe = get_ticker_dataframe(pair)
dataframe = populate_trends(dataframe)
latest = dataframe.iloc[-1]
signal = latest['underpriced'] == 1
logger.debug('buy_trigger: {} (pair={}, signal={})'.format(latest['date'], pair, signal))
return signal
def plot_dataframe(dataframe, pair):
"""
Plots the given dataframe
:param dataframe: StockDataFrame
:param pair: pair as str
:return: None
"""
# Three subplots sharing x axe
f, (ax1, ax2, ax3) = plt.subplots(3, sharex=True)
f.suptitle(pair, fontsize=14, fontweight='bold')
ax1.plot(dataframe.index.values, dataframe['close'], label='close')
ax1.plot(dataframe.index.values, dataframe['close_12_ema'], label='EMA(12)')
ax1.plot(dataframe.index.values, dataframe['close_26_ema'], label='EMA(26)')
# ax1.plot(dataframe.index.values, dataframe['sell'], 'ro', label='sell')
ax1.plot(dataframe.index.values, dataframe['buy'], 'bo', label='buy')
ax1.legend()
ax2.plot(dataframe.index.values, dataframe['macd'], label='MACD')
ax2.plot(dataframe.index.values, dataframe['macds'], label='MACDS')
ax2.plot(dataframe.index.values, dataframe['macdh'], label='MACD Histogram')
ax2.plot(dataframe.index.values, [0] * len(dataframe.index.values))
ax2.legend()
ax3.plot(dataframe.index.values, dataframe['stochrsi'], label='StochRSI')
ax3.plot(dataframe.index.values, [0.80] * len(dataframe.index.values))
ax3.plot(dataframe.index.values, [0.20] * len(dataframe.index.values))
ax3.legend()
# Fine-tune figure; make subplots close to each other and hide x ticks for
# all but bottom plot.
f.subplots_adjust(hspace=0)
plt.setp([a.get_xticklabels() for a in f.axes[:-1]], visible=False)
plt.show()
if __name__ == '__main__':
while True:
pair = 'BTC_ANT'
for pair in ['BTC_ANT', 'BTC_ETH', 'BTC_GNT', 'BTC_ETC']:
get_buy_signal(pair)
time.sleep(60)