1
0

More documentation

This commit is contained in:
Jon Michael Aanes 2024-07-23 00:15:01 +02:00
parent 3533c515ae
commit b6a55091b2
Signed by: Jmaa
SSH Key Fingerprint: SHA256:Ab0GfHGCblESJx7JRE4fj4bFy/KRpeLhi41y4pF3sNA
3 changed files with 58 additions and 18 deletions

View File

@ -2,12 +2,11 @@
Automatic one-way trades.
This is a wrapper about [`fin_depo`](https://gitfub.space/Jmaa/fin-depo/) for
automatically trading one way trades, by using repeated trades
over a period.
The primary motivation is for trading low-volume crypto assets slowly without
affecting the price too much.
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.
Supported sites:
@ -23,23 +22,51 @@ pip install -r requirements.txt
## Usage
Run using from the top directory:
```shell
python -m crypto_seller
```
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`.
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
randomized to avoid too consistent behaviour.
randomized to avoid certain attacks (only relevant for smallish intervals of
less than a week).
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.
## 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.
## Auditing information
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.
The most relevant libraries for auditing are:
- [`fin_depo`](https://gitfub.space/Jmaa/fin-depo): Library for programmatic
@ -47,8 +74,11 @@ The most relevant libraries for auditing are:
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`.
- [`python-kucoin`](https://python-kucoin.readthedocs.io/en/latest/) is used by
`fin_depo` for providing KuCoin support.
- [`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.
## Taxation
@ -73,8 +103,8 @@ most mature on the danish market, and does support KuCoin.
* Catch runtime errors when selling
* Show errors to log.
* Stop loop and exit with results, and error indicator.
- [ ] Document configuration
- [ ] Document code auditing
- [X] Document configuration
- [X] Document code auditing
- [X] Parse configuration from json.
- [X] Ensure sell time is included in order details
- [X] Log all trades to CSV file.

View File

@ -1,12 +1,17 @@
import csv
import dataclasses
from pathlib import Path
import fin_depo
@dataclasses.dataclass(frozen=True)
class CsvFileLogger:
def __init__(self, path: Path):
self.path = path
"""Outputs the given `TradeOrderDetails` to the CSV file at the specified
path.
"""
path: Path
def __call__(self, trade_order: fin_depo.data.TradeOrderDetails):
fieldnames: list[str] = [
@ -21,6 +26,10 @@ class CsvFileLogger:
'raw_order_details',
]
# Ensure that directory exists
self.path.parent.mkdir(parents=True, exist_ok=True)
# Write row in CSV file
with open(self.path, 'a') as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writerow(trade_order.__dict__)

View File

@ -1,4 +1,5 @@
"""Handles secrets for the `crypto_seller` system."""
from secret_loader import SecretLoader
__all__ = ['KUCOIN_KEY', 'KUCOIN_SECRET', 'KUCOIN_PASS']