add close position schema

master
TZGyn 10 months ago
parent 925ab06554
commit fa0df46e04
Signed by: TZGyn
GPG Key ID: 122EAF77AE81FD4A

@ -10,9 +10,29 @@ export const POST = async () => {
const orders = await client.getActiveOrders({
category: 'linear',
baseCoin: 'USDT',
symbol: 'BTC',
})
console.log(orders)
const orderbook = await client.getOrderbook({
category: 'linear',
symbol: 'BTCUSDT',
})
// console.log(orderbook.result)
const history = await client.getHistoricOrders({
category: 'linear',
orderStatus: 'Filled',
})
// console.log(history.result.list)
const position = await client.getPositionInfo({
category: 'linear',
symbol: 'BTCUSDT',
})
console.log(position.result)
// console.log(orders)
return json({
orders,
})

@ -5,7 +5,11 @@
import { Input } from '$lib/components/ui/input'
import { superForm } from 'sveltekit-superforms'
import { zod } from 'sveltekit-superforms/adapters'
import { formSchema, percentSchema } from './schema'
import {
closePositionSchema,
formSchema,
percentSchema,
} from './schema'
import { Slider } from '$lib/components/ui/slider/index.js'
import { JsonView } from '@zerodevx/svelte-json-view'
import copy from 'copy-to-clipboard'
@ -65,6 +69,31 @@
const { form: percentFormData, enhance: percentEnhance } =
percentForm
const closePositionForm = superForm(data.closePositionForm, {
resetForm: false,
SPA: true,
validators: zod(closePositionSchema),
onSubmit: ({}) => {
copy(
JSON.stringify(
{
type: 'Close Position',
...$closePositionFormData,
entryPrice: '{trigger_entry_value}',
},
null,
2,
),
)
toast.success('Copied to Clipboard')
},
})
const {
form: closePositionFormData,
enhance: closePositionEnhance,
} = closePositionForm
</script>
<div class="flex flex-1 flex-col items-center justify-center">
@ -72,6 +101,7 @@
<Tabs.List class="grid w-full grid-cols-2">
<Tabs.Trigger value="flat">Flat</Tabs.Trigger>
<Tabs.Trigger value="percent">Percent</Tabs.Trigger>
<Tabs.Trigger value="close">Close</Tabs.Trigger>
</Tabs.List>
<Tabs.Content value="flat">
<form method="POST" use:enhance class="grid grid-cols-2 gap-4">
@ -309,5 +339,53 @@
$percentFormData.stopLossPercent.toString(),
}} />
</Tabs.Content>
<Tabs.Content value="close">
<form
method="POST"
use:closePositionEnhance
class="grid grid-cols-2 gap-4">
<Form.Field form={closePositionForm} name="key">
<Form.Control>
{#snippet children({ props })}
<Form.Label>Key</Form.Label>
<Input {...props} bind:value={$percentFormData.key} />
{/snippet}
</Form.Control>
<Form.Description>Key</Form.Description>
<Form.FieldErrors />
</Form.Field>
<Form.Field form={closePositionForm} name="secret">
<Form.Control>
{#snippet children({ props })}
<Form.Label>Secret</Form.Label>
<Input
{...props}
bind:value={$percentFormData.secret} />
{/snippet}
</Form.Control>
<Form.Description>Secret</Form.Description>
<Form.FieldErrors />
</Form.Field>
<Form.Field form={closePositionForm} name="symbol">
<Form.Control>
{#snippet children({ props })}
<Form.Label>Symbol</Form.Label>
<Input
{...props}
bind:value={$percentFormData.symbol} />
{/snippet}
</Form.Control>
<Form.Description>Symbol</Form.Description>
<Form.FieldErrors />
</Form.Field>
<Form.Button class="col-span-2">Copy</Form.Button>
</form>
<JsonView
json={{
type: 'Close Position',
...$closePositionFormData,
entryPrice: '{trigger_entry_value}',
}} />
</Tabs.Content>
</Tabs.Root>
</div>

@ -1,7 +1,11 @@
import { superValidate } from 'sveltekit-superforms'
import { zod } from 'sveltekit-superforms/adapters'
import type { PageLoad } from './$types'
import { formSchema, percentSchema } from './schema'
import {
closePositionSchema,
formSchema,
percentSchema,
} from './schema'
export const load = (async () => {
const form = await superValidate(
@ -23,5 +27,15 @@ export const load = (async () => {
zod(percentSchema),
{ errors: false },
)
return { form, percentForm }
const closePositionForm = await superValidate(
{
key: '',
secret: '',
symbol: 'BTCUSDT',
},
zod(closePositionSchema),
{ errors: false },
)
return { form, percentForm, closePositionForm }
}) satisfies PageLoad

@ -24,6 +24,14 @@ export const percentSchema = z.object({
stopLossPercent: z.number(),
})
export const closePositionSchema = z.object({
key: z.string(),
secret: z.string(),
symbol: z.string(),
})
export type PercentSchema = typeof percentSchema
export type FormSchema = typeof formSchema
export type ClosePositionSchema = typeof closePositionSchema

@ -34,22 +34,28 @@ export const POST = async ({ locals, request }) => {
takeProfitPercent: z.string().optional(),
stopLossPercent: z.string().optional(),
})
const form = z.union([flatSchema, percentSchema]).safeParse(body)
const closePositionSchema = z.object({
type: z.literal('Close Position'),
key: z.string(),
secret: z.string(),
symbol: z.string(),
})
const form = z
.union([flatSchema, percentSchema, closePositionSchema])
.safeParse(body)
if (!form.success) {
console.log(form.error)
return json({}, { status: 400 })
}
// const apiKey = 'wrc1w54Zp5JAfXLxY2'
// const apiSecret = 'tY7oYPhwSE1gabFS4PmxtmbDOhkYWvPh0khf'
const { key, secret, side, symbol } = form.data
const { key, secret, symbol } = form.data
try {
let qty
let takeProfit
let stopLoss
let side
const client = new RestClientV5({
key: key,
@ -57,34 +63,12 @@ export const POST = async ({ locals, request }) => {
demoTrading: true,
})
const orders = await client.getActiveOrders({
category: 'linear',
symbol,
})
const amount = orders.result.list.reduce(
(acc, curr) => acc + Number(curr.qty),
0,
)
if (amount > 0) {
const order = await client.submitOrder({
category: 'linear',
symbol,
side,
orderType: 'Market',
qty: amount.toString(),
takeProfit,
stopLoss,
})
return new Response()
}
if (form.data.type === 'Flat') {
qty = form.data.qty
takeProfit = form.data.takeProfit
stopLoss = form.data.stopLoss
} else {
side = form.data.side
} else if (form.data.type === 'Percent') {
const wallet = await client.getWalletBalance({
accountType: 'UNIFIED',
coin: 'USDT',
@ -109,6 +93,24 @@ export const POST = async ({ locals, request }) => {
Number(form.data.entryPrice) *
(1 - Number(form.data.stopLossPercent) / 100)
).toFixed(1)
side = form.data.side
} else {
const position = await client.getPositionInfo({
category: 'linear',
symbol: symbol,
})
if (position.result.list.length <= 0) {
return new Response()
}
if (position.result.list[0].side === 'None')
return new Response()
side =
position.result.list[0].side === 'Buy'
? ('Sell' as const)
: ('Buy' as const)
qty = position.result.list[0].positionValue
}
console.log({ qty, takeProfit, stopLoss })

Loading…
Cancel
Save