workflow

# .github/workflow/scheduler.yml
on:
	workflow_dispatch:
		schedule:
			- cron: '*/5 * * * *' # 每 5 分钟执行,是 actions 最低间隔

不同于 https://github.com/2nthony/okex-auto-trade-script 需要依靠 WS 响应来持续运行,每执行一次就是一个完整的生命周期。

文件设计

strategy.json 购买策略,会根据此策略文件来决定如何购买或卖出。

{
	"symbols": [
		{
			"type": "BTC/USDT",
			"amounts": [0.0001, 0.0002, 0.0003],
			"maxStage": 10,
			"change": 0.02,
			"safeChange": 0.06
		},
		{
			"type": "ETH/USDT",
			"amounts": [0.001, 0.002, 0.003],
			...
		}
	]
}

state.json 用于记录当前交易状态,运行时生成,并在每次交易完成后修改。无此文件时视为刚运行并生成,存在时视为参照。

{
	"symbols": [
		{
			"type": "BTC/USDT",
			"price": 55555,
			"nextBuyPrice": 55424,
			"nextSellPrice": 55892,
			"currentStage": 1,
		},
		{...}
	]
}

工作流程

交易通知

在执行交易后,根据实际情况发送通知到 Telegram 。如果有 BTC/USDT 操作则有相关内容,以此类推。

----------
BTC/USDT
💵 买入
价格 `55555`
数量 `0.002`
----------
ETH/USDT
买入
----------
LTC/USDT
💰 卖出
----------

代码工程设计

适当参考 https://github.com/2nthony/okex-auto-trade-script ,插件化是必然的。

// notifyTelegram.ts
export function notifyTelegramPlugin() {
	return {
		name: 'notify-telegram',
		when?: (api) => boolean, // 根据条件是否启用插件
		apply: (api) => {
			// ...
		}
	}
}
# src
plugins/
	index.ts       // expose `readPlugins() => Plugin[]`
	setProxy.ts // 设置代理
	tickers.ts // 策略文件获取 tickers
	ensureStateJson.ts // 确保 state.json,包括文件初始化和根据策略文件补充缺少的货币
	analyzeTickersWithStateJson.ts// 分析当前 state.json 并收集需要买卖的货币
	createOrder.ts // 根据收集下单买卖
	analyzeSafeChange.ts // 分析stage=0的货币是否暴涨
	updateStateJson.ts // 更新 state.json
	notifyTelegram.ts // 通知tg机器人
utils/ // 函数
main.ts
types.ts
store.ts
// 未实际应用,目前是手动将插件排序(参考vite,或许在以后扩展有用
pre // 应用准备
post // 应用结束前

要点

每次执行时,都会以最新获取的价格进行对比和买卖并基于此价格作下次买卖价格,不考虑下单时实际价格波动,有可能挂单或吃单。

由于交易所买卖有手续费(矿工费,因此需要准备足够的货币以抵消手续费。