SQL Helper¶
This page contains some help if you want to edit your sqlite db.
Install sqlite3¶
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¶
sudo apt-get install sqlite3
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.
docker-compose exec freqtrade /bin/bash
sqlite3 <databasefile>.sqlite
Open the DB¶
sqlite3
.open <filepath>
Table structure¶
List tables¶
.tables
Display table structure¶
.schema <table_name>
Trade table structure¶
CREATE TABLE trades(
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,
timeframe INTEGER,
PRIMARY KEY (id),
CHECK (is_open IN (0, 1))
);
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);
Get all trades in the table¶
SELECT * FROM trades;
Fix trade still open after a manual sell on the exchange¶
Warning
Manually selling a pair on the exchange will not be detected by the bot and it will try to sell anyway. Whenever possible, forcesell
It is strongly advised to backup your database file before making any manual changes.
Note
This should not be necessary after /forcesell, as forcesell orders are closed automatically by the bot on the next iteration.
UPDATE trades
SET is_open=0,
close_date=<close_date>,
close_rate=<close_rate>,
close_profit = close_rate / open_rate - 1,
close_profit_abs = (amount * <close_rate> * (1 - fee_close) - (amount * (open_rate * (1 - fee_open)))),
sell_reason=<sell_reason>
WHERE id=<trade_ID_to_update>;
Example¶
UPDATE trades
SET is_open=0,
close_date='2020-06-20 03:08:45.103418',
close_rate=0.19638016,
close_profit=0.0496,
close_profit_abs = (amount * 0.19638016 * (1 - fee_close) - (amount * (open_rate * (1 - fee_open)))),
sell_reason='force_sell'
WHERE id=31;
Manually insert a new trade¶
INSERT INTO trades (exchange, pair, is_open, fee_open, fee_close, open_rate, stake_amount, amount, open_date)
VALUES ('binance', 'ETH/BTC', 1, 0.0025, 0.0025, <open_rate>, <stake_amount>, <amount>, '<datetime>')
Insert trade example¶
INSERT INTO trades (exchange, pair, is_open, fee_open, fee_close, open_rate, stake_amount, amount, open_date)
VALUES ('binance', 'ETH/BTC', 1, 0.0025, 0.0025, 0.00258580, 0.002, 0.7715262081, '2020-06-28 12:44:24.000000')
Remove trade from the database¶
Maybe you'd like to remove a trade from the database, because something went wrong.
DELETE FROM trades WHERE id = <tradeid>;
DELETE FROM trades WHERE id = 31;
Warning
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.