2018-01-02 02:17:10 +00:00
# SQL Helper
2020-05-13 04:50:52 +00:00
2019-04-04 18:53:28 +00:00
This page contains some help if you want to edit your sqlite db.
2018-01-02 02:17:10 +00:00
## Install sqlite3
2020-05-13 04:50:52 +00:00
Sqlite3 is a terminal based sqlite application.
Feel free to use a visual Database editor like SqliteBrowser if you feel more comfortable with that.
### Ubuntu/Debian installation
2018-01-02 02:17:10 +00:00
```bash
sudo apt-get install sqlite3
```
2020-07-11 05:29:34 +00:00
### Using sqlite3 via docker-compose
The freqtrade docker image does contain sqlite3, so you can edit the database without having to install anything on the host system.
``` bash
docker-compose exec freqtrade /bin/bash
sqlite3 < databasefile > .sqlite
```
2018-01-02 02:17:10 +00:00
## Open the DB
2020-05-13 04:50:52 +00:00
2018-01-02 02:17:10 +00:00
```bash
sqlite3
.open < filepath >
```
## Table structure
### List tables
2020-05-13 04:50:52 +00:00
2018-01-02 02:17:10 +00:00
```bash
.tables
```
### Display table structure
2020-05-13 04:50:52 +00:00
2018-01-02 02:17:10 +00:00
```bash
.schema < table_name >
```
### Trade table structure
2020-05-13 04:50:52 +00:00
2018-01-02 02:17:10 +00:00
```sql
2020-09-11 06:42:42 +00:00
CREATE TABLE trades(
2020-05-13 04:50:52 +00:00
id INTEGER NOT NULL,
exchange VARCHAR NOT NULL,
pair VARCHAR NOT NULL,
is_open BOOLEAN NOT NULL,
fee_open FLOAT NOT NULL,
fee_open_cost FLOAT,
fee_open_currency VARCHAR,
fee_close FLOAT NOT NULL,
fee_close_cost FLOAT,
fee_close_currency VARCHAR,
open_rate FLOAT,
open_rate_requested FLOAT,
open_trade_price FLOAT,
close_rate FLOAT,
close_rate_requested FLOAT,
close_profit FLOAT,
close_profit_abs FLOAT,
stake_amount FLOAT NOT NULL,
amount FLOAT,
open_date DATETIME NOT NULL,
close_date DATETIME,
open_order_id VARCHAR,
stop_loss FLOAT,
stop_loss_pct FLOAT,
initial_stop_loss FLOAT,
initial_stop_loss_pct FLOAT,
stoploss_order_id VARCHAR,
stoploss_last_update DATETIME,
max_rate FLOAT,
min_rate FLOAT,
sell_reason VARCHAR,
strategy VARCHAR,
2020-06-02 08:02:24 +00:00
timeframe INTEGER,
2020-05-13 04:50:52 +00:00
PRIMARY KEY (id),
CHECK (is_open IN (0, 1))
2018-01-02 02:17:10 +00:00
);
2020-05-13 04:50:52 +00:00
CREATE INDEX ix_trades_stoploss_order_id ON trades (stoploss_order_id);
CREATE INDEX ix_trades_pair ON trades (pair);
CREATE INDEX ix_trades_is_open ON trades (is_open);
2018-01-02 02:17:10 +00:00
```
## Get all trades in the table
```sql
SELECT * FROM trades;
```
2019-03-08 21:15:03 +00:00
## Fix trade still open after a manual sell on the exchange
2018-01-02 02:17:10 +00:00
2019-03-23 18:43:23 +00:00
!!! Warning
2019-04-04 19:05:26 +00:00
Manually selling a pair on the exchange will not be detected by the bot and it will try to sell anyway. Whenever possible, forcesell < tradeid > should be used to accomplish the same thing.
2020-04-22 04:39:03 +00:00
It is strongly advised to backup your database file before making any manual changes.
2019-03-08 21:15:03 +00:00
2019-03-23 18:43:23 +00:00
!!! Note
2019-04-04 18:53:28 +00:00
This should not be necessary after /forcesell, as forcesell orders are closed automatically by the bot on the next iteration.
2019-03-06 20:37:52 +00:00
2018-01-02 02:17:10 +00:00
```sql
UPDATE trades
2020-04-22 04:39:03 +00:00
SET is_open=0,
close_date=< close_date > ,
close_rate=< close_rate > ,
2020-07-11 05:29:11 +00:00
close_profit = close_rate / open_rate - 1,
2020-08-22 07:33:35 +00:00
close_profit_abs = (amount * <close_rate> * (1 - fee_close) - (amount * (open_rate * (1 - fee_open)))),
2020-04-22 04:39:03 +00:00
sell_reason=< sell_reason >
2018-01-02 02:17:10 +00:00
WHERE id=< trade_ID_to_update > ;
```
2020-04-22 04:39:03 +00:00
### Example
2019-03-06 20:37:52 +00:00
2018-01-02 02:17:10 +00:00
```sql
UPDATE trades
2020-04-22 04:39:03 +00:00
SET is_open=0,
2020-07-11 05:29:11 +00:00
close_date='2020-06-20 03:08:45.103418',
2020-04-22 04:39:03 +00:00
close_rate=0.19638016,
close_profit=0.0496,
2020-08-22 07:33:35 +00:00
close_profit_abs = (amount * 0.19638016 * (1 - fee_close) - (amount * (open_rate * (1 - fee_open)))),
2020-04-22 04:39:03 +00:00
sell_reason='force_sell'
2018-01-02 02:17:10 +00:00
WHERE id=31;
```
2020-07-11 05:29:11 +00:00
## Manually insert a new trade
2018-01-14 06:54:22 +00:00
```sql
2019-03-06 20:37:52 +00:00
INSERT INTO trades (exchange, pair, is_open, fee_open, fee_close, open_rate, stake_amount, amount, open_date)
2020-07-11 05:29:11 +00:00
VALUES ('binance', 'ETH/BTC', 1, 0.0025, 0.0025, < open_rate > , < stake_amount > , < amount > , '< datetime > ')
2018-01-14 06:54:22 +00:00
```
2020-07-11 05:29:11 +00:00
### Insert trade example
2019-03-06 20:37:52 +00:00
2018-01-14 06:54:22 +00:00
```sql
2019-03-06 20:37:52 +00:00
INSERT INTO trades (exchange, pair, is_open, fee_open, fee_close, open_rate, stake_amount, amount, open_date)
2020-07-11 05:29:11 +00:00
VALUES ('binance', 'ETH/BTC', 1, 0.0025, 0.0025, 0.00258580, 0.002, 0.7715262081, '2020-06-28 12:44:24.000000')
2018-01-14 06:54:22 +00:00
```
2020-07-11 05:29:11 +00:00
## Remove trade from the database
Maybe you'd like to remove a trade from the database, because something went wrong.
```sql
DELETE FROM trades WHERE id = < tradeid > ;
```
```sql
DELETE FROM trades WHERE id = 31;
```
!!! Warning
2020-07-12 10:36:16 +00:00
This will remove this trade from the database. Please make sure you got the correct id and **NEVER** run this query without the `where` clause.