Feature/custom strategy (#1172)

* feat: add Strategy Studio with multi-timeframe support
- Add Strategy Studio page with three-column layout for strategy management
- Support multi-timeframe K-line data selection (5m, 15m, 1h, 4h, etc.)
- Add GetWithTimeframes() function in market package for fetching multiple timeframes
- Add TimeframeSeriesData struct for storing per-timeframe technical indicators
- Update formatMarketData() to display all selected timeframes in AI prompt
- Add strategy API endpoints for CRUD operations and test run
- Integrate real AI test runs with configured AI models
- Support custom AI500 and OI Top API URLs from strategy config
* docs: add Strategy Studio screenshot to README files
* fix: correct strategy-studio.png filename case in README
* refactor: remove legacy signal source config and simplify trader creation
- Remove signal source configuration from traders page (now handled by strategy)
- Remove advanced options (legacy config) from TraderConfigModal
- Rename default strategy to "默认山寨策略" with AI500 coin pool URL
- Delete SignalSourceModal and SignalSourceWarning components
- Clean up related stores, hooks, and page components
This commit is contained in:
tinkle-community
2025-12-06 07:20:11 +08:00
committed by GitHub
parent afb2d158ac
commit 5cff32e4f2
37 changed files with 4965 additions and 1051 deletions

View File

@@ -21,15 +21,10 @@ interface UseTraderActionsParams {
mutateTraders: () => Promise<any>
setAllModels: (models: AIModel[]) => void
setAllExchanges: (exchanges: Exchange[]) => void
setUserSignalSource: (config: {
coinPoolUrl: string
oiTopUrl: string
}) => void
setShowCreateModal: (show: boolean) => void
setShowEditModal: (show: boolean) => void
setShowModelModal: (show: boolean) => void
setShowExchangeModal: (show: boolean) => void
setShowSignalSourceModal: (show: boolean) => void
setEditingModel: (modelId: string | null) => void
setEditingExchange: (exchangeId: string | null) => void
editingTrader: TraderConfigData | null
@@ -46,12 +41,10 @@ export function useTraderActions({
mutateTraders,
setAllModels,
setAllExchanges,
setUserSignalSource,
setShowCreateModal,
setShowEditModal,
setShowModelModal,
setShowExchangeModal,
setShowSignalSourceModal,
setEditingModel,
setEditingExchange,
editingTrader,
@@ -605,24 +598,6 @@ export function useTraderActions({
setShowExchangeModal(true)
}
const handleSaveSignalSource = async (
coinPoolUrl: string,
oiTopUrl: string
) => {
try {
await toast.promise(api.saveUserSignalSource(coinPoolUrl, oiTopUrl), {
loading: '正在保存…',
success: '保存成功',
error: '保存失败',
})
setUserSignalSource({ coinPoolUrl, oiTopUrl })
setShowSignalSourceModal(false)
} catch (error) {
console.error('Failed to save signal source:', error)
toast.error(t('saveSignalSourceFailed', language))
}
}
return {
// 辅助函数
isModelInUse,
@@ -646,6 +621,5 @@ export function useTraderActions({
handleDeleteModel,
handleSaveExchange,
handleDeleteExchange,
handleSaveSignalSource,
}
}