forked from DefiLab-xyz/uniswap-v3-backtest-python
-
Notifications
You must be signed in to change notification settings - Fork 0
/
GraphBacktest.py
58 lines (49 loc) · 1.58 KB
/
GraphBacktest.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
from datetime import datetime
from gql import gql, Client
from gql.transport.requests import RequestsHTTPTransport
import pandas as pd
from cachier import cachier
@cachier()
def graph(Adress, fromdate, tilldate=int(datetime.utcnow().timestamp())):
client = Client(
transport=RequestsHTTPTransport(
url='https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3',
verify=True,
retries=5,
)
)
query = gql('''
query ($fromdate: Int!, $tilldate: Int!) {
poolHourDatas(where:{pool:"'''+str(Adress)+'''",periodStartUnix_gt:$fromdate,periodStartUnix_lt:$tilldate},orderBy:periodStartUnix,orderDirection:desc,first:1000) {
periodStartUnix
liquidity
high
low
pool {
totalValueLockedUSD
totalValueLockedToken1
totalValueLockedToken0
token0 { decimals }
token1 { decimals }
}
close
feeGrowthGlobal0X128
feeGrowthGlobal1X128
}
}
''')
out = None
while fromdate < tilldate:
params = {
"fromdate": fromdate,
"tilldate": tilldate,
}
tilldate -= 1000 * 3600
response = client.execute(query, variable_values=params)
dpd = pd.json_normalize(response['poolHourDatas'])
dpd = dpd.astype(float).astype({"periodStartUnix": int})
if out is None:
out = dpd
else:
out = pd.concat([dpd, out], ignore_index=True)
return out