diff --git a/src/components/layout/NavBar.vue b/src/components/layout/NavBar.vue
index 526f1303..818193f4 100644
--- a/src/components/layout/NavBar.vue
+++ b/src/components/layout/NavBar.vue
@@ -13,6 +13,7 @@
Trade
Dashboard
+ Backtest
diff --git a/src/router/index.ts b/src/router/index.ts
index 36cf0598..ec83d062 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -26,6 +26,14 @@ const routes: Array = [
name: 'Freqtrade Graph',
component: () => import(/* webpackChunkName: "graph" */ '@/views/Graphs.vue'),
},
+ {
+ path: '/backtest',
+ name: 'Freqtrade Backtest',
+ // route level code-splitting
+ // this generates a separate chunk (about.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import(/* webpackChunkName: "about" */ '@/views/Backtesting.vue'),
+ },
{
path: '/dashboard',
name: 'Freqtrade Dashboard',
diff --git a/src/store/modules/ftbot/index.ts b/src/store/modules/ftbot/index.ts
index ec6b13b4..5c9b60d9 100644
--- a/src/store/modules/ftbot/index.ts
+++ b/src/store/modules/ftbot/index.ts
@@ -1,6 +1,7 @@
import { api } from '@/shared/apiService';
import {
+ BacktestResult,
BotState,
BlacklistPayload,
ForcebuyPayload,
@@ -189,6 +190,12 @@ export default {
storeCustomPlotConfig(plotConfig);
state.availablePlotConfigNames = getAllPlotConfigNames();
},
+ updateBacktestRunning(state, running: boolean) {
+ state.backtestRunning = running;
+ },
+ updateBacktestResult(state, backtestResult: BacktestResult) {
+ state.backtestResult = backtestResult;
+ },
},
actions: {
ping({ commit, rootState }) {
@@ -572,5 +579,20 @@ export default {
console.error(error);
return Promise.reject(error);
},
+ async startBacktest({ commit }, payload) {
+ try {
+ const result = await api.post('/backtest', payload);
+ commit('updateBacktestRunning', result.data.running);
+ } catch (err) {
+ console.log(err);
+ }
+ },
+ async pollBacktest({ commit }) {
+ const result = await api.get('/backtest');
+ commit('updateBacktestRunning', result.data.running);
+ if (result.data.running === false && result.data.backtest_result) {
+ commit('updateBacktestResult', result.data.backtest_result);
+ }
+ },
},
};
diff --git a/src/store/modules/ftbot/state.ts b/src/store/modules/ftbot/state.ts
index 5b148073..2b3112bf 100644
--- a/src/store/modules/ftbot/state.ts
+++ b/src/store/modules/ftbot/state.ts
@@ -10,6 +10,7 @@ import {
LockResponse,
PlotConfigStorage,
ProfitInterface,
+ BacktestResult,
} from '@/types';
export interface FtbotStateType {
@@ -41,6 +42,8 @@ export interface FtbotStateType {
strategy: StrategyResult | {};
pairlist: string[];
currentLocks?: LockResponse;
+ backtestRunning: boolean;
+ backtestResult?: BacktestResult;
}
const state: FtbotStateType = {
version: '',
@@ -69,6 +72,9 @@ const state: FtbotStateType = {
strategy: {},
pairlist: [],
currentLocks: undefined,
+ // backtesting
+ backtestRunning: false,
+ backtestResult: undefined,
};
export default state;
diff --git a/src/types/backtest.ts b/src/types/backtest.ts
new file mode 100644
index 00000000..75f9ba78
--- /dev/null
+++ b/src/types/backtest.ts
@@ -0,0 +1,10 @@
+import { Trade } from './trades';
+
+export interface BacktestPayload {
+ strategy: string;
+ timerange: string;
+}
+
+export interface BacktestResult {
+ trades: Trade[];
+}
diff --git a/src/types/index.ts b/src/types/index.ts
index 549d1e33..24aae10d 100644
--- a/src/types/index.ts
+++ b/src/types/index.ts
@@ -1,5 +1,6 @@
export * from './auth';
export * from './balance';
+export * from './backtest';
export * from './blacklist';
export * from './chart';
export * from './daily';
diff --git a/src/views/Backtesting.vue b/src/views/Backtesting.vue
new file mode 100644
index 00000000..ed190e3a
--- /dev/null
+++ b/src/views/Backtesting.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+ Start backtest
+
+
+
+
+
+
+