- RiskManager halts + flattens on max daily loss / drawdown, caps position size and trades per day; adds a manual kill switch (POST /api/bot/kill). - Telegram and webhook notifications on trades, errors and halts. - Optional API bearer token on /api, injected server-side by the frontend nginx so the browser never sees it. - Kraken and Coinbase market data (public); Coinbase live broker. Live on an unsupported exchange now errors instead of silently falling back to paper. - Strategy presets backed by the StrategyConfig table (CRUD API + UI). - Idempotent additive-column migration so existing SQLite databases upgrade in place (fixes the new strategy_configs.name column).
58 lines
1.7 KiB
Vue
58 lines
1.7 KiB
Vue
<script setup>
|
|
import StrategyForm from './StrategyForm.vue'
|
|
|
|
const props = defineProps({
|
|
strategies: { type: Array, required: true },
|
|
status: { type: Object, required: true },
|
|
busy: { type: Boolean, default: false },
|
|
presets: { type: Array, default: () => [] },
|
|
})
|
|
const emit = defineEmits(['start', 'stop', 'kill', 'save-preset', 'delete-preset'])
|
|
|
|
function confirmKill() {
|
|
if (window.confirm('Kill switch: flatten the position and halt trading?')) {
|
|
emit('kill')
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<div class="card space-y-3">
|
|
<div class="flex items-center justify-between">
|
|
<h2 class="font-semibold">Strategy</h2>
|
|
<span
|
|
class="rounded-full px-2 py-0.5 text-xs font-medium"
|
|
:class="status.running ? 'bg-emerald-500/20 text-emerald-300' : 'bg-slate-600/40 text-slate-300'"
|
|
>
|
|
{{ status.running ? 'running' : 'stopped' }}
|
|
</span>
|
|
</div>
|
|
|
|
<StrategyForm
|
|
:strategies="strategies"
|
|
:disabled="status.running"
|
|
:busy="busy"
|
|
submit-label="Start bot"
|
|
:symbol="status.symbol"
|
|
:timeframe="status.timeframe"
|
|
:presets="presets"
|
|
@submit="emit('start', $event)"
|
|
@save-preset="emit('save-preset', $event)"
|
|
@delete-preset="emit('delete-preset', $event)"
|
|
/>
|
|
|
|
<div class="flex flex-wrap gap-2">
|
|
<button class="btn-danger" :disabled="busy || !status.running" @click="emit('stop')">
|
|
Stop bot
|
|
</button>
|
|
<button
|
|
class="btn bg-rose-700 font-bold uppercase text-white hover:bg-rose-600"
|
|
:disabled="busy || (!status.running && status.open_positions === 0)"
|
|
@click="confirmKill"
|
|
>
|
|
Kill switch
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</template>
|