Skip to main content

Automated Crypto Trader

Project description

TradeBoy

Automated crypto trader

Notes

  • Only exchange is Phemex so far
  • Only future engine works
    • exit condition not in yet

Installation

pip install tradeboy

Usage

Instantiation

  • Requires .env with API credentials
  • Engine handles placing orders
  • Strategy sends engine entry signals
    • exit signals not required if tp/sl percents provided in params
from tradeboy.engines.future import FutureEngine
from strategies.example import Strategy as ex_strat

# Rate is request rate
# Runs example strategy in strategies folder
engine = FutureEngine(Strategy=ex_strat, rate=30, verbose=True)
engine.run(trades=100)

Example Strategy

  • Requires self.params in order to inititate the trade
  • Requires entry method
    • exit only required if not using take profit or stop loss
from tradeboy.tools import Tools

class Strategy:
    def __init__(self):
        # Helper class
        self.tools = Tools(exchange='phemex', verbose=False)
        # Required params needed to initiate trade
        self.params = {
            'type': 'market',  # Or limit
            'side': None,  # long or short
            'amount': 1,  # How many contracts to trade with
            'tp_percent': None,  # Take profit percent
            'sl_percent': None,  # Stop loss percent
            'symbol': self.tools.symbol(base='BTC', quote='USD', code='future'), # Trading pair,
            'exit': False # Exit signal
        }

    def get_macd(self):
        # Get macd values
        # Use default params (12, 26, 9)
        _, _, _, _, close, _ = self.tools.ohlcv(symbol=self.params['symbol'], tf='1m')
        macd, signal, _ = self.tools.macd(close)
        # Format
        macd = list(macd)
        macd.reverse()
        signal = list(signal)
        signal.reverse()

        # Get current and previous values
        prev_macd = None
        last_macd = None
        prev_signal = None
        last_signal = None

        i = 0
        for value in macd:
            if str(value) != 'nan':
                prev_macd = macd[i + 1]
                last_macd = macd[i + 2]
                break
            i += 1

        i = 0
        for value in signal:
            if str(value) != 'nan':
                prev_signal = signal[i + 1]
                last_signal = signal[i + 2]
                break
            i += 1

        return prev_macd, last_macd, prev_signal, last_signal

    def get_ema(self):
        # Get ema value
        # Use default timeperiod = 200
        _, _, _, _, close, _ = self.tools.ohlcv(symbol=self.params['symbol'], tf='1m')
        ema = self.tools.ema(close)

        # Format
        ema = list(ema)
        ema.reverse()

        # Get current value
        curr_ema = None

        for value in ema:
            if str(value) != 'nan':
                curr_ema = value
                break

        return curr_ema

    def signal(self):
        # Get strategy params
        price = self.tools.price(symbol=self.params['symbol'])
        prev_macd, last_macd, prev_signal, last_signal = self.get_macd()
        curr_ema = self.get_ema()

        # Check for entry
        if price > curr_ema:
            # Look for long
            if last_macd < last_signal and prev_macd > prev_signal and prev_macd < 0 and prev_signal < 0:
                self.params['tp_percent'] = 0.36  # 0.36%
                self.params['sl_percent'] = 0.18  # 0.18%
                self.params['side'] = 'long'
                return True

        if price < curr_ema:
            # Look for short
            if last_macd > last_signal and prev_macd < prev_signal and prev_macd > 0 and prev_signal > 0:
                self.params['tp_percent'] = 0.36
                self.params['sl_percent'] = 0.18
                self.params['side'] = 'short'
                return True

        return False

    # Entry is required
    # Exit is not required if no tp/sl provided
    def entry(self):
        # Returns True if signal was found
        # False if signal was not found
        return self.signal()

    # Exit conditions not needed for current strategy
    def exit(self):
        pass

Tools helper class

from tradeboy.tools import Tools

# Strategy class init
def __init__(self):
    # Helper class
    self.tools = Tools(exchange='phemex', verbose=False)
    # Required params needed to initiate trade
    self.params = {
        'type': 'market',  # Or limit
        'side': None,  # long or short
        'amount': 1,  # How many contracts to trade with
        'tp_percent': None,  # Take profit percent
        'sl_percent': None,  # Stop loss percent
        'symbol': self.tools.symbol(base='BTC', quote='USD', code='future'), # Trading pair,
        'exit': False # Exit signal
    }

# Create trading symbol for params
self.tools.symbol(base='BTC', quote='USD', code='future'), # Trading pair

# Get open-high-low-close-volume data
timestamps, open, high, low, close, volume = self.tools.ohlcv(symbol=self.params['symbol'], tf='1m')

# Get macd
_, _, _, _, close, _ = self.tools.ohlcv(symbol=self.params['symbol'], tf='1m')
macd, signal, history = self.tools.macd(close)

# Get ema
_, _, _, _, close, _ = self.tools.ohlcv(symbol=self.params['symbol'], tf='1m')
ema = self.tools.ema(close)

# Get stoch
_, _, high, low, close, _ = self.tools.ohlcv(symbol=self.params['symbol'], tf='1m')
slowk, slowd = self.tools.stoch(high, low, close)

# Get price
price = self.tools.price(symbol=self.params['symbol'])

Test

  • Runs the example strategy
make test

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tradeboy-1.0.1.tar.gz (9.6 kB view details)

Uploaded Source

Built Distribution

tradeboy-1.0.1-py2.py3-none-any.whl (9.0 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file tradeboy-1.0.1.tar.gz.

File metadata

  • Download URL: tradeboy-1.0.1.tar.gz
  • Upload date:
  • Size: 9.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.31.0

File hashes

Hashes for tradeboy-1.0.1.tar.gz
Algorithm Hash digest
SHA256 a8712fb8e2350a08fd41dcebfa8cde9689ecaa704fdcb98bf100a23df94e0abe
MD5 34836698cfe89b5b3a814de04f81a258
BLAKE2b-256 0609b9369e1b117c8e619ed7c70069259caab68208e18eb146e21efe78793721

See more details on using hashes here.

File details

Details for the file tradeboy-1.0.1-py2.py3-none-any.whl.

File metadata

  • Download URL: tradeboy-1.0.1-py2.py3-none-any.whl
  • Upload date:
  • Size: 9.0 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.31.0

File hashes

Hashes for tradeboy-1.0.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 3c738ee84a4714866d5df6ab242b277c3470f0481dfdf2a414c88e436cef215a
MD5 b6327ab99698d28a38d94d49958b9441
BLAKE2b-256 e7dbda70eccc73ad7e6b1113af183159d8344d16dae9bc04c610abe578068299

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page