fix: OKX trading issues and improve position tracking

- Add maxMktSz check for OKX market orders to prevent exceeding limits
- Increase margin safety buffer (0.1% fee + 1% buffer) for all exchanges
- Fix Binance position closure detection with direct trade queries
- Move Recent Completed Trades before Current Positions in AI prompt
- Update README screenshots with table layout for better alignment
This commit is contained in:
tinkle-community
2025-12-10 22:01:57 +08:00
parent 870faa0843
commit ecbedc6525
29 changed files with 2141 additions and 1647 deletions

View File

@@ -29,6 +29,7 @@ import type {
DecisionRecord,
Statistics,
TraderInfo,
Exchange,
} from './types'
type Page =
@@ -55,6 +56,23 @@ function getModelDisplayName(modelId: string): string {
}
}
// Helper function to get exchange display name from exchange ID (UUID)
function getExchangeDisplayNameFromList(exchangeId: string | undefined, exchanges: Exchange[] | undefined): string {
if (!exchangeId) return 'Unknown'
const exchange = exchanges?.find(e => e.id === exchangeId)
if (!exchange) return exchangeId.substring(0, 8).toUpperCase() + '...'
const typeName = exchange.exchange_type?.toUpperCase() || exchange.name
return exchange.account_name ? `${typeName} - ${exchange.account_name}` : typeName
}
// Helper function to get exchange type from exchange ID (UUID) - for TradingView charts
function getExchangeTypeFromList(exchangeId: string | undefined, exchanges: Exchange[] | undefined): string {
if (!exchangeId) return 'BINANCE'
const exchange = exchanges?.find(e => e.id === exchangeId)
if (!exchange) return 'BINANCE' // Default to BINANCE for charts
return exchange.exchange_type?.toUpperCase() || 'BINANCE'
}
function App() {
const { language, setLanguage } = useLanguage()
const { user, token, logout, isLoading } = useAuth()
@@ -130,6 +148,16 @@ function App() {
}
)
// 获取exchanges列表用于显示交易所名称
const { data: exchanges } = useSWR<Exchange[]>(
user && token ? 'exchanges' : null,
api.getExchangeConfigs,
{
refreshInterval: 60000, // 1分钟刷新一次
shouldRetryOnError: false,
}
)
// 当获取到traders后设置默认选中第一个
useEffect(() => {
if (traders && traders.length > 0 && !selectedTraderId) {
@@ -445,6 +473,7 @@ function App() {
setRoute('/traders')
setCurrentPage('traders')
}}
exchanges={exchanges}
/>
)}
</main>
@@ -563,6 +592,7 @@ function TraderDetailsPage({
selectedTraderId,
onTraderSelect,
onNavigateToTraders,
exchanges,
}: {
selectedTrader?: TraderInfo
traders?: TraderInfo[]
@@ -577,6 +607,7 @@ function TraderDetailsPage({
stats?: Statistics
lastUpdate: string
language: Language
exchanges?: Exchange[]
}) {
const [closingPosition, setClosingPosition] = useState<string | null>(null)
const [selectedChartSymbol, setSelectedChartSymbol] = useState<string | undefined>(undefined)
@@ -830,7 +861,7 @@ function TraderDetailsPage({
<span>
Exchange:{' '}
<span className="font-semibold" style={{ color: '#EAECEF' }}>
{selectedTrader.exchange_id?.toUpperCase() || 'N/A'}
{getExchangeDisplayNameFromList(selectedTrader.exchange_id, exchanges)}
</span>
</span>
<span></span>
@@ -907,7 +938,7 @@ function TraderDetailsPage({
traderId={selectedTrader.trader_id}
selectedSymbol={selectedChartSymbol}
updateKey={chartUpdateKey}
exchangeId={selectedTrader.exchange_id}
exchangeId={getExchangeTypeFromList(selectedTrader.exchange_id, exchanges)}
/>
</div>