Genetics front (#29)
* Add Genetics js * Fix some error for genetics * Update removed backtest * Fixes
This commit is contained in:
14
package-lock.json
generated
14
package-lock.json
generated
@@ -2,5 +2,17 @@
|
|||||||
"name": "managing-apps",
|
"name": "managing-apps",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {}
|
"packages": {
|
||||||
|
"": {
|
||||||
|
"dependencies": {
|
||||||
|
"genetic-js": "^0.1.14"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/genetic-js": {
|
||||||
|
"version": "0.1.14",
|
||||||
|
"resolved": "https://registry.npmjs.org/genetic-js/-/genetic-js-0.1.14.tgz",
|
||||||
|
"integrity": "sha512-HHm21naCEF1EVKTWPFzKX4ENB7Nn/my4kTy2POi4u/2gB0XPUOh8oDlhhESVCZVBge3b7nuLrZNZNAt4ObH19Q==",
|
||||||
|
"license": "BSD"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
5
package.json
Normal file
5
package.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"dependencies": {
|
||||||
|
"genetic-js": "^0.1.14"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1504,7 +1504,7 @@ public class TradingBot : Bot, ITradingBot
|
|||||||
/// <returns>True if the position has exceeded the time limit, false otherwise</returns>
|
/// <returns>True if the position has exceeded the time limit, false otherwise</returns>
|
||||||
private bool HasPositionExceededTimeLimit(Position position, DateTime currentTime)
|
private bool HasPositionExceededTimeLimit(Position position, DateTime currentTime)
|
||||||
{
|
{
|
||||||
if (!Config.MaxPositionTimeHours.HasValue)
|
if (!Config.MaxPositionTimeHours.HasValue || Config.MaxPositionTimeHours.Value <= 0)
|
||||||
{
|
{
|
||||||
return false; // Time-based closure is disabled
|
return false; // Time-based closure is disabled
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
"connectkit": "^1.8.2",
|
"connectkit": "^1.8.2",
|
||||||
"date-fns": "^2.30.0",
|
"date-fns": "^2.30.0",
|
||||||
"elliptic": "^6.6.1",
|
"elliptic": "^6.6.1",
|
||||||
|
"genetic-js": "^0.1.14",
|
||||||
"jotai": "^1.6.7",
|
"jotai": "^1.6.7",
|
||||||
"latest-version": "^9.0.0",
|
"latest-version": "^9.0.0",
|
||||||
"lightweight-charts": "git+https://github.com/ntf/lightweight-charts.git",
|
"lightweight-charts": "git+https://github.com/ntf/lightweight-charts.git",
|
||||||
@@ -65,7 +66,7 @@
|
|||||||
"@types/react": "^18.0.9",
|
"@types/react": "^18.0.9",
|
||||||
"@types/react-dom": "^18.0.4",
|
"@types/react-dom": "^18.0.4",
|
||||||
"@types/react-grid-layout": "^1.3.2",
|
"@types/react-grid-layout": "^1.3.2",
|
||||||
"@types/react-plotly.js": "^2.6.0",
|
"@types/react-plotly.js": "^2.6.3",
|
||||||
"@types/react-slider": "^1.3.1",
|
"@types/react-slider": "^1.3.1",
|
||||||
"@types/react-table": "^7.7.12",
|
"@types/react-table": "^7.7.12",
|
||||||
"@types/signalr": "^2.2.37",
|
"@types/signalr": "^2.2.37",
|
||||||
|
|||||||
@@ -1,17 +1,28 @@
|
|||||||
import {create} from 'zustand'
|
import {create} from 'zustand'
|
||||||
|
|
||||||
import type {AccountStore} from '../../global/type.tsx'
|
import type {AccountStore} from '../../global/type.tsx'
|
||||||
|
import {AccountClient} from '../../generated/ManagingApi'
|
||||||
|
import useApiUrlStore from './apiStore'
|
||||||
|
|
||||||
export const useAuthStore = create<AccountStore>((set) => ({
|
export const useAuthStore = create<AccountStore>((set, get) => ({
|
||||||
accounts: [],
|
accounts: [],
|
||||||
onInitialize: () => {
|
onInitialize: async () => {
|
||||||
console.log('useFlowStore onInitialize')
|
console.log('useAuthStore onInitialize')
|
||||||
|
|
||||||
// const accountClient = new AccountClient({}, apiUrl)
|
try {
|
||||||
// const accounts = await accountClient.account_GetAccounts()
|
const { apiUrl } = useApiUrlStore.getState()
|
||||||
// if (accounts.length > 0) {
|
const accountClient = new AccountClient({}, apiUrl)
|
||||||
// get().setAccounts(accounts)
|
const accounts = await accountClient.account_GetAccounts()
|
||||||
// }
|
|
||||||
|
if (accounts.length > 0) {
|
||||||
|
get().setAccounts(accounts)
|
||||||
|
console.log('Accounts loaded:', accounts.length)
|
||||||
|
} else {
|
||||||
|
console.log('No accounts found')
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to load accounts:', error)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
setAccounts: (accounts) => {
|
setAccounts: (accounts) => {
|
||||||
set((state) => ({
|
set((state) => ({
|
||||||
@@ -19,4 +30,12 @@ export const useAuthStore = create<AccountStore>((set) => ({
|
|||||||
accounts: accounts,
|
accounts: accounts,
|
||||||
}))
|
}))
|
||||||
},
|
},
|
||||||
|
getFirstAccount: () => {
|
||||||
|
const state = get()
|
||||||
|
return state.accounts.length > 0 ? state.accounts[0] : null
|
||||||
|
},
|
||||||
|
getFirstAccountName: () => {
|
||||||
|
const state = get()
|
||||||
|
return state.accounts.length > 0 ? state.accounts[0].name : ''
|
||||||
|
},
|
||||||
}))
|
}))
|
||||||
|
|||||||
@@ -288,7 +288,7 @@ const BacktestRowDetails: React.FC<IBacktestRowDetailsProps> = ({
|
|||||||
title="Money Management"
|
title="Money Management"
|
||||||
content={
|
content={
|
||||||
"SL: " +(config.moneyManagement?.stopLoss * 100).toFixed(2) + "% TP: " +
|
"SL: " +(config.moneyManagement?.stopLoss * 100).toFixed(2) + "% TP: " +
|
||||||
(config.moneyManagement?.takeProfit * 100).toFixed(2) + "%"
|
(config.moneyManagement?.takeProfit * 100).toFixed(2) + "%" + " Lev.: x" + config.moneyManagement?.leverage
|
||||||
}
|
}
|
||||||
></CardText>
|
></CardText>
|
||||||
<CardText
|
<CardText
|
||||||
|
|||||||
@@ -14,11 +14,12 @@ import BacktestRowDetails from './backtestRowDetails'
|
|||||||
interface BacktestTableProps {
|
interface BacktestTableProps {
|
||||||
list: Backtest[] | undefined
|
list: Backtest[] | undefined
|
||||||
isFetching?: boolean
|
isFetching?: boolean
|
||||||
|
displaySummary?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const BacktestTable: React.FC<BacktestTableProps> = ({list, isFetching}) => {
|
const BacktestTable: React.FC<BacktestTableProps> = ({list, isFetching, displaySummary = true}) => {
|
||||||
const [rows, setRows] = useState<Backtest[]>([])
|
const [rows, setRows] = useState<Backtest[]>([])
|
||||||
const {apiUrl} = useApiUrlStore()
|
const {apiUrl} = useApiUrlStore()
|
||||||
const {removeBacktest} = useBacktestStore()
|
const {removeBacktest} = useBacktestStore()
|
||||||
@@ -462,7 +463,7 @@ const BacktestTable: React.FC<BacktestTableProps> = ({list, isFetching}) => {
|
|||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
{list && list.length > 0 && (
|
{list && list.length > 0 && displaySummary && (
|
||||||
<>
|
<>
|
||||||
<div className="mb-4">
|
<div className="mb-4">
|
||||||
<CardText
|
<CardText
|
||||||
|
|||||||
@@ -317,6 +317,9 @@ export type CardProps = {
|
|||||||
export type AccountStore = {
|
export type AccountStore = {
|
||||||
setAccounts: (accounts: Account[]) => void
|
setAccounts: (accounts: Account[]) => void
|
||||||
accounts: Account[]
|
accounts: Account[]
|
||||||
|
onInitialize: () => Promise<void>
|
||||||
|
getFirstAccount: () => Account | null
|
||||||
|
getFirstAccountName: () => string
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ILoader = {
|
export type ILoader = {
|
||||||
|
|||||||
@@ -1,15 +1,17 @@
|
|||||||
import { usePrivy } from '@privy-io/react-auth'
|
import {usePrivy} from '@privy-io/react-auth'
|
||||||
import { useAccount } from 'wagmi'
|
import {useAccount} from 'wagmi'
|
||||||
|
|
||||||
import LogIn from '../../components/mollecules/LogIn/LogIn'
|
import LogIn from '../../components/mollecules/LogIn/LogIn'
|
||||||
import useCookie from '../../hooks/useCookie'
|
import useCookie from '../../hooks/useCookie'
|
||||||
import { useEffect, useState } from 'react'
|
import {useEffect, useState} from 'react'
|
||||||
|
import {useAuthStore} from '../../app/store/accountStore'
|
||||||
|
|
||||||
export const Auth = ({ children }: any) => {
|
export const Auth = ({ children }: any) => {
|
||||||
const { getCookie, deleteCookie } = useCookie()
|
const { getCookie, deleteCookie } = useCookie()
|
||||||
const { isConnected } = useAccount()
|
const { isConnected } = useAccount()
|
||||||
const { login, ready, authenticated, user } = usePrivy()
|
const { login, ready, authenticated, user } = usePrivy()
|
||||||
const token = getCookie('token')
|
const token = getCookie('token')
|
||||||
|
const onInitialize = useAuthStore((state) => state.onInitialize)
|
||||||
|
|
||||||
const [isLoading, setIsLoading] = useState(true);
|
const [isLoading, setIsLoading] = useState(true);
|
||||||
|
|
||||||
@@ -23,6 +25,13 @@ export const Auth = ({ children }: any) => {
|
|||||||
}
|
}
|
||||||
}, [ready]);
|
}, [ready]);
|
||||||
|
|
||||||
|
// Initialize accounts when authenticated and token is available
|
||||||
|
useEffect(() => {
|
||||||
|
if (authenticated && token) {
|
||||||
|
onInitialize()
|
||||||
|
}
|
||||||
|
}, [authenticated, token, onInitialize]);
|
||||||
|
|
||||||
if (!ready || isLoading) {
|
if (!ready || isLoading) {
|
||||||
return <div>Loading...</div>;
|
return <div>Loading...</div>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import {Tabs} from '../../components/mollecules'
|
|||||||
import BacktestPlayground from './backtestPlayground'
|
import BacktestPlayground from './backtestPlayground'
|
||||||
import BacktestScanner from './backtestScanner'
|
import BacktestScanner from './backtestScanner'
|
||||||
import BacktestUpload from './backtestUpload'
|
import BacktestUpload from './backtestUpload'
|
||||||
|
import BacktestGenetic from './backtestGenetic'
|
||||||
import type {TabsType} from '../../global/type.tsx'
|
import type {TabsType} from '../../global/type.tsx'
|
||||||
|
|
||||||
// Tabs Array
|
// Tabs Array
|
||||||
@@ -24,6 +25,11 @@ const tabs: TabsType = [
|
|||||||
index: 3,
|
index: 3,
|
||||||
label: 'Upload',
|
label: 'Upload',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Component: BacktestGenetic,
|
||||||
|
index: 4,
|
||||||
|
label: 'Genetic',
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
const Backtest: React.FC = () => {
|
const Backtest: React.FC = () => {
|
||||||
|
|||||||
1875
src/Managing.WebApp/src/pages/backtestPage/backtestGenetic.tsx
Normal file
1875
src/Managing.WebApp/src/pages/backtestPage/backtestGenetic.tsx
Normal file
File diff suppressed because it is too large
Load Diff
65
src/Managing.WebApp/src/types/genetic-js.d.ts
vendored
Normal file
65
src/Managing.WebApp/src/types/genetic-js.d.ts
vendored
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
declare module 'genetic-js' {
|
||||||
|
interface GeneticConfig {
|
||||||
|
size?: number
|
||||||
|
crossover?: number
|
||||||
|
mutation?: number
|
||||||
|
iterations?: number
|
||||||
|
fittestAlwaysSurvives?: boolean
|
||||||
|
webWorkers?: boolean
|
||||||
|
skip?: number
|
||||||
|
maxResults?: number
|
||||||
|
}
|
||||||
|
|
||||||
|
interface GeneticStats {
|
||||||
|
generation: number
|
||||||
|
fittest: any
|
||||||
|
fitness: number
|
||||||
|
average: number
|
||||||
|
worst: number
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Genetic {
|
||||||
|
seed: () => any
|
||||||
|
fitness: (individual: any) => number | Promise<number>
|
||||||
|
mutate?: (individual: any) => any
|
||||||
|
crossover?: (mother: any, father: any) => [any, any]
|
||||||
|
select1?: (population: any[]) => any
|
||||||
|
select2?: (population: any[]) => [any, any]
|
||||||
|
generation?: (population: any[], generation: number, stats: GeneticStats) => boolean | Promise<boolean>
|
||||||
|
notification?: (population: any[], generation: number, stats: GeneticStats, isFinished: boolean) => void
|
||||||
|
optimize: any
|
||||||
|
evolve: () => Promise<any>
|
||||||
|
size: number
|
||||||
|
crossover: number
|
||||||
|
mutation: number
|
||||||
|
iterations: number
|
||||||
|
fittestAlwaysSurvives: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
interface GeneticStatic {
|
||||||
|
create: (config?: GeneticConfig) => Genetic
|
||||||
|
Optimize: {
|
||||||
|
Minimize: any
|
||||||
|
Maximize: any
|
||||||
|
}
|
||||||
|
Select1: {
|
||||||
|
Tournament2: any
|
||||||
|
Tournament3: any
|
||||||
|
Fittest: any
|
||||||
|
Random: any
|
||||||
|
RandomLinearRank: any
|
||||||
|
Sequential: any
|
||||||
|
}
|
||||||
|
Select2: {
|
||||||
|
Tournament2: any
|
||||||
|
Tournament3: any
|
||||||
|
Random: any
|
||||||
|
RandomLinearRank: any
|
||||||
|
Sequential: any
|
||||||
|
FittestRandom: any
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const Genetic: GeneticStatic
|
||||||
|
export = Genetic
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user