advanced crypto advice
This commit is contained in:
+99
-15
@@ -4,6 +4,7 @@ from discord.ext import commands
|
||||
from urllib import request
|
||||
import json, requests
|
||||
import time
|
||||
import random
|
||||
|
||||
class Cryptocoin(object):
|
||||
"""Voor al uw crypto currency advies."""
|
||||
@@ -44,37 +45,113 @@ class Cryptocoin(object):
|
||||
return priceData[coinId][currencyId]
|
||||
except:
|
||||
return -1
|
||||
|
||||
|
||||
#dermines the expected growth of coin
|
||||
def analyseCoin(self, coinId):
|
||||
N_DATAPOINTS = 12
|
||||
TIME_BETWEEN_DATAPOINTS = 86400 * 7 #one week
|
||||
|
||||
#Get the price history:
|
||||
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)
|
||||
|
||||
#Check the growth. Do some linear regression
|
||||
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):
|
||||
if (history[N_DATAPOINTS-1] == 0):
|
||||
growPercentageLongTerm = 0
|
||||
growPercentageShortTerm = 0
|
||||
else:
|
||||
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???
|
||||
|
||||
#TODO:
|
||||
# - iets met stabiliteit?
|
||||
# - https://en.wikipedia.org/wiki/Head_and_shoulders_(chart_pattern)
|
||||
# - neural networks???
|
||||
|
||||
|
||||
#will return some random advice about a semi-random crypto coin
|
||||
def getRandomCoinAdvice(self):
|
||||
#get all the coins!
|
||||
coinlistUrl = "https://min-api.cryptocompare.com/data/all/coinlist"
|
||||
coinlistResponse = requests.get(coinlistUrl)
|
||||
|
||||
popularCoins = [
|
||||
{"Symbol" : "BTC", "Name" : "BitCoin"},
|
||||
{"Symbol" : "ETH", "Name" : "Ethereum"},
|
||||
{"Symbol" : "ETC", "Name" : "Ethereum Classic"},
|
||||
{"Symbol" : "LTC", "Name" : "LiteCoin"},
|
||||
{"Symbol" : "XMR", "Name" : "Monero"},
|
||||
{"Symbol" : "XRP", "Name" : "Ripple"},
|
||||
{"Symbol" : "DOGE", "Name" : "Dogecoin"},
|
||||
{"Symbol" : "NLG", "Name" : "Gulden"}
|
||||
]
|
||||
|
||||
if (coinlistResponse.ok):
|
||||
coinlistData = json.loads(coinlistResponse.content.decode('utf-8'))
|
||||
coinlist = []
|
||||
|
||||
for coin in coinlistData["Data"]:
|
||||
coinlist.append({
|
||||
"Symbol" : coinlistData["Data"][coin]["Symbol"] ,
|
||||
"Name" : coinlistData["Data"][coin]["CoinName"]
|
||||
})
|
||||
|
||||
#Analyse until you've found something interesting
|
||||
for i in range(0, 99):
|
||||
|
||||
#pick a random coin
|
||||
if (random.randint(0, 4) == 4):
|
||||
#kans van 1 op 5 dat we naar een populaire coin kijken
|
||||
randIndex = random.randint(0, len(popularCoins)-1)
|
||||
tempId = popularCoins[randIndex]["Symbol"]
|
||||
tempName = popularCoins[randIndex]["Name"]
|
||||
else:
|
||||
randIndex = random.randint(0, len(coinlist)-1)
|
||||
tempId = coinlist[randIndex]["Symbol"]
|
||||
tempName = coinlist[randIndex]["Name"]
|
||||
|
||||
#analyse:
|
||||
growPercentage, tempHistory = self.analyseCoin(tempId)
|
||||
|
||||
|
||||
#For the first few iterations we're picky
|
||||
if (growPercentage > 0.1):
|
||||
return (tempName + " (" + tempId + ") gaat to the moon!")
|
||||
if (growPercentage > 0.06):
|
||||
return ("Ik zou zeker een paar " + tempName + " (" + tempId + ") kopen.")
|
||||
|
||||
if (i > 2):
|
||||
#Later, negative advices are also acceptable...
|
||||
if (growPercentage < -0.2):
|
||||
return ("Ik zou zeker " + tempName + " (" + tempId + ") afraden!")
|
||||
if (growPercentage > 0.015):
|
||||
return ("Ken je " + tempName + " (" + tempId + ") al? Best leuk")
|
||||
if(i > 4):
|
||||
#After a while, we're happy to give less useful advice
|
||||
if (growPercentage > 0.008):
|
||||
return (tempName + " (" + tempId + ") kan interessant worden...")
|
||||
if (growPercentage < -0.06):
|
||||
return ("Als je toevallig " + tempName + " (" + tempId + ") hebt: verkopen.")
|
||||
if(i > 5):
|
||||
#Anything goes. We're desperate.
|
||||
if (tempHistory[ len(tempHistory)-1 ] == 0):
|
||||
return (tempId + " is echt niks waard...")
|
||||
if (growPercentage > 0.005):
|
||||
return (tempName + " (" + tempId + ") is een crypto currency. Wist je dat?")
|
||||
|
||||
time.sleep(0.1) #don't overload the API
|
||||
|
||||
return "Sorry. De crypto adviezen zijn uitverkocht vandaag."
|
||||
else:
|
||||
raise Exception("API error")
|
||||
|
||||
#user functions below
|
||||
|
||||
@@ -108,10 +185,17 @@ class Cryptocoin(object):
|
||||
@asyncio.coroutine
|
||||
def coinadvice(self, ctx, coinId: str=""):
|
||||
"""Voor al uw adviezen in monopolygeld
|
||||
Vraag Stroop's mening over een specifieke coin:
|
||||
!coinadvice NLG
|
||||
Of vraag gewoon advies in het algemeen:
|
||||
!coinadvice
|
||||
(Over deze laatste optie moet soms even nagedacht worden)
|
||||
"""
|
||||
|
||||
#Geen specieke coin? Doe random.
|
||||
if(coinId == ""):
|
||||
return #TODO
|
||||
yield from ctx.channel.send( self.getRandomCoinAdvice() )
|
||||
return
|
||||
|
||||
coinId = coinId.upper()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user