Inversiones Semanales en Acciones con TigerOpen API y GitHub Actions | Original, traducido por IA

Home PDF Audio

Creé un script de Python y un flujo de trabajo de GitHub Actions para automatizar mi plan de inversión semanal, que compra una acción de NVIDIA todos los miércoles a las 10:35 PM UTC. Elegí los miércoles porque, en 2025, no hay días festivos en ese día, asegurando una ejecución consistente.

Descripción General

El script utiliza la API de TigerOpen para colocar una orden de mercado para la acción de NVIDIA y monitorea su estado. El flujo de trabajo de GitHub Actions ejecuta el script en un horario, manejando la configuración y la autenticación de manera segura. A continuación, se detallan ambos componentes.

Script de Python

Este script coloca una orden de compra para una acción de NVIDIA, verifica su estado durante hasta 60 segundos y la cancela si no se llena.

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

# Función para colocar una orden
def place_order():
    client_config = get_client_config()
    trade_client = TradeClient(client_config)
    account = client_config.account  # Guardar cuenta para uso posterior

    contract = stock_contract(symbol='NVDA', currency='USD')
    stock_order = market_order(
        account=account, contract=contract, action='BUY', quantity=1
    )
    # Colocar la orden
    order_id = trade_client.place_order(stock_order)
    print(f"Orden colocada con ID: {order_id}")

    # Seguir el tiempo
    start_time = time.time()
    while time.time() - start_time < 60:  # Tiempo de espera de 1 minuto
        # Obtener la orden y encontrar la que acabamos de colocar
        order = trade_client.get_order(id=order_id)
        if str(order.id) == str(order_id):
            print(f"ID de orden coincidente! Verificando el estado de la orden: {order.status}")
            # Verificar el estado de la orden utilizando los valores de la enumeración OrderStatus
            if order.status == OrderStatus.FILLED:
                print("Orden completada exitosamente.")
                return
            elif order.status == OrderStatus.REJECTED:
                print(f"Orden rechazada: {order_id}")
                raise Exception(f"La orden {order_id} fue rechazada")
            elif order.status in [
                OrderStatus.PENDING_NEW,
                OrderStatus.NEW,
                OrderStatus.HELD,
                OrderStatus.PENDING_CANCEL
            ]:
                print(f"La orden está pendiente, estado: {order.status}")
            else:
                print(f"El estado de la orden es: {order.status}")

        # Dormir antes de verificar nuevamente
        time.sleep(5)  # Verificar cada 5 segundos

    # Si la orden no se completa en 1 minuto, cancelarla
    print("La orden no se completó en 1 minuto. Cancelando la orden.")
    trade_client.cancel_order(id=order_id)
    print(f"Orden cancelada: {order_id}")

if __name__ == '__main__':
    place_order()

Flujo de Trabajo de GitHub Actions

El flujo de trabajo se ejecuta todos los miércoles a las 14:35 UTC (10:35 PM UTC) y configura el entorno, instala las dependencias y ejecuta el script.

name: Inversión Regular

on:
  schedule:
    - cron: '35 14 * * 3'  # Ejecutar todos los miércoles a las 14:35 UTC
  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: Clonar Repositorio
        uses: actions/checkout@v4
        with:
          fetch-depth: 5

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

      - name: Instalar Dependencias
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Configurar Archivo Tiger PEM
        run: |
          echo "$" > tiger.pem
          chmod 600 tiger.pem

      - name: Ejecutar Script de Tiger
        id: tiger_update
        run: python invest.py
        env:
          TIGER_TIGER_ID: $
          TIGER_ACCOUNT: $
          TIGER_PEM: "tiger.pem"

Back 2025.04.26 Donate