2024-07-17 19:51:13 +00:00
|
|
|
# WARNING
|
|
|
|
#
|
|
|
|
# THIS IS AN AUTOGENERATED FILE.
|
|
|
|
#
|
|
|
|
# MANUAL CHANGES CAN AND WILL BE OVERWRITTEN.
|
|
|
|
|
|
|
|
import re
|
|
|
|
|
|
|
|
from setuptools import setup
|
|
|
|
|
|
|
|
PACKAGE_NAME = 'crypto_seller'
|
|
|
|
|
|
|
|
PACKAGE_DESCRIPTION = """
|
|
|
|
# Automatic Crypto Seller.
|
|
|
|
|
2024-08-02 15:17:30 +00:00
|
|
|
Crypto Seller, I am going into finance, and I want only your strongest tokens.
|
2024-07-22 15:02:15 +00:00
|
|
|
|
2024-07-22 22:47:49 +00:00
|
|
|
This program is a wrapper around
|
|
|
|
[`fin_depo`](https://gitfub.space/Jmaa/fin-depo/) for automatically trading
|
|
|
|
one-way trades, by using repeated trades over a period. Can be used to slowly
|
|
|
|
enter or exit positions, for example low-volume crypto currencies, or as an
|
|
|
|
automated investment savings system.
|
2024-07-22 15:02:15 +00:00
|
|
|
|
|
|
|
Supported sites:
|
|
|
|
|
|
|
|
- [KuCoin](https://www.kucoin.com/): Online crypto-currency exchange.
|
|
|
|
|
|
|
|
## Installation
|
|
|
|
|
|
|
|
Install dependencies:
|
|
|
|
|
|
|
|
```shell
|
|
|
|
pip install -r requirements.txt
|
|
|
|
```
|
|
|
|
|
|
|
|
## Usage
|
|
|
|
|
2024-07-22 22:47:49 +00:00
|
|
|
1. Create configuration file. See below and in `examples/` folder for inspiration.
|
|
|
|
2. [Create KuCoin API key](https://www.kucoin.com/account/api) with **General**
|
|
|
|
and **Spot Trading** permissions.
|
|
|
|
3. Add KuCoin API key secrets (`KUCOIN_KEY`, `KUCOIN_SECRET`, `KUCOIN_PASS`) to
|
|
|
|
an [`secret_loader` accessible
|
|
|
|
location](https://gitfub.space/Jmaa/secret_loader#user-content-accessible) .
|
|
|
|
4. Run script using `python -m crypto_seller --config CONFIG_FILE`.
|
2024-07-22 15:02:15 +00:00
|
|
|
|
|
|
|
The script will now automatically sell assets over time. The interval between
|
|
|
|
sell-offs are randomized to avoid front-running, and the amounts are also
|
2024-07-22 22:47:49 +00:00
|
|
|
randomized to avoid certain attacks (only relevant for smallish intervals of
|
|
|
|
less than a week).
|
2024-07-22 15:02:15 +00:00
|
|
|
|
|
|
|
The log will both be displayed in the shell, and be placed in a log file
|
|
|
|
`output/log.txt`. Every sell-off will be logged to the `output/trades.csv`
|
|
|
|
file, with as much information as possible. Keep both of these for tax
|
|
|
|
purposes, if relevant.
|
|
|
|
|
2024-07-22 22:47:49 +00:00
|
|
|
## Configuration
|
|
|
|
|
|
|
|
Example configurations can be found in the `examples/` folder.
|
|
|
|
|
|
|
|
Configurations are `.json` files, with the following fields:
|
|
|
|
|
|
|
|
```json
|
|
|
|
{
|
|
|
|
"input_asset": str,
|
|
|
|
"output_asset": str,
|
|
|
|
"input_amount_low": float,
|
|
|
|
"input_amount_high": float,
|
|
|
|
"interval_minutes_low": int,
|
|
|
|
"interval_minutes_high": int
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
While `input_amount_low` and `input_amount_high` can be identical (and
|
|
|
|
the same for `interval_minutes_XX`) it is discouraged, to avoid frontrunning attacks.
|
|
|
|
|
2024-07-22 15:02:15 +00:00
|
|
|
## Auditing information
|
|
|
|
|
2024-07-22 22:47:49 +00:00
|
|
|
As mentioned before, this program is mostly glue code and wrappering around
|
|
|
|
library functionality. The glue application code allows for running the main
|
|
|
|
loop of checking balance, selling amount and sleeping until the next iteration,
|
|
|
|
with some argument and configuration parsing thrown in.
|
|
|
|
|
2024-07-22 15:02:15 +00:00
|
|
|
The most relevant libraries for auditing are:
|
|
|
|
|
|
|
|
- [`fin_depo`](https://gitfub.space/Jmaa/fin-depo): Library for programmatic
|
|
|
|
fetching of depository assets and in some cases allows for order placement.
|
|
|
|
This is the library that reads balances and places market orders.
|
|
|
|
- [`fin_defs`](https://gitfub.space/Jmaa/fin-defs): Definitions of financial
|
|
|
|
assets and instruments. Used by `fin_depo`.
|
2024-07-22 22:47:49 +00:00
|
|
|
- [`secret_loader`](https://gitfub.space/Jmaa/secret_loader): Library for
|
|
|
|
loading of secrets (passwords, API keys, secret keys, configuration files,
|
|
|
|
etc.) from standardized locations.
|
|
|
|
- [`python-kucoin`](https://python-kucoin.readthedocs.io/en/latest/): Used by
|
|
|
|
`fin_depo` to provide KuCoin backend.
|
2024-07-22 15:02:15 +00:00
|
|
|
|
|
|
|
## Taxation
|
|
|
|
|
|
|
|
Some parts of the world suffers from weird and draconian taxation rules on
|
|
|
|
cryptocurrencies, so it helps to keep track of the relevant trading
|
|
|
|
information.
|
|
|
|
|
|
|
|
As mentioned above, keep (and backup) both the log file (`output/log.txt`) and
|
|
|
|
the trades file (`output/trades.csv`).
|
|
|
|
|
|
|
|
To help with tax reporting, it might be useful to sign up to tax oriented
|
|
|
|
websites. For example, [CryptoSkat](https://cryptoskat.dk/) seems to be the
|
|
|
|
most mature on the danish market, and does support KuCoin.
|
|
|
|
|
|
|
|
## TODO
|
|
|
|
|
2024-07-22 21:39:10 +00:00
|
|
|
- [ ] Present an overview of what the script will be doing
|
|
|
|
* Sell what for what? How much, how often?
|
|
|
|
* Give an estimate of how long it will take.
|
|
|
|
* Wait 20 seconds before starting, to allow the user to review.
|
2024-07-22 15:02:15 +00:00
|
|
|
- [ ] Ensure that a failure during selling results in a safe winding down of the system.
|
|
|
|
* Catch runtime errors when selling
|
|
|
|
* Show errors to log.
|
|
|
|
* Stop loop and exit with results, and error indicator.
|
2024-07-22 22:47:49 +00:00
|
|
|
- [X] Document configuration
|
|
|
|
- [X] Document code auditing
|
2024-07-22 21:39:10 +00:00
|
|
|
- [X] Parse configuration from json.
|
2024-07-22 15:02:15 +00:00
|
|
|
- [X] Ensure sell time is included in order details
|
|
|
|
- [X] Log all trades to CSV file.
|
|
|
|
- [X] Collect information during the run and output after run
|
|
|
|
|
2024-08-02 15:15:18 +00:00
|
|
|
""".strip()
|
2024-07-17 19:51:13 +00:00
|
|
|
|
|
|
|
PACKAGE_DESCRIPTION_SHORT = """
|
2024-08-02 15:17:30 +00:00
|
|
|
Crypto Seller, I am going into finance, and I want only your strongest tokens.""".strip()
|
2024-07-17 19:51:13 +00:00
|
|
|
|
|
|
|
|
|
|
|
def parse_version_file(text: str) -> str:
|
|
|
|
match = re.match(r'^__version__\s*=\s*(["\'])([\d\.]+)\1$', text)
|
|
|
|
if match is None:
|
|
|
|
msg = 'Malformed _version.py file!'
|
|
|
|
raise Exception(msg)
|
|
|
|
return match.group(2)
|
|
|
|
|
|
|
|
|
|
|
|
with open(PACKAGE_NAME + '/_version.py') as f:
|
|
|
|
version = parse_version_file(f.read())
|
|
|
|
|
|
|
|
|
|
|
|
def parse_requirements(text: str) -> list[str]:
|
|
|
|
return text.strip().split('\n')
|
|
|
|
|
|
|
|
|
|
|
|
def read_requirements(path: str) -> list[str]:
|
|
|
|
with open(path) as f:
|
|
|
|
return parse_requirements(f.read())
|
|
|
|
|
|
|
|
|
|
|
|
REQUIREMENTS_MAIN = """
|
2024-07-22 15:02:15 +00:00
|
|
|
fin_defs @ git+https://gitfub.space/Jmaa/fin-defs.git
|
|
|
|
fin_depo @ git+https://gitfub.space/Jmaa/fin-depo.git"""
|
2024-07-17 19:51:13 +00:00
|
|
|
|
|
|
|
REQUIREMENTS_TEST = """
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
setup(
|
|
|
|
name=PACKAGE_NAME,
|
|
|
|
version=version,
|
|
|
|
description=PACKAGE_DESCRIPTION_SHORT,
|
|
|
|
long_description=PACKAGE_DESCRIPTION,
|
|
|
|
long_description_content_type='text/markdown',
|
|
|
|
author='Jon Michael Aanes',
|
|
|
|
author_email='jonjmaa@gmail.com',
|
|
|
|
url='https://gitfub.space/Jmaa/' + PACKAGE_NAME,
|
|
|
|
packages=[PACKAGE_NAME],
|
|
|
|
install_requires=parse_requirements(REQUIREMENTS_MAIN),
|
|
|
|
extras_require={
|
|
|
|
'test': parse_requirements(REQUIREMENTS_TEST),
|
|
|
|
},
|
|
|
|
python_requires='>=3.9',
|
|
|
|
)
|