使用TigerOpen API进行每周股票投资 | 原创,AI翻译

Home 2025.04

我开发了一个Python脚本和一个GitHub Actions工作流,用于自动化我的每周投资策略:在中国标准时间(CST)每周三晚上10:35购买一股NVIDIA股票。之所以选择周三,是因为2025年这一天没有节假日,从而确保稳定执行。

概述

该脚本使用TigerOpen API对NVIDIA股票下达市价单并监控其状态。GitHub Actions工作流按计划运行脚本,安全地处理设置和认证。以下是两个组件的详细信息。

Python脚本

该脚本下达一笔购买一股NVIDIA股票的订单,检查其状态最多60秒,如果未成交则取消。

import time
import os
from tigeropen.common.consts import Language, OrderStatus
from tigeropen.tiger_open_config import TigerOpenClientConfig
from tigeropen.common.util.signature_utils import read_private_key
from tigeropen.trade.trade_client import TradeClient
from tigeropen.common.util.order_utils import market_order
from tigeropen.common.util.contract_utils import stock_contract


def get_client_config(sandbox=False):
    client_config = TigerOpenClientConfig(sandbox_debug=sandbox)
    client_config.private_key = read_private_key(os.environ.get('TIGER_PEM'))
    client_config.tiger_id = os.environ.get('TIGER_TIGER_ID')
    client_config.account = os.environ.get('TIGER_ACCOUNT')
    client_config.language = Language.zh_CN
    return client_config


# 下单函数
def place_order():
    client_config = get_client_config()
    trade_client = TradeClient(client_config)
    account = client_config.account  # 保存账户供后续使用

    contract = stock_contract(symbol='NVDA', currency='USD')
    stock_order = market_order(
        account=account, contract=contract, action='BUY', quantity=1
    )
    # 下单
    order_id = trade_client.place_order(stock_order)
    print(f"订单已下达,ID: {order_id}")

    # 追踪时间
    start_time = time.time()
    while time.time() - start_time < 60:  # 1分钟超时
        # 获取订单,找到刚刚下达的订单
        order = trade_client.get_order(id=order_id)
        if str(order.id) == str(order_id):
            print(f"订单ID匹配!检查订单状态: {order.status}")
            # 使用OrderStatus枚举值检查订单状态
            if order.status == OrderStatus.FILLED:
                print("订单已完成。")
                return
            elif order.status == OrderStatus.REJECTED:
                print(f"订单被拒绝: {order_id}")
                raise Exception(f"订单 {order_id} 被拒绝")
            elif order.status in [
                OrderStatus.PENDING_NEW,
                OrderStatus.NEW,
                OrderStatus.HELD,
                OrderStatus.PENDING_CANCEL
            ]:
                print(f"订单等待中,状态: {order.status}")
            else:
                print(f"订单状态: {order.status}")

        # 等待后再次检查
        time.sleep(5)  # 每5秒检查一次

    # 如果订单在1分钟内未完成,则取消
    print("订单在1分钟内未完成。正在取消订单。")
    trade_client.cancel_order(id=order_id)
    print(f"订单已取消: {order_id}")


if __name__ == '__main__':
    place_order()

GitHub Actions工作流

该工作流每周三UTC时间14:35(北京时间22:35)运行,设置环境、安装依赖并执行脚本。

name: 定期投资

on:
  schedule:
    - cron: '35 14 * * 3'  # 每周三UTC时间14:35运行
  workflow_dispatch:

concurrency:
  group: 'trading'
  cancel-in-progress: false

permissions:
  id-token: write
  contents: write
  pages: write

jobs:
  invest:
    runs-on: ubuntu-latest
    steps:
      - name: 检出仓库
        uses: actions/checkout@v4
        with:
          fetch-depth: 5

      - name: 设置Python 3.13.2
        uses: actions/setup-python@v4
        with:
          python-version: "3.13.2"

      - name: 安装依赖
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: 设置Tiger PEM文件
        run: |
          echo "$" > tiger.pem
          chmod 600 tiger.pem

      - name: 运行Tiger脚本
        id: tiger_update
        run: python invest.py
        env:
          TIGER_TIGER_ID: $
          TIGER_ACCOUNT: $
          TIGER_PEM: "tiger.pem"

Back Donate