update dashboard, add order buying/selling, argparse, helper functions

This commit is contained in:
lza_menace 2020-09-07 00:43:05 -07:00
parent bc56861ca1
commit 8b82906ef7
4 changed files with 1936 additions and 513 deletions

16
db.py
View file

@ -46,6 +46,20 @@ class Balance(Model):
class Meta: class Meta:
database = db database = db
class Order(Model):
trade_pair = CharField()
trade_type = CharField()
buy = BooleanField()
quantity = DoubleField()
price = DoubleField()
uuid = CharField()
active = BooleanField(default=True)
cancelled = BooleanField(default=False)
date = DateTimeField(default=get_time)
class Meta:
database = db
# class Trade(Model): # class Trade(Model):
# id = AutoField() # id = AutoField()
# title = CharField() # title = CharField()
@ -61,4 +75,4 @@ class Balance(Model):
# class Meta: # class Meta:
# database = db # database = db
db.create_tables([Ticker, Balance]) db.create_tables([Ticker, Balance, Order])

View file

@ -1,506 +0,0 @@
{
"annotations": {
"list": [
{
"builtIn": 1,
"datasource": "-- Grafana --",
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations & Alerts",
"type": "dashboard"
}
]
},
"editable": true,
"gnetId": null,
"graphTooltip": 0,
"id": 1,
"links": [],
"panels": [
{
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"datasource": null,
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 9,
"w": 12,
"x": 0,
"y": 0
},
"hiddenSeries": false,
"id": 4,
"legend": {
"avg": false,
"current": false,
"max": false,
"min": false,
"show": true,
"total": false,
"values": false
},
"lines": true,
"linewidth": 1,
"nullPointMode": "connected",
"options": {
"dataLinks": []
},
"percentage": false,
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"expr": "avg(monerod_connections_incoming)",
"legendFormat": "Incoming",
"refId": "A"
},
{
"expr": "avg(monerod_connections_outgoing)",
"legendFormat": "Outgoing",
"refId": "B"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "Connections",
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"decimals": null,
"format": "none",
"label": null,
"logBase": 1,
"max": null,
"min": "0",
"show": true
},
{
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": true
}
],
"yaxis": {
"align": false,
"alignLevel": null
}
},
{
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"datasource": null,
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 9,
"w": 12,
"x": 12,
"y": 0
},
"hiddenSeries": false,
"id": 2,
"legend": {
"avg": false,
"current": false,
"max": false,
"min": false,
"show": false,
"total": false,
"values": false
},
"lines": true,
"linewidth": 1,
"nullPointMode": "connected",
"options": {
"dataLinks": []
},
"percentage": false,
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [
{
"alias": "/.*/",
"color": "#C4162A"
}
],
"spaceLength": 10,
"stack": false,
"steppedLine": true,
"targets": [
{
"expr": "avg(monerod_block_difficulty)",
"refId": "A"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "Difficulty",
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"format": "none",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": true
},
{
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": true
}
],
"yaxis": {
"align": false,
"alignLevel": null
}
},
{
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"datasource": null,
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 9
},
"hiddenSeries": false,
"id": 8,
"legend": {
"avg": false,
"current": false,
"max": false,
"min": false,
"show": false,
"total": false,
"values": false
},
"lines": true,
"linewidth": 1,
"nullPointMode": "connected",
"options": {
"dataLinks": []
},
"percentage": false,
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [
{
"alias": "/.*/",
"color": "#FA6400"
}
],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"expr": "avg(monerod_block_reward)",
"legendFormat": "Block Reward (WOW)",
"refId": "A"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "Block Reward (WOW)",
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"decimals": null,
"format": "none",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": true
},
{
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": false
}
],
"yaxis": {
"align": false,
"alignLevel": null
}
},
{
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"datasource": null,
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 9
},
"hiddenSeries": false,
"id": 6,
"legend": {
"avg": false,
"current": false,
"max": false,
"min": false,
"show": false,
"total": false,
"values": false
},
"lines": true,
"linewidth": 1,
"nullPointMode": "connected",
"options": {
"dataLinks": []
},
"percentage": false,
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [
{
"alias": "/.*/",
"color": "#8F3BB8"
}
],
"spaceLength": 10,
"stack": false,
"steppedLine": true,
"targets": [
{
"expr": "avg(monerod_tx_mempool)",
"legendFormat": "Pool Transactions",
"refId": "A"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "Mempool Transactions",
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": true
},
{
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": true
}
],
"yaxis": {
"align": false,
"alignLevel": null
}
},
{
"cacheTimeout": null,
"colorBackground": false,
"colorPostfix": false,
"colorPrefix": false,
"colorValue": false,
"colors": [
"#299c46",
"rgba(237, 129, 40, 0.89)",
"#d44a3a"
],
"datasource": null,
"format": "none",
"gauge": {
"maxValue": 100,
"minValue": 0,
"show": false,
"thresholdLabels": false,
"thresholdMarkers": true
},
"gridPos": {
"h": 5,
"w": 8,
"x": 8,
"y": 17
},
"id": 10,
"interval": null,
"links": [],
"mappingType": 1,
"mappingTypes": [
{
"name": "value to text",
"value": 1
},
{
"name": "range to text",
"value": 2
}
],
"maxDataPoints": 100,
"nullPointMode": "connected",
"nullText": null,
"options": {},
"postfix": "",
"postfixFontSize": "50%",
"prefix": "",
"prefixFontSize": "50%",
"rangeMaps": [
{
"from": "null",
"text": "N/A",
"to": "null"
}
],
"sparkline": {
"fillColor": "rgba(31, 118, 189, 0.18)",
"full": false,
"lineColor": "rgb(31, 120, 193)",
"show": false,
"ymax": null,
"ymin": null
},
"tableColumn": "",
"targets": [
{
"expr": "avg(monerod_tx_chain)",
"instant": true,
"refId": "A"
}
],
"thresholds": "",
"timeFrom": null,
"timeShift": null,
"title": "Total Transactions",
"type": "singlestat",
"valueFontSize": "100%",
"valueMaps": [
{
"op": "=",
"text": "N/A",
"value": "null"
}
],
"valueName": "current"
}
],
"refresh": "30s",
"schemaVersion": 21,
"style": "dark",
"tags": [],
"templating": {
"list": []
},
"time": {
"from": "now-6h",
"to": "now"
},
"timepicker": {
"refresh_intervals": [
"5s",
"10s",
"30s",
"1m",
"5m",
"15m",
"30m",
"1h",
"2h",
"1d"
]
},
"timezone": "",
"title": "Daemon Stats",
"uid": "0ktA4KDGk",
"version": 2
}

