Source code for cointrader.strategy

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import datetime
import click
import logging
from .helpers import render_bot_statistic, render_bot_tradelog, render_bot_title

log = logging.getLogger(__name__)

BUY = 1
SELL = -1
WAIT = 0
QUIT = -99
signal_map = {
    BUY: "BUY",
    WAIT: "WAIT",
    SELL: "SELL",
    QUIT: "QUIT"
}
# Signals for strategies.


[docs]class Signal(object): def __init__(self, signal, date): self.value = signal self.date = date
[docs]class Strategy(object): """Docstring for Strategy. """ def __str__(self): return "{}".format(self.__class__) def __init__(self): self._signal_history = [] """Store last emitted signals""" self._bot = None
[docs] def set_bot(self, bot): self._bot = bot
[docs] def details(self, market, resolution): """Will return details on the reasong why the signal was emited.""" raise NotImplementedError
[docs] def signal(self, market, resolution, start, end): """Will return either a BUY, SELL or WAIT signal for the given market""" raise NotImplementedError
[docs]class NullStrategy(Strategy):
[docs] def details(self, market, resolution): """Will return details on the reasong why the signal was emited.""" return "I am doing nothing but waiting..."
[docs] def signal(self, market, resolution, start, end): """Will return either a BUY, SELL or WAIT signal for the given market""" return Signal(WAIT, datetime.datetime.utcnow())
[docs]class InteractivStrategyWrapper(object): def __init__(self, strategie): self._strategie = strategie self._bot = None
[docs] def set_bot(self, bot): self._bot = bot
def __str__(self): return "Interavtiv: {}".format(self._strategie)
[docs] def signal(self, market, resolution, start, end): """Will return either a BUY, SELL or WAIT signal for the given market""" # Get current chart click.echo(render_bot_title(self._bot, market, resolution)) signal = self._strategie.signal(market, resolution, start, end) click.echo('Signal: {} {}'.format(signal.date, signal_map[signal.value])) click.echo('') options = [] if self._bot.btc: options.append("b) Buy") if self._bot.amount: options.append("s) Sell") options.append("l) Tradelog") options.append("p) Performance of bot") options.append("d) Show details on signal") options.append("q) Quit") options.append("") options.append("Press any key to continue") click.echo(u'\n'.join(options)) c = click.getchar() if c == 'b' and self._bot.btc: # btc = click.prompt('BTC', default=self._bot.btc) if click.confirm('Buy for {} btc?'.format(self._bot.btc)): return Signal(BUY, datetime.datetime.utcnow()) if c == 's' and self._bot.amount: # amount = click.prompt('Amount', default=self._bot.amount) if click.confirm('Sell {}?'.format(self._bot.amount)): return Signal(SELL, datetime.datetime.utcnow()) if c == 'l': click.echo(render_bot_tradelog(self._bot.trades)) if c == 'p': click.echo(render_bot_statistic(self._bot.stat())) if c == 'd': click.echo(self._strategie.details(market, resolution)) if c == 'q': return Signal(QUIT, datetime.datetime.utcnow()) else: return Signal(WAIT, datetime.datetime.utcnow())