Metadata-Version: 2.1
Name: aats
Version: 0.1.2
Summary: Apifiny Algo Trading System
Project-URL: Homepage, https://github.com/pypa/sampleproject
Project-URL: Bug Tracker, https://github.com/pypa/sampleproject/issues
Author-email: Example Author <author@example.com>
License: Copyright (c) 2018 The Python Packaging Authority
        
        Permission is hereby granted, free of charge, to any person obtaining a copy
        of this software and associated documentation files (the "Software"), to deal
        in the Software without restriction, including without limitation the rights
        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
        copies of the Software, and to permit persons to whom the Software is
        furnished to do so, subject to the following conditions:
        
        The above copyright notice and this permission notice shall be included in all
        copies or substantial portions of the Software.
        
        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        SOFTWARE.
License-File: LICENSE
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Requires-Python: >=3.7
Description-Content-Type: text/markdown

# Apifiny Algo Trading System

AATS is a light weight trading system with low-latency and high-scalability for Live trading on multi-crypto exchanges. 

## Key Features
* Light weight: you only need to take care of your strategy component and you can trade alive!
* Low latency: the low-level system is optimizied by C++, such as exchange connectivity, order book management and order placement
* High flexibility: with raw tick data and quote data, you can freely build samplers, pricing models, variables and signals on your own into your strategy
* Distributed broadcast: You can only start one market instance and connect to multiple trading instances

## Quick Start
This quick start gives you all the steps that you need to do before start trading.

#### Install docker
Please download and install Docker CE or Docker Desktop for your computer/server if it isn't installed:

- [Mac](https://docs.docker.com/docker-for-mac/install/)
- [Windows](https://docs.docker.com/docker-for-windows/install/)
- [Linux](https://docs.docker.com/install/)

Get and run the Algo SDK docker image using the following command:
```
docker run -it apifinyalgo/algo-sdk:1.1.0
```
his step will automatically run control server which will be used to start market/trading instance later. Depending on system, you may need to run this with sudo.

TBA: how to check if it is running, i.e. ps command
#### Install aats package
```
# install stable version from pip (support python version >=3.7)
pip install aats (TBA: currently pip install -i https://test.pypi.org/simple/ aats)

# clone the repository with latest version
git clone http://git.ddesk.io/exone-plus/algo-client-api.git (TBA: replace with public repo link)
```

#### Maintain your unique cid symbol mapping table 
It requires to be consistent in both market engine and trade engine
```
sym_cid_map = {
    1001: "BTCUSDT.BINANCE",
    1002: "ETHUSDT.BINANCE",
    1003: "DOGEUSDT.BINANCE",
    1004: "BTCUSDTSWAP.BINANCE_SWAP"
    }
```

#### Start market instance to listen subscribed symbols and exchanges
TBA: change the below to one command line to start market instance
```
from aats.market_engine import MarketEngine

# start market engine
mkt_engine = MarketEngine(sym_cid_map)
mkt_engine.set_control_server(6000)  # default control server port
mkt_engine.set_multicast_cfg('239.0.0.4', 4141)
# mkt_engine.add_listen_symbol('BTCUSDT', 'BINANCE', 5)
# mkt_engine.add_listen_symbol('ETHUSDT', 'BINANCE', 5)
mkt_engine.add_listen_symbol('DOGEUSDT', 'BINANCE', 5)
mkt_engine.add_listen_symbol('BTCUSDTSWAP', 'BINANCE_SWAP', 5)
mkt_engine.run()

```
Once console returns the following message, it means market instance is running successfully
```
{'result': 'ok', 'type': 'market_instance'}
```

#### Write your strategy and ready to trade
In the examples folder, we provide two sample strategies and demo_main.py script which illustrates how to setup config and run strategy

- SimpleTakerStrategy: it is a naive taker strategy, place order on a fixed time interval
- SimpleMakerStrategy: it is a bit complicated maker strategy with order management system

```
##############################################
#               Demo strategy                #
##############################################
import time
from aats.trade_engine import TradeEngine
from simple_maker_strategy import SimpleMakerStrategy
from simple_taker_strategy import SimpleTakerStrategy



sym_cid_map = {
    1001: "BTCUSDT.BINANCE",
    1002: "DOGEUSDT.BINANCE"
    }

# init trade engine
trade_engine = TradeEngine(sym_cid_map)

# setup public config
trade_engine.set_md_multicast_cfg(send_to_ip='239.0.0.3', send_to_port=4141)
trade_engine.add_md_symbol(symbol='BTCUSDT', exchange='BINANCE')
# trade_engine.add_md_symbol(symbol='DOGEUSDT', exchange='BINANCE')

# setup private config
trade_engine.set_control_server(server_port=6000)
trade_engine.config_exchange(exchange='BINANCE', trade_type='sandbox')
trade_engine.set_apikey(exchange="BINANCE", 
                        key="02SvhZEYG1p92JWdekP75XQKayqfLxmjHWNEfWU1KrCPjJ5xrLcOU1YHZ5SUBVFA", 
                        secret="iKnZvDKMGQuEINhjDX8gbIVJDLl48fV6GFLL5gcFT8Sfj9yxGrnP7uFm7AAVWeFP", 
                        password="",
                        subaccount="")
trade_engine.set_fee('BINANCE', 0.0003, 0)
trade_engine.add_trade_symbol(symbol='BTCUSDT', exchange='BINANCE')

# setup your strategy
# my_strategy = SimpleMakerStrategy()
my_strategy = SimpleTakerStrategy(msecs=10000)
trade_engine.add_strategy(my_strategy)

# start run
try:
    trade_engine.run()
except KeyboardInterrupt as err:
    # trade_engine.stop()
    print("close strategy and close open orders")
    # trade_engine.manager.stop()
    my_strategy.close()
    time.sleep(1)
    print("trade closed")    
```