1837
grafana/trading.json Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,16 +1,21 @@
#!/usr/bin/env python #!/usr/bin/env python
from argparse import ArgumentParser
from os import getenv from os import getenv
from dotenv import load_dotenv from dotenv import load_dotenv
from requests import get as requests_get from requests import get as requests_get
from requests import post as requests_post from requests import post as requests_post
from requests.auth import HTTPBasicAuth from requests.auth import HTTPBasicAuth
from decimal import Decimal from decimal import Decimal
from random import uniform
from pprint import pprint from pprint import pprint
from time import sleep from time import sleep
from db import Ticker, Balance from db import Ticker, Balance, Order
satoshi = .00000001
class TradeOgre(object): class TradeOgre(object):
def __init__(self): def __init__(self):
load_dotenv('.env') load_dotenv('.env')
@ -34,26 +39,38 @@ class TradeOgre(object):
def get_balance(self, currency): def get_balance(self, currency):
route = '/account/balance' route = '/account/balance'
return self.req(route, 'post', {'currency': currency}) data = {'currency': currency}
return self.req(route, 'post', data)
def get_balances(self): def get_balances(self):
route = '/account/balances' route = '/account/balances'
return self.req(route) return self.req(route)
def submit_order(self, type, pair, quantity, price):
route = f'/order/{type}'
data = {'market': pair, 'quantity': quantity, 'price': price}
return self.req(route, 'post', data)
def run(): def get_order(self, uuid):
route = f'/account/order/{uuid}'
return self.req(route)
def get_metrics():
# define vars # define vars
to = TradeOgre() to = TradeOgre()
base = 'BTC' base = 'BTC'
currency = 'WOW' currency = 'WOW'
trade_pair = f'{base}-{currency}' trade_pair = f'{base}-{currency}'
# ticker market data # get market data
tp_res = to.get_trade_pair(trade_pair) tp_res = to.get_trade_pair(trade_pair)
print(tp_res) print(tp_res)
spreat_btc = Decimal(tp_res['ask']) - Decimal(tp_res['bid']) spreat_btc = Decimal(tp_res['ask']) - Decimal(tp_res['bid'])
spread_sats = float(spreat_btc / Decimal(.00000001)) spread_sats = float(spreat_btc / Decimal(.00000001))
spread_perc = (spreat_btc / Decimal(tp_res['ask'])) * 100 spread_perc = (spreat_btc / Decimal(tp_res['ask'])) * 100
# store market data in db
t = Ticker( t = Ticker(
trade_pair=trade_pair, trade_pair=trade_pair,
initial_price=tp_res['initialprice'], initial_price=tp_res['initialprice'],
@ -69,6 +86,7 @@ def run():
) )
t.save() t.save()
# get balances and store in db
for c in base, currency: for c in base, currency:
gb_res = to.get_balance(c) gb_res = to.get_balance(c)
print(gb_res) print(gb_res)
@ -79,8 +97,68 @@ def run():
) )
b.save() b.save()
def put_market_maker():
to = TradeOgre()
latest_ticker = Ticker.select().order_by(Ticker.date.desc()).get()
if latest_ticker.spread_sats > 4:
bid_amount = uniform(80, 90)
ask_amount = uniform(80, 90)
to_bid = latest_ticker.bid + satoshi
to_ask = latest_ticker.ask - satoshi
buy = to.submit_order('buy', 'BTC-WOW', bid_amount, '{:.8f}'.format(to_bid))
print(buy)
if buy['success']:
o = Order(
trade_pair='BTC-WOW',
trade_type='market_maker',
buy=True,
quantity=bid_amount,
price=to_bid,
uuid=buy['uuid']
)
o.save()
sleep(3)
sell = to.submit_order('sell', 'BTC-WOW', ask_amount, '{:.8f}'.format(to_ask))
print(sell)
if sell['success']:
o = Order(
trade_pair='BTC-WOW',
trade_type='market_maker',
buy=False,
quantity=ask_amount,
price=to_ask,
uuid=sell['uuid']
)
o.save()
def check_orders():
to = TradeOgre()
orders = Order.select().where(Order.active==True)
for order in orders:
print(order.uuid)
o = to.get_order(order.uuid)
print(o)
if o['success'] is False:
order.active = False
order.save()
sleep(5)
if __name__ == '__main__': if __name__ == '__main__':
parser = ArgumentParser(description='Helpful TradeOgre trading script')
parser.add_argument('-t', '--trade', action='store_true', help='Put in buy/sell orders')
parser.add_argument('-u', '--update-orders', action='store_true', help='Update status of orders')
args = parser.parse_args()
if args.trade:
put_market_maker()
exit()
if args.update_orders:
check_orders()
exit()
while True: while True:
run() get_metrics()
sleep(30) sleep(60)