coinadvice v1
This commit is contained in:
@@ -3,6 +3,7 @@ import discord
|
|||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
from urllib import request
|
from urllib import request
|
||||||
import json, requests
|
import json, requests
|
||||||
|
import time
|
||||||
|
|
||||||
class Cryptocoin(object):
|
class Cryptocoin(object):
|
||||||
"""Voor al uw crypto currency advies."""
|
"""Voor al uw crypto currency advies."""
|
||||||
@@ -12,6 +13,23 @@ class Cryptocoin(object):
|
|||||||
self.voice_states = {}
|
self.voice_states = {}
|
||||||
def __check(self, ctx): #Todo: Is dit het geld-verdienen kanaal?
|
def __check(self, ctx): #Todo: Is dit het geld-verdienen kanaal?
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
#borrowed from: http://jmduke.com/posts/basic-linear-regressions-in-python/
|
||||||
|
def basic_linear_regression(self, x, y):
|
||||||
|
# Basic computations to save a little time.
|
||||||
|
length = len(x)
|
||||||
|
sum_x = sum(x)
|
||||||
|
sum_y = sum(y)
|
||||||
|
|
||||||
|
# Sx^2, and Sxy respectively.
|
||||||
|
sum_x_squared = sum(map(lambda a: a * a, x))
|
||||||
|
sum_of_products = sum([x[i] * y[i] for i in range(length)])
|
||||||
|
|
||||||
|
# Magic formulae!
|
||||||
|
a = (sum_of_products - (sum_x * sum_y) / length) / (sum_x_squared - ((sum_x ** 2) / length))
|
||||||
|
b = (sum_y - a * sum_x) / length
|
||||||
|
return a, b
|
||||||
|
|
||||||
def getCoinPrice(self, coinId, currencyId="USD", time="now"):
|
def getCoinPrice(self, coinId, currencyId="USD", time="now"):
|
||||||
url = "https://min-api.cryptocompare.com/data/pricehistorical?tsyms=" + currencyId + "&fsym=" + coinId
|
url = "https://min-api.cryptocompare.com/data/pricehistorical?tsyms=" + currencyId + "&fsym=" + coinId
|
||||||
@@ -27,6 +45,39 @@ class Cryptocoin(object):
|
|||||||
except:
|
except:
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
|
def analyseCoin(self, coinId):
|
||||||
|
N_DATAPOINTS = 12
|
||||||
|
TIME_BETWEEN_DATAPOINTS = 86400 * 7 #one week
|
||||||
|
|
||||||
|
history = []
|
||||||
|
for j in range(0, N_DATAPOINTS):
|
||||||
|
history.append(self.getCoinPrice(coinId, "USD", int(time.time()) - (N_DATAPOINTS-j)*TIME_BETWEEN_DATAPOINTS))
|
||||||
|
|
||||||
|
#print(history)
|
||||||
|
|
||||||
|
growFactorLongTerm, dummy = self.basic_linear_regression(range(0, N_DATAPOINTS), history)
|
||||||
|
growFactorShortTerm, dummy = self.basic_linear_regression(range(0, 3),
|
||||||
|
[ history[N_DATAPOINTS-3], history[N_DATAPOINTS-2], history[N_DATAPOINTS-1] ])
|
||||||
|
|
||||||
|
#print("long: ", growFactorLongTerm)
|
||||||
|
#print("short: ", growFactorShortTerm)
|
||||||
|
|
||||||
|
#print(growFactor)
|
||||||
|
|
||||||
|
if (history[N_DATAPOINTS-1] != 0):
|
||||||
|
growPercentageLongTerm = growFactorLongTerm / history[N_DATAPOINTS-1]
|
||||||
|
growPercentageShortTerm = growFactorShortTerm / history[N_DATAPOINTS-1]
|
||||||
|
|
||||||
|
growPercentage = growPercentageLongTerm*0.3 + growPercentageShortTerm*0.7 #weighted average
|
||||||
|
return growPercentage, history
|
||||||
|
|
||||||
|
#TODO:
|
||||||
|
# - iets met stabiliteit?
|
||||||
|
# - https://en.wikipedia.org/wiki/Head_and_shoulders_(chart_pattern)
|
||||||
|
# - neural networks???
|
||||||
|
|
||||||
|
#user functions below
|
||||||
|
|
||||||
@commands.command(pass_context=True)
|
@commands.command(pass_context=True)
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
def coinprice(self, ctx, coinId: str, currencyId: str="USD"):
|
def coinprice(self, ctx, coinId: str, currencyId: str="USD"):
|
||||||
@@ -38,6 +89,9 @@ class Cryptocoin(object):
|
|||||||
"""
|
"""
|
||||||
allowedCurrencies = ["USD", "EUR", "JPY", "GBP", "CNY", "CAD", "BTC"]
|
allowedCurrencies = ["USD", "EUR", "JPY", "GBP", "CNY", "CAD", "BTC"]
|
||||||
|
|
||||||
|
coinId = coinId.upper()
|
||||||
|
currencyId = currencyId.upper()
|
||||||
|
|
||||||
if (currencyId not in allowedCurrencies):
|
if (currencyId not in allowedCurrencies):
|
||||||
yield from ctx.channel.send("Valuta " + currencyId + " ken ik niet. :disappointed: ")
|
yield from ctx.channel.send("Valuta " + currencyId + " ken ik niet. :disappointed: ")
|
||||||
return
|
return
|
||||||
@@ -50,5 +104,34 @@ class Cryptocoin(object):
|
|||||||
|
|
||||||
yield from ctx.channel.send(coinId + " is nu " + str(price) + " " + currencyId + " waard.")
|
yield from ctx.channel.send(coinId + " is nu " + str(price) + " " + currencyId + " waard.")
|
||||||
|
|
||||||
|
@commands.command(pass_context=True)
|
||||||
|
@asyncio.coroutine
|
||||||
|
def coinadvice(self, ctx, coinId: str=""):
|
||||||
|
"""Voor al uw adviezen in monopolygeld
|
||||||
|
"""
|
||||||
|
|
||||||
|
if(coinId == ""):
|
||||||
|
return #TODO
|
||||||
|
|
||||||
|
coinId = coinId.upper()
|
||||||
|
|
||||||
|
growPercentage, dummy = self.analyseCoin(coinId)
|
||||||
|
|
||||||
|
if (growPercentage < -0.1):
|
||||||
|
yield from ctx.channel.send("Sell! Sell! Sell! " + coinId + " gaat erg slecht.")
|
||||||
|
elif (growPercentage < -0.03):
|
||||||
|
yield from ctx.channel.send("Als je " + coinId + " hebt, verkopen die handel.")
|
||||||
|
elif (growPercentage < 0):
|
||||||
|
yield from ctx.channel.send("Het gaat niet zo goed met " + coinId + ".")
|
||||||
|
elif (growPercentage < 0.015):
|
||||||
|
yield from ctx.channel.send(coinId + " lijkt redelijk stabiel.")
|
||||||
|
elif (growPercentage < 0.035):
|
||||||
|
yield from ctx.channel.send("Tijd om " + coinId + " te kopen.")
|
||||||
|
elif (growPercentage < 0.06):
|
||||||
|
yield from ctx.channel.send(coinId + " groeit snel")
|
||||||
|
elif (growPercentage < 0.1):
|
||||||
|
yield from ctx.channel.send("Het gaat heel goed met " + coinId + "!")
|
||||||
|
else:
|
||||||
|
yield from ctx.channel.send("To the moon! " + coinId + " is niet meer te stoppen!")
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user