Feature/custom strategy (#1173)

* 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
* feat: add quant data integration and fix position click navigation
- Integrate quant data API (netflow, OI, price changes) into Strategy Studio
- Add enable_quant_data toggle in indicator editor
- Fix position symbol click to navigate to chart (sync defaultSymbol prop)
- Fix TradingView chart fullscreen flickering
This commit is contained in:
tinkle-community
2025-12-06 07:47:03 +08:00
committed by GitHub
parent 5cff32e4f2
commit 5d1d0b6842
10 changed files with 359 additions and 9 deletions

View File

@@ -1,4 +1,4 @@
import { useState } from 'react'
import { useState, useEffect } from 'react'
import { EquityChart } from './EquityChart'
import { TradingViewChart } from './TradingViewChart'
import { useLanguage } from '../contexts/LanguageContext'
@@ -7,13 +7,25 @@ import { BarChart3, CandlestickChart } from 'lucide-react'
interface ChartTabsProps {
traderId: string
selectedSymbol?: string // 从外部选择的币种
updateKey?: number // 强制更新的 key
}
type ChartTab = 'equity' | 'kline'
export function ChartTabs({ traderId }: ChartTabsProps) {
export function ChartTabs({ traderId, selectedSymbol, updateKey }: ChartTabsProps) {
const { language } = useLanguage()
const [activeTab, setActiveTab] = useState<ChartTab>('equity')
const [chartSymbol, setChartSymbol] = useState<string>('BTCUSDT')
// 当从外部选择币种时自动切换到K线图
useEffect(() => {
if (selectedSymbol) {
console.log('[ChartTabs] 收到币种选择:', selectedSymbol, 'updateKey:', updateKey)
setChartSymbol(selectedSymbol)
setActiveTab('kline')
}
}, [selectedSymbol, updateKey])
console.log('[ChartTabs] rendering, activeTab:', activeTab)
@@ -81,7 +93,12 @@ export function ChartTabs({ traderId }: ChartTabsProps) {
{activeTab === 'equity' ? (
<EquityChart traderId={traderId} embedded />
) : (
<TradingViewChart height={400} embedded />
<TradingViewChart
height={400}
embedded
defaultSymbol={chartSymbol}
key={chartSymbol} // 强制重新渲染当币种变化时
/>
)}
</div>
</div>