mirror of
https://git.wownero.com/lza_menace/totrader.git
synced 2024-08-15 00:33:13 +00:00
update dashboard, add order buying/selling, argparse, helper functions
This commit is contained in:
parent
bc56861ca1
commit
8b82906ef7
4 changed files with 1936 additions and 513 deletions
16
db.py
16
db.py
|
@ -46,6 +46,20 @@ class Balance(Model):
|
|||
class Meta:
|
||||
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):
|
||||
# id = AutoField()
|
||||
# title = CharField()
|
||||
|
@ -61,4 +75,4 @@ class Balance(Model):
|
|||
# class Meta:
|
||||
# database = db
|
||||
|
||||
db.create_tables([Ticker, Balance])
|
||||
db.create_tables([Ticker, Balance, Order])
|
||||
|
|
|
@ -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
1837
grafana/trading.json
Normal file
File diff suppressed because it is too large
Load diff
90
trade.py
90
trade.py
|
@ -1,16 +1,21 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
from argparse import ArgumentParser
|
||||
from os import getenv
|
||||
from dotenv import load_dotenv
|
||||
from requests import get as requests_get
|
||||
from requests import post as requests_post
|
||||
from requests.auth import HTTPBasicAuth
|
||||
from decimal import Decimal
|
||||
from random import uniform
|
||||
from pprint import pprint
|
||||
from time import sleep
|
||||
from db import Ticker, Balance
|
||||
from db import Ticker, Balance, Order
|
||||
|
||||
|
||||
|
||||
satoshi = .00000001
|
||||
|
||||
class TradeOgre(object):
|
||||
def __init__(self):
|
||||
load_dotenv('.env')
|
||||
|
@ -34,26 +39,38 @@ class TradeOgre(object):
|
|||
|
||||
def get_balance(self, currency):
|
||||
route = '/account/balance'
|
||||
return self.req(route, 'post', {'currency': currency})
|
||||
data = {'currency': currency}
|
||||
return self.req(route, 'post', data)
|
||||
|
||||
def get_balances(self):
|
||||
route = '/account/balances'
|
||||
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
|
||||
to = TradeOgre()
|
||||
base = 'BTC'
|
||||
currency = 'WOW'
|
||||
trade_pair = f'{base}-{currency}'
|
||||
|
||||
# ticker market data
|
||||
# get market data
|
||||
tp_res = to.get_trade_pair(trade_pair)
|
||||
print(tp_res)
|
||||
spreat_btc = Decimal(tp_res['ask']) - Decimal(tp_res['bid'])
|
||||
spread_sats = float(spreat_btc / Decimal(.00000001))
|
||||
spread_perc = (spreat_btc / Decimal(tp_res['ask'])) * 100
|
||||
|
||||
# store market data in db
|
||||
t = Ticker(
|
||||
trade_pair=trade_pair,
|
||||
initial_price=tp_res['initialprice'],
|
||||
|
@ -69,6 +86,7 @@ def run():
|
|||
)
|
||||
t.save()
|
||||
|
||||
# get balances and store in db
|
||||
for c in base, currency:
|
||||
gb_res = to.get_balance(c)
|
||||
print(gb_res)
|
||||
|
@ -79,8 +97,68 @@ def run():
|
|||
)
|
||||
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__':
|
||||
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:
|
||||
run()
|
||||
sleep(30)
|
||||
get_metrics()
|
||||
sleep(60)
|
||||
|
|
Loading…
Reference in a new issue