Investissements hebdomadaires en actions avec TigerOpen API et GitHub Actions | Original, traduit par l'IA

Home PDF Audio

J’ai créé un script Python et un workflow GitHub Actions pour automatiser mon plan d’investissement hebdomadaire, qui achète une action NVIDIA chaque mercredi à 22h35 UTC. J’ai choisi les mercredis car, en 2025, il n’y a pas de jours fériés ce jour-là, garantissant une exécution cohérente.

Aperçu

Le script utilise l’API TigerOpen pour passer une commande de marché pour les actions NVIDIA et surveille son statut. Le workflow GitHub Actions exécute le script selon un planning, gérant la configuration et l’authentification de manière sécurisée. Voici les détails des deux composants.

Script Python

Ce script passe une commande d’achat pour une action NVIDIA, vérifie son statut pendant jusqu’à 60 secondes et l’annule si elle n’est pas exécutée.

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

# Fonction pour passer une commande
def place_order():
    client_config = get_client_config()
    trade_client = TradeClient(client_config)
    account = client_config.account  # Stocker le compte pour une utilisation ultérieure

    contract = stock_contract(symbol='NVDA', currency='USD')
    stock_order = market_order(
        account=account, contract=contract, action='BUY', quantity=1
    )
    # Passer la commande
    order_id = trade_client.place_order(stock_order)
    print(f"Commande passée avec l'ID: {order_id}")

    # Suivre le temps
    start_time = time.time()
    while time.time() - start_time < 60:  # Délai d'attente de 1 minute
        # Obtenir la commande et trouver celle que nous venons de passer
        order = trade_client.get_order(id=order_id)
        if str(order.id) == str(order_id):
            print(f"ID de la commande correspondante! Vérification du statut de la commande: {order.status}")
            # Vérifier le statut de la commande en utilisant les valeurs de l'énumération OrderStatus
            if order.status == OrderStatus.FILLED:
                print("Commande terminée avec succès.")
                return
            elif order.status == OrderStatus.REJECTED:
                print(f"Commande rejetée: {order_id}")
                raise Exception(f"La commande {order_id} a été rejetée")
            elif order.status in [
                OrderStatus.PENDING_NEW,
                OrderStatus.NEW,
                OrderStatus.HELD,
                OrderStatus.PENDING_CANCEL
            ]:
                print(f"La commande est en attente, statut: {order.status}")
            else:
                print(f"Statut de la commande: {order.status}")

        # Pause avant de vérifier à nouveau
        time.sleep(5)  # Vérifier toutes les 5 secondes

    # Si la commande n'est pas terminée en 1 minute, l'annuler
    print("La commande n'a pas été terminée en 1 minute. Annulation de la commande.")
    trade_client.cancel_order(id=order_id)
    print(f"Commande annulée: {order_id}")

if __name__ == '__main__':
    place_order()

Workflow GitHub Actions

Le workflow s’exécute tous les mercredis à 14h35 UTC (22h35 UTC) et configure l’environnement, installe les dépendances et exécute le script.

name: Investissement Régulier

on:
  schedule:
    - cron: '35 14 * * 3'  # S'exécute tous les mercredis à 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: Vérifier le dépôt
        uses: actions/checkout@v4
        with:
          fetch-depth: 5

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

      - name: Installer les dépendances
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Configurer le fichier Tiger PEM
        run: |
          echo "$" > tiger.pem
          chmod 600 tiger.pem

      - name: Exécuter le script Tiger
        id: tiger_update
        run: python invest.py
        env:
          TIGER_TIGER_ID: $
          TIGER_ACCOUNT: $
          TIGER_PEM: "tiger.pem"

Back 2025.04.26 Donate