unwindnl/galacticbot

Trade Bot Library for the Stellar platform.

This package's canonical repository appears to be gone and the package has been frozen as a result.

dev-master 2019-07-10 09:21 UTC

This package is auto-updated.

Last update: 2019-12-10 10:30:51 UTC


README

GalacticBot is a PHP 7.x library for creating trade bots on the Stellar platform.

With GalacticBot you can run bot(s) with our default trading algorithm or create and test your own custom trading algorithm(s).

Bots can be run locally on your machine, on a server or you could let us run it for you on https://www.galacticbot.com/ for a small fixed monhtly fee (service will be available Q2 2019) (Of course payable in XLM).

Features

  • An abstract bot class which you can extend to do implement your own trading logic
  • Bots can be run both the Stellar public net as well as on the Stellar testnet for testing
  • Bots can be run in real time or as an simulation to test out bots and settings
  • Exponential Moving Average (EMA) bot implemention which is currently being live tested (see below for links)
  • Demo project to get a bot up and running in minutes
  • Demo project also includes a script to manage bot processes

Requirements

  • PHP version 7.1
  • No extra PHP modules are required
  • MySQL is needed for running the demo EMA bot, but you could create an implementation for any other type of database

Warning

Please note that this library is still under development. It is not advisable to trade with large amounts at this stage.

Installation

This package is available on Composer.

Use composer require unwindnl/galacticbot to add this library to your PHP project.

Demo

This project contains a demo project of how to setup and run a bot with a minimal web interface to interact with the bot. Please see the demo/README.md demo/README.md folder for more information.

A live demo is available on: https://www.galacticbot.com/libdemo/.

We also created an example of a custom (graphical) view for the live bot on: https://www.galacticbot.com/demo/.

Data(base) abstraction

The bot does not interact with a database directly but uses the DataInterface interface for describing how an implemention should look like.

Please see the example MysqlDataInterface implementation of how to implement your own if you would want to interface with another database. This example implementation is not optimized and could slow down with more data in the database. So its best to clear our older data or optimize/create your own implementation.

Implementing your own trading algorithm

Create a class that extends the GalacticBot\Bot class.

Add a list of custom trading states your bot can have, for example:

const TRADE_STATE_BUY_WAIT = "BUY_WAIT";
const TRADE_STATE_SELL_WAIT = "SELL_WAIT";

Implement the following abstract methods:

initialize()

Here you could load for example data from a database you going to need for your algorithm. This is only called once.

getTradeStateLabel($forState)

This is were you return a more descriptive text for each of your custom states you defined earlier.

process(\GalacticBot\Time $time, $sample)

A very minimal example:

protected function process(\GalacticBot\Time $time, $sample)
{
	// Get current trade state
	$tradeState = $this->data->get("tradeState");

	// Get the last added trade
	$lastTrade = $this->data->getLastTrade();

	// If we have a trade and it isn't completed yet, then update it to get the latest state
	if ($lastTrade && !$lastTrade->getIsFilledCompletely())
	{
		// Get the latest state from the Stellar network
		$lastTrade->updateFromAPIForBot($this->settings->getAPI(), $this);
		
		// If it isn't done, we'll have to return and wait for it to complete
		// You could also cancel it or change it if you want
		if (!$lastTrade->getIsFilledCompletely())
			return;
	}	
	
	if ($tradeState == self::TRADE_STATE_NONE || $tradeState == self::TRADE_STATE_BUY_WAIT)
		if (time to buy / do something with $sample)
		{
			$this->buy();
			$tradeState = self::TRADE_STATE_SELL_WAIT;
		}
	}
	else if ($tradeState == self::TRADE_STATE_SELL_WAIT)
	{
		if (time to sell / do something with $sample)
		{
			$this->sell();
			$tradeState = self::TRADE_STATE_BUY_WAIT;
		}
	}
}

Open issues

  • You need to setup a trustline for the assets you want to trade with your Stellar account. The library will do this for you in the future but for now you will have to do this yourself (with for example StellarTerm).