SendAlgoCOOdrStrategy

新增條件單

bool SendAlgoCOOdrStrategy(Account, lstStrategy, lng)

回傳:

Type Description
bool True:此功能執行成功;False:此功能執行異常
(結果請從回應事件 OnResponse 接收)

Input Parameters

Name Type Description Memo
Account string 帳號 證券:S+分公司代號(4)+帳號(7)
例如 S98875005091

註:僅可使用證券帳號
lstStrategy List<STOStrategy>,
List<MLPStrategy>,
List<OCOStrategy>,
List<SpiderStrategy>,
List<MS_SpiderStrategy>,
List<MS_DayTradeSpiderStrategy>
條件單物件清單 STOStrategy 停損利
MLPStrategy 移動鎖利
OCOStrategy 二擇一
SpiderStrategy 多條件
MS_SpiderStrategy 母子單
MS_DayTradeSpiderStrategy 當沖母子單

註:單次僅能同策略
lng enumLangType 語系 參考列舉物件-語系
預設為 Normal
- Normal:Big5
- UTF8:UTF8
- SC:簡體中文

STOStrategy 停損利單物件

Name Type Description Memo
Account string 帳號 證券:S+分公司代號(4)+帳號(7)
例如 S98875005091
EffTime DateTime 策略起始日 盤中區間限制:當日~90天內
盤後區間限制:下一交易日~90天內
ExpTime DateTime 策略終止日 盤中區間限制:當日~90天內
盤後區間限制:下一交易日~90天內
Order StrategyOrder1 下單方式 參考列舉物件-條件單下單方式1
StrategySettings StrategySettings 條件設定
OrderSettings OrderSettings1<OrderType1,OrderPriceType1> 下單設定 僅提供庫存賣出

MLPStrategy 移動鎖利單物件

Name Type Description Memo
Account string 帳號 證券:S+分公司代號(4)+帳號(7)
例如 S98875005091
EffTime DateTime 策略起始日 盤中區間限制:當日~90天內
盤後區間限制:下一交易日~90天內
ExpTime DateTime 策略終止日 盤中區間限制:當日~90天內
盤後區間限制:下一交易日~90天內
Order StrategyOrder1 下單方式 參考列舉物件-條件單下單方式1
StrategySettings MLPStrategySettings 條件設定
OrderSettings OrderSettings1<OrderType1,OrderPriceType2> 下單設定

OCOStrategy 二擇一單物件

Name Type Description Memo
Account string 帳號 證券:S+分公司代號(4)+帳號(7)
例如 S98875005091
EffTime DateTime 策略起始日 盤中區間限制:當日~90天內

盤後區間限制:下一交易日~90天內
ExpTime DateTime 策略終止日 盤中區間限制:當日~90天內

盤後區間限制:下一交易日~90天內
Order StrategyOrder1 下單方式 參考列舉物件-條件單下單方式1
限輸入:成交就停、觸發就停
StrategySettings1 StrategySettings 條件1條件設定 條件1與條件2 商品需一致
StrategySettings2 StrategySettings 條件2條件設定 條件1與條件2 商品需一致
OrderSettings1 OrderSettings2<OrderType2, OrderPriceType1> 條件1下單設定
OrderSettings2 OrderSettings2<OrderType2, OrderPriceType1> 條件2下單設定

SpiderStrategy 多條件單物件

Name Type Description Memo
Account string 帳號 證券:S+分公司代號(4)+帳號(7)
例如 S98875005091
EffTime DateTime 策略起始日 盤中區間限制:當日~90天內

盤後區間限制:下一交易日~90天內
ExpTime DateTime 策略終止日 盤中區間限制:當日~90天內

盤後區間限制:下一交易日~90天內
Order StrategyOrder1 下單方式 參考列舉物件-條件單下單方式1
Settings SpiderSettings 設定

MS_SpiderStrategy 母子單物件

Name Type Description Memo
Account string 帳號 證券:S+分公司代號(4)+帳號(7)
例如 S98875005091
EffTime DateTime 策略起始日 盤中區間限制:當日~90天內

盤後區間限制:下一交易日~90天內
ExpTime DateTime 策略終止日 盤中區間限制:當日~90天內

盤後區間限制:下一交易日~90天內
Order StrategyOrder2 下單方式 參考列舉物件-條件單下單方式2
限選交易到設定單位全部成交
DayTrade bool 是否當沖 固定false
M_SpiderStrategy SpiderSettings 母單設定
S_SpiderStrategy SpiderSettings 子單設定

MS_DayTradeSpiderStrategy 當沖母子單物件

Name Type Description Memo
Account string 帳號 證券:S+分公司代號(4)+帳號(7)
例如 S98875005091
EffTime DateTime 策略起始日 盤中限填當日(僅當日有效)

盤後限填下一交易日(僅下一交易日當日有效)
ExpTime DateTime 策略終止日 盤中限填當日(僅當日有效)

盤後限填下一交易日(僅下一交易日當日有效)
Order StrategyOrder2 下單方式 參考列舉物件-條件單下單方式2
限選母單成交子單就立即下單
DayTrade bool 是否當沖 固定true
M_SpiderStrategy DayTradeSpiderSettings 母單設定
OrderSettings OrderSettings2<OrderType3, OrderPriceType1> 子單下單設定 僅提供母單反向

StrategySettings 條件設定

Name Type Description Memo
MarketType enumMarketType 市場類別 僅支援上市、上櫃商品
StkCode string 商品代號
Condition StrategyCondition1 條件種類 參考列舉物件-條件單條件1
Direction int 條件方向 1:大於等於

2:小於等於(成交價才可使用)
Value double 條件數值 限制:

成交價(開盤參考價x0.7~1.7倍)

總量(單位:張)

當日漲跌幅(0.01~10)%

MLPStrategySettings 移動鎖利條件設定

Name Type Description Memo
MarketType enumMarketType 市場類別 僅支援上市、上櫃商品
StkCode string 商品代號
Price double 基準價 限制:開盤參考價x0.7~1.7倍
Pullback_Uint int 區間高點回檔單位 1:百分比

2:元
Pullback_Value double 區間高點回檔數值 百分比:0.1~100%

元:0.01<=設定值<=開盤參考價

OrderSettings1<T,T1> 下單設定1

Name Type Description Memo
OrderType T 委託種類 停損利、移動鎖利:OrderType1
參考列舉物件-委託種類
TimeInforce int 委託時間效期 0:ROD

3:IOC

4:FOK
PriceType T1 委託價格種類 停損利:OrderPriceType1

移動鎖利:OrderPriceType2

參考列舉物件-委託價格種類
OrderValue double 委託數值 非限價、成交價請填0

限制:
限價(開盤參考價x0.7~1.7倍)

成交價(+-0~8)tick
OrderQty int 委託單位

OrderSettings2<T,T1> 下單設定2

Name Type Description Memo
MarketType enumMarketType 市場類別 僅支援上市、上櫃商品
StkCode string 商品代號
OrderType T 委託種類 二擇一、多條件、母子單:OrderType2

當沖母子單:OrderType3

參考列舉物件-委託種類
TimeInforce int 委託時間效期 0:ROD

3:IOC

4:FOK
PriceType T1 委託價格種類 OrderPriceType1
參考列舉物件-委託價格種類
OrderValue double 委託數值 非限價、成交價請填0

限制:

限價(開盤參考價x0.7~1.7倍)

成交價(+-0~8)tick
OrderQty int 委託單位

SpiderSettings 多條件設定

Name Type Description Memo
lstSettings List<SpiderStrategySettings> 條件設定 *最多8個、不得為0個
*同商品同種類同方向不可重複

*當全部符合:同商品漲與跌不可同時設定
1.當日漲幅、當日跌幅不可同時設定

2.總漲幅、總跌幅不可同時設定

3.當日漲停、當日跌停不可同時設定
4.當日上漲、當日下跌不可同時設定
OrderSettings OrderSettings2<OrderType2, OrderPriceType1> 下單設定
Eligible int 符合條件 1:擇一符合

2:全部符合

DayTradeSpiderSettings 當沖條件設定

Name Type Description Memo
lstSettings List<SpiderStrategySettings> 條件設定 *最多8個、不得為0個
*同商品同種類同方向不可重複

*當全部符合:同商品漲與跌不可同時設定
1.當日漲幅、當日跌幅不可同時設定

2.總漲幅、總跌幅不可同時設定

3.當日漲停、當日跌停不可同時設定
4.當日上漲、當日下跌不可同時設定
OrderSettings OrderSettings2<OrderType3, OrderPriceType1> 下單設定
Eligible int 符合條件 1:擇一符合

2:全部符合

SpiderStrategySettings 多條件條件設定

Name Type Description Memo
MarketType enumMarketType 市場類別 僅支援上市、上櫃商品
StkCode string 商品代號
StrategyConditions StrategyCondition2 條件種類 參考列舉物件-條件單條件2
Direction int 條件方向 1:大於等於

2:小於等於(成交價才可使用)

3:無(漲停或跌停)
Price double 基準價 條件種類非總漲幅、總跌幅填0
限制:開盤參考價0.7~1.7倍
Value double 條件數值 當日漲停、當日跌停填0

限制:

成交價(現價0.7~1.7倍)

總量(單位:張)

當日漲跌幅(0.01~10)%

總漲跌幅(0.01~100)%

當日上漲下跌(0.01~9999)

Output Parameters

OrderStrategyResult 條件單委託結果

Name Type Description Memo
ResultList List<OrderStrategyStatus> 條件單委託結果清單

OrderStrategyStatus 條件單委託狀態

Name Type Description Memo
OrdStatus SStatus 委託狀態 參考列舉物件-策略狀態
OrderNo String 委託編號
EffTime DateTime 策略起始日
ExpTime DateTime 策略終止日
Msg string 訊息中文

範例 (停損利)

引用元件

import os, time, datetime, struct, pathlib, sys
from datetime import datetime
from pathlib import Path
from pythonnet import load

load("coreclr")
import clr, System

##透過Clr引用系統標準函式
clr.AddReference('System.Collections')
from System.Collections.Generic import List

##宣告增加模組、DLL的路徑(windows可抓取當前路徑 Linux跟MAC需指定路徑)
sys.path.append(Path(pathlib.Path(__file__).parent.resolve()))
if sys.platform == "win32":
    os.add_dll_directory(Path(pathlib.Path(__file__).parent.resolve()))

##透過Clr引用YuantaSparkAPI.dll
##pythonnet引用元件不用加附檔名
try:
    clr.AddReference("YuantaSparkAPI")
except Exception as e:
    print(f"Error loading YuantaSparkAPI: {e}")
from YuantaOneAPI import (YuantaSparkAPITrader, enumLogType, 
                        enumMarketType, enumEnvironmentMode,
                        STOStrategy, StrategyOrder1, StrategySettings, StrategyCondition1, OrderSettings1, 
                        OrderType1, OrderPriceType1)

# 建立 API 物件
objYuantaSparkAPI = YuantaSparkAPITrader()
objYuantaSparkAPI.SetLogType(enumLogType.COMMON)
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using YuantaOneAPI;

YuantaSparkAPITrader objYuantaSparkAPI = new YuantaSparkAPITrader();
string Account = "S98875005091";
string Password = "1234";
enumEnvironmentMode enumEvenMode = enumEnvironmentMode.UAT;

objYuantaSparkAPI.OnResponse += objApi_OnResponse;
objYuantaSparkAPI.SetLogType(enumLogType.ALL);

objYuantaSparkAPI.Open(enumEvenMode);
Thread.Sleep(1000);

objYuantaSparkAPI.Login(Account, Password);
Thread.Sleep(1000);

// 條件單 STO
List<STOStrategy> lstSTO = new List<STOStrategy>();
lstSTO.Add(new STOStrategy
{
    Account = Account,
    EffTime = new DateTime(2026, 4, 3),
    ExpTime = new DateTime(2026, 4, 30),
    Order = (StrategyOrder1)2,  
    StrategySettings = new StrategySettings
    {
        MarketType = enumMarketType.TWSE,
        StkCode = "2885",
        Condition = (StrategyCondition1)1,  
        Direction = 1,
        Value = 46.2
    },
    OrderSettings = new OrderSettings1<OrderType1, OrderPriceType1>
    {
        OrderType = (OrderType1)2,  
        TimeInforce = 0,
        PriceType = (OrderPriceType1)0,  
        OrderValue = 46.2,
        OrderQty = 10
    }
});

objYuantaSparkAPI.SendAlgoCOOdrStrategy(Account, lstSTO);
Thread.Sleep(2000);

Onresponse

def on_response(intMark, dwIndex, strIndex, objHandle, objValue):
    try:
        result = ''
        match intMark:
            case 0:  # 系統回應資訊
                result = str(objValue)
            case 1:  # 查詢回應資訊
                match strIndex:
                    case 'Login':
                        loginResult = objValue
                        status = loginResult.LoginStatus
                        strMsgCode = status.MsgCode # 訊息代碼
                        strMsgContent = status.MsgContent # 訊息內容
                        intCount = status.Count # 筆數
                        result = '{0},{1},帳號筆數:{2}\r\n'.format(strMsgCode,strMsgContent, str(intCount))
                        if strMsgCode == '0001' or strMsgCode == '00001' or intCount > 0 :
                            for i in objValue.LoginList:
                                result += f"{i.Account},{i.Name},{i.InvestorID},{i.SellerNo}\n"

                    case 'SendAlgoCOOdrStrategy':
                        SResult = objValue
                        sResult = SResult.ResultList

                        result = ''
                        result += "新增條件單:\r\n"

                        for i in range(sResult.Count):  
                            result += '{0},{1},{2},{3},{4}\r\n'.format(sResult[i].OrdStatus,sResult[i].OrderNo,sResult[i].EffTime,sResult[i].ExpTime,sResult[i].Msg)

        if result:
            print('##================================================##\n')
            print(result)

    except Exception as error:
        print(f"處理回應時發生錯誤: {error}")

objYuantaSparkAPI.OnResponse += on_response
#測試環境帳號:UAT 正式環境:PROD
objYuantaSparkAPI.Open(enumEnvironmentMode.UAT)
time.sleep(2)

objYuantaSparkAPI.Login('S98875005091', '1234')
time.sleep(2)

sto_list  = List[STOStrategy]()
sto_obj = STOStrategy()
sto_obj.Account = "S98875005091"
sto_obj.EffTime =  System.DateTime(2026, 3, 31)
sto_obj.ExpTime =  System.DateTime(2026, 4, 30)
sto_obj.Order = StrategyOrder1(2)

sto_obj.StrategySettings = StrategySettings() 
sto_obj.StrategySettings.MarketType = enumMarketType.TWSE
sto_obj.StrategySettings.StkCode = "2885"
sto_obj.StrategySettings.Condition = StrategyCondition1(1)
sto_obj.StrategySettings.Direction = 1
sto_obj.StrategySettings.Value = 46.2

sto_obj.OrderSettings = OrderSettings1[OrderType1, OrderPriceType1]()
sto_obj.OrderSettings.OrderType = OrderType1(2)
sto_obj.OrderSettings.TimeInforce = 0
sto_obj.OrderSettings.PriceType = OrderPriceType1(0)    # 限價:0
sto_obj.OrderSettings.OrderValue = 46.2
sto_obj.OrderSettings.OrderQty = 10

sto_list.Add(sto_obj)
objYuantaSparkAPI.SendAlgoCOOdrStrategy[STOStrategy]('S98875005091',sto_list)  
time.sleep(1)

# 保持程式運行
while True:
    time.sleep(2)
void objApi_OnResponse(int intMark, uint dwIndex, string strIndex, object objHandle, object objValue)
{
    try
    {
        string strResult = "";
        if (intMark == 0)
        {
            Console.WriteLine(Convert.ToString(objValue));
            return;
        }

        if (intMark == 1)
        {
            if (strIndex == "Login")
            {
                var result = (LoginResult)objValue;

                string strMsgCode = result.LoginStatus.MsgCode;
                string strMsgContent = result.LoginStatus.MsgContent;
                int intCount = result.LoginStatus.Count;

                strResult += $"{strMsgCode}, {strMsgContent}{Environment.NewLine}";
                if (strMsgCode == "0001" || strMsgCode == "00001")
                {
                    strResult += $"帳號筆數: {intCount.ToString()}{Environment.NewLine}";
                    result.LoginList.ForEach(r => strResult += $"{r.Account},{r.Name},{r.InvestorID},{r.SellerNo}\r\n");
                }
                else
                {
                    Account = "";
                }

                Console.WriteLine("\n======================");
                Console.WriteLine(strResult.ToString());
                Console.WriteLine("======================\n");
                return;
            }

            if (strIndex == "SendAlgoCOOdrStrategy")
            {
                var result = (OrderStrategyResult)objValue;
                try
                {
                    strResult += "新增條件單:\r\n";
                    result.ResultList?.ForEach(r =>
                    {
                        strResult += $"{r.OrdStatus} {r.OrderNo} {r.EffTime:yyyy/MM/dd} {r.ExpTime:yyyy/MM/dd} {r.Msg}\r\n";
                    });
                }
                catch
                {
                    strResult = "";
                }

                Console.WriteLine("\n======================");
                Console.WriteLine(strResult);
                Console.WriteLine("======================\n");
                return;
            }
        }
        Console.WriteLine($"[{strIndex}] {Convert.ToString(objValue)}");
    }
    catch (Exception exc)
    {
        Console.WriteLine("OnResponse Error: " + exc.Message);
    }
}

Response Body

{
  "Result": {
    "ResultList": [
      {
        "OrdStatus": "SstBuilt",
        "OrderNo": "k263R000000056",
        "EffTime": "2026/04/03",
        "ExpTime": "2026/04/30",
        "Msg": "策略已建立"
      }
    ]
  }
}

範例 (移動鎖利)

引用元件

import os, time, datetime, struct, pathlib, sys
from datetime import datetime
from pathlib import Path
from pythonnet import load

load("coreclr")
import clr, System

##透過Clr引用系統標準函式
clr.AddReference('System.Collections')
from System.Collections.Generic import List

##宣告增加模組、DLL的路徑(windows可抓取當前路徑 Linux跟MAC需指定路徑)
sys.path.append(Path(pathlib.Path(__file__).parent.resolve()))
if sys.platform == "win32":
    os.add_dll_directory(Path(pathlib.Path(__file__).parent.resolve()))

##透過Clr引用YuantaSparkAPI.dll
##pythonnet引用元件不用加附檔名
try:
    clr.AddReference("YuantaSparkAPI")
except Exception as e:
    print(f"Error loading YuantaSparkAPI: {e}")
from YuantaOneAPI import (YuantaSparkAPITrader, enumLogType, 
                        enumMarketType, enumEnvironmentMode, enumStkTickSelectType, 
                        StrategyOrder1, MLPStrategySettings, OrderSettings1, OrderType1, OrderPriceType2, MLPStrategy)

# 建立 API 物件
objYuantaSparkAPI = YuantaSparkAPITrader()
objYuantaSparkAPI.SetLogType(enumLogType.COMMON)
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using YuantaOneAPI;

YuantaSparkAPITrader objYuantaSparkAPI = new YuantaSparkAPITrader();
string Account = "S98875005091";
string Password = "1234";
enumEnvironmentMode enumEvenMode = enumEnvironmentMode.UAT;

objYuantaSparkAPI.OnResponse += objApi_OnResponse;
objYuantaSparkAPI.SetLogType(enumLogType.ALL);

objYuantaSparkAPI.Open(enumEvenMode);
Thread.Sleep(1000);

objYuantaSparkAPI.Login(Account, Password);
Thread.Sleep(1000);

// 移動損利單 MLP
List<MLPStrategy> lstMLP = new List<MLPStrategy>();
lstMLP.Add(new MLPStrategy
{
    Account = Account,
    EffTime = new DateTime(2026, 4, 2),
    ExpTime = new DateTime(2026, 4, 30),
    Order = (StrategyOrder1)2,  // StrategyOrder1(2) = 觸發就停
    StrategySettings = new MLPStrategySettings
    {
        MarketType = enumMarketType.TWSE,
        StkCode = "2885",
        Price = 46.5,               // 基準價
        Pullback_Uint = 2,          // 區間高點回檔單位  1:百分比 2:元
        Pullback_Value = 0.5        // 區間高點回檔數值
    },
    OrderSettings = new OrderSettings1<OrderType1, OrderPriceType2>
    {
        OrderType = (OrderType1)2,          // OrderType1(2)
        TimeInforce = 0,
        PriceType = (OrderPriceType2)1,     // OrderPriceType2(1) 市價
        OrderValue = 0,
        OrderQty = 5
    }
});

objYuantaSparkAPI.SendAlgoCOOdrStrategy(Account, lstMLP);
Thread.Sleep(2000);

Onresponse

def on_response(intMark, dwIndex, strIndex, objHandle, objValue):
    try:
        result = ''
        match intMark:
            case 0:  # 系統回應資訊
                result = str(objValue)
            case 1:  # 查詢回應資訊
                match strIndex:
                    case 'Login':
                        loginResult = objValue
                        status = loginResult.LoginStatus
                        strMsgCode = status.MsgCode # 訊息代碼
                        strMsgContent = status.MsgContent # 訊息內容
                        intCount = status.Count # 筆數
                        result = '{0},{1},帳號筆數:{2}\r\n'.format(strMsgCode,strMsgContent, str(intCount))
                        if strMsgCode == '0001' or strMsgCode == '00001' or intCount > 0 :
                            for i in objValue.LoginList:
                                result += f"{i.Account},{i.Name},{i.InvestorID},{i.SellerNo}\n"

                    case 'SendAlgoCOOdrStrategy':
                        SResult = objValue
                        sResult = SResult.ResultList

                        result = ''
                        result += "新增條件單:\r\n"

                        for i in range(sResult.Count):  
                            result += '{0},{1},{2},{3},{4}\r\n'.format(sResult[i].OrdStatus,sResult[i].OrderNo,sResult[i].EffTime,sResult[i].ExpTime,sResult[i].Msg)

        if result:
            print('##================================================##\n')
            print(result)

    except Exception as error:
        print(f"處理回應時發生錯誤: {error}")

objYuantaSparkAPI.OnResponse += on_response
#測試環境帳號:UAT 正式環境:PROD
objYuantaSparkAPI.Open(enumEnvironmentMode.UAT)
time.sleep(2)

objYuantaSparkAPI.Login('S98875005091', '1234')
time.sleep(2)

mlp_list  = List[MLPStrategy]()
mlp_obj = MLPStrategy()

mlp_obj.Account = "S98875005091"
mlp_obj.EffTime =  System.DateTime(2026, 4, 1)
mlp_obj.ExpTime =  System.DateTime(2026, 4, 31)
mlp_obj.Order = StrategyOrder1(2)

mlp_obj.StrategySettings = MLPStrategySettings() 
mlp_obj.StrategySettings.MarketType = enumMarketType.TWSE
mlp_obj.StrategySettings.StkCode = "2885"
mlp_obj.StrategySettings.Price = 46.5                  # 基準價
mlp_obj.StrategySettings.Pullback_Uint = 2             # 區間高點回檔單位  1:百分比 2:元 
mlp_obj.StrategySettings.Pullback_Value = 0.5          # 區間高點回檔數值

mlp_obj.OrderSettings = OrderSettings1[OrderType1, OrderPriceType2]()
mlp_obj.OrderSettings.OrderType = OrderType1(2)
mlp_obj.OrderSettings.TimeInforce = 0
mlp_obj.OrderSettings.PriceType = OrderPriceType2(1)    #限價:0  市價:1 成交價:2 漲停:3 平盤:4 跌停:5 
mlp_obj.OrderSettings.OrderValue = 0
mlp_obj.OrderSettings.OrderQty = 5

mlp_list.Add(mlp_obj)
objYuantaSparkAPI.SendAlgoCOOdrStrategy[MLPStrategy]('S98875005091', mlp_list)
time.sleep(1)

# 保持程式運行
while True:
    time.sleep(2)
void objApi_OnResponse(int intMark, uint dwIndex, string strIndex, object objHandle, object objValue)
{
    try
    {
        string strResult = "";
        if (intMark == 0)
        {
            Console.WriteLine(Convert.ToString(objValue));
            return;
        }

        if (intMark == 1)
        {
            if (strIndex == "Login")
            {
                var result = (LoginResult)objValue;

                string strMsgCode = result.LoginStatus.MsgCode;
                string strMsgContent = result.LoginStatus.MsgContent;
                int intCount = result.LoginStatus.Count;

                strResult += $"{strMsgCode}, {strMsgContent}{Environment.NewLine}";
                if (strMsgCode == "0001" || strMsgCode == "00001")
                {
                    strResult += $"帳號筆數: {intCount.ToString()}{Environment.NewLine}";
                    result.LoginList.ForEach(r => strResult += $"{r.Account},{r.Name},{r.InvestorID},{r.SellerNo}\r\n");
                }
                else
                {
                    Account = "";
                }

                Console.WriteLine("\n======================");
                Console.WriteLine(strResult.ToString());
                Console.WriteLine("======================\n");
                return;
            }

            if (strIndex == "SendAlgoCOOdrStrategy")
            {
                var result = (OrderStrategyResult)objValue;
                try
                {
                    strResult += "新增條件單:\r\n";
                    result.ResultList?.ForEach(r =>
                    {
                        strResult += $"{r.OrdStatus} {r.OrderNo} {r.EffTime:yyyy/MM/dd} {r.ExpTime:yyyy/MM/dd} {r.Msg}\r\n";
                    });
                }
                catch
                {
                    strResult = "";
                }

                Console.WriteLine("\n======================");
                Console.WriteLine(strResult);
                Console.WriteLine("======================\n");
                return;
            }
        }
        Console.WriteLine($"[{strIndex}] {Convert.ToString(objValue)}");
    }
    catch (Exception exc)
    {
        Console.WriteLine("OnResponse Error: " + exc.Message);
    }
}

範例 (二擇一)

引用元件

import os, time, datetime, struct, pathlib, sys
from datetime import datetime
from pathlib import Path
from pythonnet import load

load("coreclr")
import clr, System

##透過Clr引用系統標準函式
clr.AddReference('System.Collections')
from System.Collections.Generic import List

##宣告增加模組、DLL的路徑(windows可抓取當前路徑 Linux跟MAC需指定路徑)
sys.path.append(Path(pathlib.Path(__file__).parent.resolve()))
if sys.platform == "win32":
    os.add_dll_directory(Path(pathlib.Path(__file__).parent.resolve()))

##透過Clr引用YuantaSparkAPI.dll
##pythonnet引用元件不用加附檔名
try:
    clr.AddReference("YuantaSparkAPI")
except Exception as e:
    print(f"Error loading YuantaSparkAPI: {e}")
from YuantaOneAPI import (YuantaSparkAPITrader, enumLogType, 
                        enumMarketType, enumEnvironmentMode, 
                        StrategyOrder1,StrategyCondition1, OCOStrategy, StrategySettings, OrderSettings2, OrderType2, OrderPriceType1)

# 建立 API 物件
objYuantaSparkAPI = YuantaSparkAPITrader()
objYuantaSparkAPI.SetLogType(enumLogType.COMMON)
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using YuantaOneAPI;

YuantaSparkAPITrader objYuantaSparkAPI = new YuantaSparkAPITrader();
string Account = "S98875005091";
string Password = "1234";
enumEnvironmentMode enumEvenMode = enumEnvironmentMode.UAT;

objYuantaSparkAPI.OnResponse += objApi_OnResponse;
objYuantaSparkAPI.SetLogType(enumLogType.ALL);

objYuantaSparkAPI.Open(enumEvenMode);
Thread.Sleep(1000);

objYuantaSparkAPI.Login(Account, Password);
Thread.Sleep(1000);

// 二擇一單 OCO
List<OCOStrategy> lstOCO = new List<OCOStrategy>();
lstOCO.Add(new OCOStrategy
{
    Account = Account,
    EffTime = new DateTime(2026, 4, 2),
    ExpTime = new DateTime(2026, 4, 30),
    Order = (StrategyOrder1)1,          // 成交就停:1 觸發就停:2

    // 條件1:止盈
    StrategySettings1 = new StrategySettings
    {
        MarketType = enumMarketType.TWSE,
        StkCode = "2885",
        Condition = (StrategyCondition1)1,  // 成交價:1
        Direction = 1,                      // 大於等於
        Value = 46.7
    },

    // 條件2:止損
    StrategySettings2 = new StrategySettings
    {
        MarketType = enumMarketType.TWSE,
        StkCode = "2885",
        Condition = (StrategyCondition1)1,  // 成交價:1
        Direction = 2,                      // 小於等於
        Value = 45.5
    },

    // 條件1下單:止盈下單
    OrderSettings1 = new OrderSettings2<OrderType2, OrderPriceType1>
    {
        MarketType = enumMarketType.TWSE,
        StkCode = "2885",
        OrderType = (OrderType2)2,          // 現股賣出:2
        TimeInforce = 0,
        PriceType = (OrderPriceType1)0,     // 限價:0 市價:1
        OrderValue = 46.7,
        OrderQty = 1
    },

    // 條件2下單:止損下單
    OrderSettings2 = new OrderSettings2<OrderType2, OrderPriceType1>
    {
        MarketType = enumMarketType.TWSE,
        StkCode = "2885",
        OrderType = (OrderType2)2,          // 現股賣出:2
        TimeInforce = 0,
        PriceType = (OrderPriceType1)0,     // 限價:0 市價:1
        OrderValue = 45.5,
        OrderQty = 1
    }
});

objYuantaSparkAPI.SendAlgoCOOdrStrategy(Account, lstOCO);
Thread.Sleep(2000);

Onresponse

def on_response(intMark, dwIndex, strIndex, objHandle, objValue):
    try:
        result = ''
        match intMark:
            case 0:  # 系統回應資訊
                result = str(objValue)
            case 1:  # 查詢回應資訊
                match strIndex:
                    case 'Login':
                        loginResult = objValue
                        status = loginResult.LoginStatus
                        strMsgCode = status.MsgCode # 訊息代碼
                        strMsgContent = status.MsgContent # 訊息內容
                        intCount = status.Count # 筆數
                        result = '{0},{1},帳號筆數:{2}\r\n'.format(strMsgCode,strMsgContent, str(intCount))
                        if strMsgCode == '0001' or strMsgCode == '00001' or intCount > 0 :
                            for i in objValue.LoginList:
                                result += f"{i.Account},{i.Name},{i.InvestorID},{i.SellerNo}\n"

                    case 'SendAlgoCOOdrStrategy':
                        SResult = objValue
                        sResult = SResult.ResultList

                        result = ''
                        result += "新增條件單:\r\n"

                        for i in range(sResult.Count):  
                            result += '{0},{1},{2},{3},{4}\r\n'.format(sResult[i].OrdStatus,sResult[i].OrderNo,sResult[i].EffTime,sResult[i].ExpTime,sResult[i].Msg)

        if result:
            print('##================================================##\n')
            print(result)

    except Exception as error:
        print(f"處理回應時發生錯誤: {error}")

objYuantaSparkAPI.OnResponse += on_response
#測試環境帳號:UAT 正式環境:PROD
objYuantaSparkAPI.Open(enumEnvironmentMode.UAT)
time.sleep(2)

objYuantaSparkAPI.Login('S98875005091', '1234')
time.sleep(2)

oco_list  = List[OCOStrategy]()
oco_obj = OCOStrategy()

oco_obj.Account = "S98875005091"
oco_obj.EffTime =  System.DateTime(2026, 4, 1)
oco_obj.ExpTime =  System.DateTime(2026, 4, 31)
oco_obj.Order = StrategyOrder1(1)       # 限輸入:成交就停、觸發就停 ,成交就停:1 觸發就停:2

#條件1:止盈
oco_obj.StrategySettings1 = StrategySettings() 
profit_cond = oco_obj.StrategySettings1 
profit_cond.MarketType = enumMarketType.TWSE
profit_cond.StkCode = "2885"
profit_cond.Condition = StrategyCondition1(1)
profit_cond.Direction = 1       # 大於等於
profit_cond.Value = 46.7

#條件2:止損
oco_obj.StrategySettings2 = StrategySettings() 
loss_cond = oco_obj.StrategySettings2 
loss_cond.MarketType = enumMarketType.TWSE
loss_cond.StkCode = "2885"
loss_cond.Condition = StrategyCondition1(1)
loss_cond.Direction = 2         # 小於等於
loss_cond.Value = 45.5

#條件1:止盈下單
oco_obj.OrderSettings1 = OrderSettings2[OrderType2, OrderPriceType1]()
profit_order = oco_obj.OrderSettings1 
profit_order.MarketType = enumMarketType.TWSE
profit_order.StkCode = "2885"
profit_order.OrderType = OrderType2(2)              # 現股賣出:2
profit_order.TimeInforce = 0
profit_order.PriceType = OrderPriceType1(0)         # 限價:0 市價 :1
profit_order.OrderValue = 46.7
profit_order.OrderQty = 1
#條件2:止損下單
oco_obj.OrderSettings2 = OrderSettings2[OrderType2, OrderPriceType1]()
loss_order = oco_obj.OrderSettings2
loss_order.MarketType = enumMarketType.TWSE
loss_order.StkCode = "2885"
loss_order.OrderType = OrderType2(2)                # 現股賣出:2
loss_order.TimeInforce = 0
loss_order.PriceType = OrderPriceType1(0)           # 限價:0 市價 :1
loss_order.OrderValue = 45.5
loss_order.OrderQty = 1
oco_list.Add(oco_obj)

objYuantaSparkAPI.SendAlgoCOOdrStrategy[OCOStrategy]('S98875005091', oco_list)
time.sleep(1)

# 保持程式運行
while True:
    time.sleep(2)
void objApi_OnResponse(int intMark, uint dwIndex, string strIndex, object objHandle, object objValue)
{
    try
    {
        string strResult = "";
        if (intMark == 0)
        {
            Console.WriteLine(Convert.ToString(objValue));
            return;
        }

        if (intMark == 1)
        {
            if (strIndex == "Login")
            {
                var result = (LoginResult)objValue;

                string strMsgCode = result.LoginStatus.MsgCode;
                string strMsgContent = result.LoginStatus.MsgContent;
                int intCount = result.LoginStatus.Count;

                strResult += $"{strMsgCode}, {strMsgContent}{Environment.NewLine}";
                if (strMsgCode == "0001" || strMsgCode == "00001")
                {
                    strResult += $"帳號筆數: {intCount.ToString()}{Environment.NewLine}";
                    result.LoginList.ForEach(r => strResult += $"{r.Account},{r.Name},{r.InvestorID},{r.SellerNo}\r\n");
                }
                else
                {
                    Account = "";
                }

                Console.WriteLine("\n======================");
                Console.WriteLine(strResult.ToString());
                Console.WriteLine("======================\n");
                return;
            }

            if (strIndex == "SendAlgoCOOdrStrategy")
            {
                var result = (OrderStrategyResult)objValue;
                try
                {
                    strResult += "新增條件單:\r\n";
                    result.ResultList?.ForEach(r =>
                    {
                        strResult += $"{r.OrdStatus} {r.OrderNo} {r.EffTime:yyyy/MM/dd} {r.ExpTime:yyyy/MM/dd} {r.Msg}\r\n";
                    });
                }
                catch
                {
                    strResult = "";
                }

                Console.WriteLine("\n======================");
                Console.WriteLine(strResult);
                Console.WriteLine("======================\n");
                return;
            }
        }
        Console.WriteLine($"[{strIndex}] {Convert.ToString(objValue)}");
    }
    catch (Exception exc)
    {
        Console.WriteLine("OnResponse Error: " + exc.Message);
    }
}

Response Body

{
  "Result": {
    "ResultList": [
      {
        "OrdStatus": "SstBuilt",
        "OrderNo": "k263R000000056",
        "EffTime": "2026/04/03",
        "ExpTime": "2026/04/30",
        "Msg": "策略已建立"
      }
    ]
  }
}

範例 (多條件)

引用元件

import os, time, datetime, struct, pathlib, sys
from datetime import datetime
from pathlib import Path
from pythonnet import load

load("coreclr")
import clr, System

##透過Clr引用系統標準函式
clr.AddReference('System.Collections')
from System.Collections.Generic import List

##宣告增加模組、DLL的路徑(windows可抓取當前路徑 Linux跟MAC需指定路徑)
sys.path.append(Path(pathlib.Path(__file__).parent.resolve()))
if sys.platform == "win32":
    os.add_dll_directory(Path(pathlib.Path(__file__).parent.resolve()))

##透過Clr引用YuantaSparkAPI.dll
##pythonnet引用元件不用加附檔名
try:
    clr.AddReference("YuantaSparkAPI")
except Exception as e:
    print(f"Error loading YuantaSparkAPI: {e}")
from YuantaOneAPI import (YuantaSparkAPITrader, enumLogType, 
                        enumMarketType, enumEnvironmentMode, enumStkTickSelectType, 
                        SpiderStrategy, SpiderSettings, SpiderStrategySettings, StrategyCondition2, StrategyOrder1, OrderSettings2, OrderType2, OrderPriceType1)

# 建立 API 物件
objYuantaSparkAPI = YuantaSparkAPITrader()
objYuantaSparkAPI.SetLogType(enumLogType.COMMON)
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using YuantaOneAPI;

YuantaSparkAPITrader objYuantaSparkAPI = new YuantaSparkAPITrader();
string Account = "S98875005091";
string Password = "1234";
enumEnvironmentMode enumEvenMode = enumEnvironmentMode.UAT;

objYuantaSparkAPI.OnResponse += objApi_OnResponse;
objYuantaSparkAPI.SetLogType(enumLogType.ALL);

objYuantaSparkAPI.Open(enumEvenMode);
Thread.Sleep(1000);

objYuantaSparkAPI.Login(Account, Password);
Thread.Sleep(1000);

// 多條件單 Spider
List<SpiderStrategySettings> lstSettings = new List<SpiderStrategySettings>();

// 條件1:成交價 >= 47.0
lstSettings.Add(new SpiderStrategySettings
{
    MarketType = enumMarketType.TWSE,
    StkCode = "2885",
    StrategyConditions = (StrategyCondition2)1,  // 成交價:1
    Direction = 1,                                // 大於等於:1
    Price = 0,                                    // 非總漲跌幅填 0
    Value = 47.0
});

// 條件2:當日漲幅 >= 1%
lstSettings.Add(new SpiderStrategySettings
{
    MarketType = enumMarketType.TWSE,
    StkCode = "2885",
    StrategyConditions = (StrategyCondition2)3,  // 當日漲幅:3
    Direction = 1,                                // 大於等於:1
    Price = 0,                                    // 非總漲跌幅填 0
    Value = 1                                     // 當日漲跌幅(0.01~10)%
});

List<SpiderStrategy> lstSpider = new List<SpiderStrategy>();
lstSpider.Add(new SpiderStrategy
{
    Account = Account,
    EffTime = new DateTime(2026, 4, 2),
    ExpTime = new DateTime(2026, 4, 30),
    Order = (StrategyOrder1)1,              // 成交就停:1
    Settings = new SpiderSettings
    {
        Eligible = 2,                       // 1:擇一符合 2:全部符合
        lstSettings = lstSettings,
        OrderSettings = new OrderSettings2<OrderType2, OrderPriceType1>
        {
            MarketType = enumMarketType.TWSE,
            StkCode = "2885",
            OrderType = (OrderType2)1,      // 現股買進:1
            TimeInforce = 0,
            PriceType = (OrderPriceType1)1, // 市價:1
            OrderValue = 0,
            OrderQty = 2
        }
    }
});

objYuantaSparkAPI.SendAlgoCOOdrStrategy(Account, lstSpider);
Thread.Sleep(2000);

Onresponse

def on_response(intMark, dwIndex, strIndex, objHandle, objValue):
    try:
        result = ''
        match intMark:
            case 0:  # 系統回應資訊
                result = str(objValue)
            case 1:  # 查詢回應資訊
                match strIndex:
                    case 'Login':
                        loginResult = objValue
                        status = loginResult.LoginStatus
                        strMsgCode = status.MsgCode # 訊息代碼
                        strMsgContent = status.MsgContent # 訊息內容
                        intCount = status.Count # 筆數
                        result = '{0},{1},帳號筆數:{2}\r\n'.format(strMsgCode,strMsgContent, str(intCount))
                        if strMsgCode == '0001' or strMsgCode == '00001' or intCount > 0 :
                            for i in objValue.LoginList:
                                result += f"{i.Account},{i.Name},{i.InvestorID},{i.SellerNo}\n"

                    case 'SendAlgoCOOdrStrategy':
                        SResult = objValue
                        sResult = SResult.ResultList

                        result = ''
                        result += "新增條件單:\r\n"

                        for i in range(sResult.Count):  
                            result += '{0},{1},{2},{3},{4}\r\n'.format(sResult[i].OrdStatus,sResult[i].OrderNo,sResult[i].EffTime,sResult[i].ExpTime,sResult[i].Msg)

        if result:
            print('##================================================##\n')
            print(result)

    except Exception as error:
        print(f"處理回應時發生錯誤: {error}")

objYuantaSparkAPI.OnResponse += on_response
#測試環境帳號:UAT 正式環境:PROD
objYuantaSparkAPI.Open(enumEnvironmentMode.UAT)
time.sleep(2)

objYuantaSparkAPI.Login('S98875005091', '1234')
time.sleep(2)

spider_list  = List[SpiderStrategy]()
spider_obj = SpiderStrategy()

spider_obj.Account = "S98875005091"
spider_obj.EffTime =  System.DateTime(2026, 4, 1)
spider_obj.ExpTime =  System.DateTime(2026, 4, 31)
spider_obj.Order = StrategyOrder1(1)

spider_obj.Settings = SpiderSettings()              #下單設定

lstSettings =  List[SpiderStrategySettings]()
#條件1
cond_1 = SpiderStrategySettings()
cond_1.MarketType = enumMarketType.TWSE       
cond_1.StkCode = "2885"                         
cond_1.StrategyConditions = StrategyCondition2(1)   # 成交價
cond_1.Direction = 1                            # 1:大於等於 2:小於等於(成交價才可使用) 3:無(漲停或跌停) 
cond_1.Price = 0                                # 非總漲跌幅填 0
cond_1.Value = 47.0                                 # 觸發數值
#條件2
cond_2 = SpiderStrategySettings()
cond_2.MarketType = enumMarketType.TWSE             # 上市
cond_2.StkCode = "2885"                             # 商品代號
cond_2.StrategyConditions = StrategyCondition2(3)   # 當日漲幅:3
cond_2.Direction = 1                                # 1:大於等於 2:小於等於(成交價才可使用) 3:無(漲停或跌停) 
cond_2.Price = 0                                    # 非總漲跌幅填 0
cond_2.Value = 1                                    # 當日漲跌幅(0.01~10)%

lstSettings.Add(cond_1)
lstSettings.Add(cond_2)
spider_obj.Settings.lstSettings = lstSettings

spider_obj.Settings.OrderSettings = OrderSettings2[OrderType2, OrderPriceType1]()
s_order = spider_obj.Settings.OrderSettings
s_order.MarketType = enumMarketType.TWSE
s_order.StkCode = "2885" 
s_order.OrderType = OrderType2(1)
s_order.TimeInforce = 0
s_order.PriceType = OrderPriceType1(1)  #OrderPriceType1 1:市價
s_order.OrderValue = 0
s_order.OrderQty = 2

spider_obj.Settings.Eligible = 2 # 1:擇一符合 2:全部符合

spider_list.Add(spider_obj)
objYuantaSparkAPI.SendAlgoCOOdrStrategy[SpiderStrategy]('S98875005091', spider_list)
time.sleep(1)

# 保持程式運行
while True:
    time.sleep(2)
void objApi_OnResponse(int intMark, uint dwIndex, string strIndex, object objHandle, object objValue)
{
    try
    {
        string strResult = "";
        if (intMark == 0)
        {
            Console.WriteLine(Convert.ToString(objValue));
            return;
        }

        if (intMark == 1)
        {
            if (strIndex == "Login")
            {
                var result = (LoginResult)objValue;

                string strMsgCode = result.LoginStatus.MsgCode;
                string strMsgContent = result.LoginStatus.MsgContent;
                int intCount = result.LoginStatus.Count;

                strResult += $"{strMsgCode}, {strMsgContent}{Environment.NewLine}";
                if (strMsgCode == "0001" || strMsgCode == "00001")
                {
                    strResult += $"帳號筆數: {intCount.ToString()}{Environment.NewLine}";
                    result.LoginList.ForEach(r => strResult += $"{r.Account},{r.Name},{r.InvestorID},{r.SellerNo}\r\n");
                }
                else
                {
                    Account = "";
                }

                Console.WriteLine("\n======================");
                Console.WriteLine(strResult.ToString());
                Console.WriteLine("======================\n");
                return;
            }

            if (strIndex == "SendAlgoCOOdrStrategy")
            {
                var result = (OrderStrategyResult)objValue;
                try
                {
                    strResult += "新增條件單:\r\n";
                    result.ResultList?.ForEach(r =>
                    {
                        strResult += $"{r.OrdStatus} {r.OrderNo} {r.EffTime:yyyy/MM/dd} {r.ExpTime:yyyy/MM/dd} {r.Msg}\r\n";
                    });
                }
                catch
                {
                    strResult = "";
                }

                Console.WriteLine("\n======================");
                Console.WriteLine(strResult);
                Console.WriteLine("======================\n");
                return;
            }
        }
        Console.WriteLine($"[{strIndex}] {Convert.ToString(objValue)}");
    }
    catch (Exception exc)
    {
        Console.WriteLine("OnResponse Error: " + exc.Message);
    }
}

Response Body

{
  "Result": {
    "ResultList": [
      {
        "OrdStatus": "SstBuilt",
        "OrderNo": "k263R000000056",
        "EffTime": "2026/04/03",
        "ExpTime": "2026/04/30",
        "Msg": "策略已建立"
      }
    ]
  }
}

範例 (母子單)

引用元件

import os, time, datetime, struct, pathlib, sys
from datetime import datetime
from pathlib import Path
from pythonnet import load

load("coreclr")
import clr, System

##透過Clr引用系統標準函式
clr.AddReference('System.Collections')
from System.Collections.Generic import List

##宣告增加模組、DLL的路徑(windows可抓取當前路徑 Linux跟MAC需指定路徑)
sys.path.append(Path(pathlib.Path(__file__).parent.resolve()))
if sys.platform == "win32":
    os.add_dll_directory(Path(pathlib.Path(__file__).parent.resolve()))

##透過Clr引用YuantaSparkAPI.dll
##pythonnet引用元件不用加附檔名
try:
    clr.AddReference("YuantaSparkAPI")
except Exception as e:
    print(f"Error loading YuantaSparkAPI: {e}")
from YuantaOneAPI import (YuantaSparkAPITrader, enumLogType, 
                        enumMarketType, enumEnvironmentMode, enumStkTickSelectType, 
                        MS_SpiderStrategy, SpiderSettings, SpiderStrategySettings, StrategyCondition2, StrategyOrder2, OrderSettings2, OrderType2, OrderPriceType1)

# 建立 API 物件
objYuantaSparkAPI = YuantaSparkAPITrader()
objYuantaSparkAPI.SetLogType(enumLogType.COMMON)
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using YuantaOneAPI;

YuantaSparkAPITrader objYuantaSparkAPI = new YuantaSparkAPITrader();
string Account = "S98875005091";
string Password = "1234";
enumEnvironmentMode enumEvenMode = enumEnvironmentMode.UAT;

objYuantaSparkAPI.OnResponse += objApi_OnResponse;
objYuantaSparkAPI.SetLogType(enumLogType.ALL);

objYuantaSparkAPI.Open(enumEvenMode);
Thread.Sleep(1000);

objYuantaSparkAPI.Login(Account, Password);
Thread.Sleep(1000);

// 母子單 MS_SpiderStrategy
// 母單條件
List<SpiderStrategySettings> lstMSettings = new List<SpiderStrategySettings>();
lstMSettings.Add(new SpiderStrategySettings
{
    MarketType = enumMarketType.TWSE,
    StkCode = "2885",
    StrategyConditions = (StrategyCondition2)1,  // 成交價:1
    Direction = 1,                                // 大於等於:1
    Price = 0,                                    // 非總漲跌幅填 0
    Value = 47.0                                  // 觸發數值
});

// 子單條件
List<SpiderStrategySettings> lstSSettings = new List<SpiderStrategySettings>();
lstSSettings.Add(new SpiderStrategySettings
{
    MarketType = enumMarketType.TWSE,
    StkCode = "2883",
    StrategyConditions = (StrategyCondition2)1,  // 成交價:1
    Direction = 1,                                // 大於等於:1
    Price = 0,                                    // 非總漲跌幅填 0
    Value = 20.4                                  // 觸發數值
});

List<MS_SpiderStrategy> lstMS = new List<MS_SpiderStrategy>();
lstMS.Add(new MS_SpiderStrategy
{
    Account = Account,
    EffTime = new DateTime(2026, 4, 1),
    ExpTime = new DateTime(2026, 4, 30),
    Order = (StrategyOrder2)5,              // 交易到設定單位全部成交:5

    // 母單設定
    M_SpiderStrategy = new SpiderSettings
    {
        Eligible = 1,                       // 1:擇一符合 2:全部符合
        lstSettings = lstMSettings,
        OrderSettings = new OrderSettings2<OrderType2, OrderPriceType1>
        {
            MarketType = enumMarketType.TWSE,
            StkCode = "2885",
            OrderType = (OrderType2)1,      // 現股買進:1
            TimeInforce = 0,
            PriceType = (OrderPriceType1)1, // 市價:1
            OrderValue = 0,
            OrderQty = 1
        }
    },

    // 子單設定
    S_SpiderStrategy = new SpiderSettings
    {
        Eligible = 1,                       // 1:擇一符合 2:全部符合
        lstSettings = lstSSettings,
        OrderSettings = new OrderSettings2<OrderType2, OrderPriceType1>
        {
            MarketType = enumMarketType.TWSE,
            StkCode = "2883",
            OrderType = (OrderType2)1,      // 現股買進:1
            TimeInforce = 0,
            PriceType = (OrderPriceType1)1, // 市價:1
            OrderValue = 0,
            OrderQty = 1
        }
    }
});

objYuantaSparkAPI.SendAlgoCOOdrStrategy(Account, lstMS);
Thread.Sleep(2000);

Onresponse

def on_response(intMark, dwIndex, strIndex, objHandle, objValue):
    try:
        result = ''
        match intMark:
            case 0:  # 系統回應資訊
                result = str(objValue)
            case 1:  # 查詢回應資訊
                match strIndex:
                    case 'Login':
                        loginResult = objValue
                        status = loginResult.LoginStatus
                        strMsgCode = status.MsgCode # 訊息代碼
                        strMsgContent = status.MsgContent # 訊息內容
                        intCount = status.Count # 筆數
                        result = '{0},{1},帳號筆數:{2}\r\n'.format(strMsgCode,strMsgContent, str(intCount))
                        if strMsgCode == '0001' or strMsgCode == '00001' or intCount > 0 :
                            for i in objValue.LoginList:
                                result += f"{i.Account},{i.Name},{i.InvestorID},{i.SellerNo}\n"

                    case 'SendAlgoCOOdrStrategy':
                        SResult = objValue
                        sResult = SResult.ResultList

                        result = ''
                        result += "新增條件單:\r\n"

                        for i in range(sResult.Count):  
                            result += '{0},{1},{2},{3},{4}\r\n'.format(sResult[i].OrdStatus,sResult[i].OrderNo,sResult[i].EffTime,sResult[i].ExpTime,sResult[i].Msg)

        if result:
            print('##================================================##\n')
            print(result)

    except Exception as error:
        print(f"處理回應時發生錯誤: {error}")

objYuantaSparkAPI.OnResponse += on_response
#測試環境帳號:UAT 正式環境:PROD
objYuantaSparkAPI.Open(enumEnvironmentMode.UAT)
time.sleep(2)

objYuantaSparkAPI.Login('S98875005091', '1234')
time.sleep(2)

ms_list  = List[MS_SpiderStrategy]()
ms_obj = MS_SpiderStrategy()

ms_obj.Account = "S98875005091"
ms_obj.EffTime =  System.DateTime(2026, 4, 1)
ms_obj.ExpTime =  System.DateTime(2026, 4, 31)
ms_obj.Order = StrategyOrder2(5)                    #限選交易到設定單位全部成交:5

ms_obj.M_SpiderStrategy = SpiderSettings() 
ms_obj.S_SpiderStrategy = SpiderSettings() 
#母單條件設定------------------------------------------------------------------------------------------------------
m_lstSettings =  List[SpiderStrategySettings]()
cond_1 = SpiderStrategySettings()
cond_1.MarketType = enumMarketType.TWSE       
cond_1.StkCode = "2885"                         
cond_1.StrategyConditions = StrategyCondition2(1)   # 成交價
cond_1.Direction = 1                                # 1:大於等於 2:小於等於(成交價才可使用) 3:無(漲停或跌停) 
cond_1.Price = 0                                    # 非總漲跌幅填 0
cond_1.Value = 47.0                                 # 觸發數值:買進

m_lstSettings.Add(cond_1)

ms_obj.M_SpiderStrategy.lstSettings = m_lstSettings
ms_obj.M_SpiderStrategy.Eligible = 1
#母單下單設定------------------------------------------------------------------------------------------------------
ms_obj.M_SpiderStrategy.OrderSettings = OrderSettings2[OrderType2, OrderPriceType1]()
m_order = ms_obj.M_SpiderStrategy.OrderSettings
m_order.MarketType = enumMarketType.TWSE
m_order.StkCode = "2885" 
m_order.OrderType = OrderType2(1)
m_order.TimeInforce = 0
m_order.PriceType = OrderPriceType1(1)  #OrderPriceType1 1:市價
m_order.OrderValue = 0
m_order.OrderQty = 1

#子單條件設定------------------------------------------------------------------------------------------------------
s_lstSettings =  List[SpiderStrategySettings]()
cond_1 = SpiderStrategySettings()
cond_1.MarketType = enumMarketType.TWSE       
cond_1.StkCode = "2883"                         
cond_1.StrategyConditions = StrategyCondition2(1)       # 成交價
cond_1.Direction = 1                                    # 1:大於等於 2:小於等於(成交價才可使用) 3:無(漲停或跌停) 
cond_1.Price = 0                                        # 非總漲跌幅填 0
cond_1.Value = 20.4

s_lstSettings.Add(cond_1)

ms_obj.S_SpiderStrategy.lstSettings = s_lstSettings
ms_obj.S_SpiderStrategy.Eligible = 1

#子單下單設定------------------------------------------------------------------------------------------------------
ms_obj.S_SpiderStrategy.OrderSettings = OrderSettings2[OrderType2, OrderPriceType1]()
s_order = ms_obj.S_SpiderStrategy.OrderSettings

s_order.MarketType = enumMarketType.TWSE
s_order.StkCode = "2883" 
s_order.OrderType = OrderType2(1)
s_order.TimeInforce = 0
s_order.PriceType = OrderPriceType1(1)                  # OrderPriceType1 1:市價
s_order.OrderValue = 0
s_order.OrderQty = 1

ms_list.Add(ms_obj)
objYuantaSparkAPI.SendAlgoCOOdrStrategy[MS_SpiderStrategy]('S98875005091', ms_list)
time.sleep(1)

# 保持程式運行
while True:
    time.sleep(2)
void objApi_OnResponse(int intMark, uint dwIndex, string strIndex, object objHandle, object objValue)
{
    try
    {
        string strResult = "";
        if (intMark == 0)
        {
            Console.WriteLine(Convert.ToString(objValue));
            return;
        }

        if (intMark == 1)
        {
            if (strIndex == "Login")
            {
                var result = (LoginResult)objValue;

                string strMsgCode = result.LoginStatus.MsgCode;
                string strMsgContent = result.LoginStatus.MsgContent;
                int intCount = result.LoginStatus.Count;

                strResult += $"{strMsgCode}, {strMsgContent}{Environment.NewLine}";
                if (strMsgCode == "0001" || strMsgCode == "00001")
                {
                    strResult += $"帳號筆數: {intCount.ToString()}{Environment.NewLine}";
                    result.LoginList.ForEach(r => strResult += $"{r.Account},{r.Name},{r.InvestorID},{r.SellerNo}\r\n");
                }
                else
                {
                    Account = "";
                }

                Console.WriteLine("\n======================");
                Console.WriteLine(strResult.ToString());
                Console.WriteLine("======================\n");
                return;
            }

            if (strIndex == "SendAlgoCOOdrStrategy")
            {
                var result = (OrderStrategyResult)objValue;
                try
                {
                    strResult += "新增條件單:\r\n";
                    result.ResultList?.ForEach(r =>
                    {
                        strResult += $"{r.OrdStatus} {r.OrderNo} {r.EffTime:yyyy/MM/dd} {r.ExpTime:yyyy/MM/dd} {r.Msg}\r\n";
                    });
                }
                catch
                {
                    strResult = "";
                }

                Console.WriteLine("\n======================");
                Console.WriteLine(strResult);
                Console.WriteLine("======================\n");
                return;
            }
        }
        Console.WriteLine($"[{strIndex}] {Convert.ToString(objValue)}");
    }
    catch (Exception exc)
    {
        Console.WriteLine("OnResponse Error: " + exc.Message);
    }
}

Response Body

{
  "Result": {
    "ResultList": [
      {
        "OrdStatus": "SstBuilt",
        "OrderNo": "k263R000000056",
        "EffTime": "2026/04/03",
        "ExpTime": "2026/04/30",
        "Msg": "策略已建立"
      }
    ]
  }
}

範例 (當沖母子單)

引用元件

import os, time, datetime, struct, pathlib, sys
from datetime import datetime
from pathlib import Path
from pythonnet import load

load("coreclr")
import clr, System

##透過Clr引用系統標準函式
clr.AddReference('System.Collections')
from System.Collections.Generic import List

##宣告增加模組、DLL的路徑(windows可抓取當前路徑 Linux跟MAC需指定路徑)
sys.path.append(Path(pathlib.Path(__file__).parent.resolve()))
if sys.platform == "win32":
    os.add_dll_directory(Path(pathlib.Path(__file__).parent.resolve()))

##透過Clr引用YuantaSparkAPI.dll
##pythonnet引用元件不用加附檔名
try:
    clr.AddReference("YuantaSparkAPI")
except Exception as e:
    print(f"Error loading YuantaSparkAPI: {e}")
from YuantaOneAPI import (YuantaSparkAPITrader, enumLogType, 
                        enumMarketType, enumEnvironmentMode, enumStkTickSelectType, 
                        MS_DayTradeSpiderStrategy, StrategyOrder2, StrategyCondition2,
                        DayTradeSpiderSettings, SpiderStrategySettings, OrderSettings2, OrderType3, OrderPriceType1)

# 建立 API 物件
objYuantaSparkAPI = YuantaSparkAPITrader()
objYuantaSparkAPI.SetLogType(enumLogType.COMMON)
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using YuantaOneAPI;

YuantaSparkAPITrader objYuantaSparkAPI = new YuantaSparkAPITrader();
string Account = "S98875005091";
string Password = "1234";
enumEnvironmentMode enumEvenMode = enumEnvironmentMode.UAT;

objYuantaSparkAPI.OnResponse += objApi_OnResponse;
objYuantaSparkAPI.SetLogType(enumLogType.ALL);

objYuantaSparkAPI.Open(enumEvenMode);
Thread.Sleep(1000);

objYuantaSparkAPI.Login(Account, Password);
Thread.Sleep(1000);

// 當沖母子單 MS_DayTradeSpiderStrategy
// 母單條件
List<SpiderStrategySettings> lstMSettings = new List<SpiderStrategySettings>();

// 條件1:成交價 >= 47.0
lstMSettings.Add(new SpiderStrategySettings
{
    MarketType = enumMarketType.TWSE,
    StkCode = "2885",
    StrategyConditions = (StrategyCondition2)1,  // 成交價:1
    Direction = 1,                                // 大於等於:1
    Price = 0,                                    // 非總漲跌幅填 0
    Value = 47.0
});

// 條件2:當日漲幅 >= 1%
lstMSettings.Add(new SpiderStrategySettings
{
    MarketType = enumMarketType.TWSE,
    StkCode = "2885",
    StrategyConditions = (StrategyCondition2)3,  // 當日漲幅:3
    Direction = 1,                                // 大於等於:1
    Price = 0,                                    // 非總漲跌幅填 0
    Value = 1                                     // 當日漲跌幅(0.01~10)%
});

List<MS_DayTradeSpiderStrategy> lstMSDay = new List<MS_DayTradeSpiderStrategy>();
lstMSDay.Add(new MS_DayTradeSpiderStrategy
{
    Account = Account,
    EffTime = new DateTime(2026, 4, 2),
    ExpTime = new DateTime(2026, 4, 2),
    Order = (StrategyOrder2)6,              // 母單成交子單就立即下單:6

    // 母單設定
    M_SpiderStrategy = new DayTradeSpiderSettings
    {
        Eligible = 1,                       // 1:擇一符合 2:全部符合
        lstSettings = lstMSettings,
        OrderSettings = new OrderSettings2<OrderType3, OrderPriceType1>
        {
            MarketType = enumMarketType.TWSE,
            StkCode = "2885",
            OrderType = (OrderType3)1,      // 現股買進:1
            TimeInforce = 0,
            PriceType = (OrderPriceType1)1, // 市價:1
            OrderValue = 0,
            OrderQty = 1
        }
    },

    // 子單設定(當沖賣出)
    OrderSettings = new OrderSettings2<OrderType3, OrderPriceType1>
    {
        MarketType = enumMarketType.TWSE,
        StkCode = "2885",
        OrderType = (OrderType3)2,          // 現股賣出:2
        TimeInforce = 0,
        PriceType = (OrderPriceType1)0,     // 限價:0
        OrderValue = 48,
        OrderQty = 1
    }
});

objYuantaSparkAPI.SendAlgoCOOdrStrategy(Account, lstMSDay);
Thread.Sleep(2000);

Onresponse

def on_response(intMark, dwIndex, strIndex, objHandle, objValue):
    try:
        result = ''
        match intMark:
            case 0:  # 系統回應資訊
                result = str(objValue)
            case 1:  # 查詢回應資訊
                match strIndex:
                    case 'Login':
                        loginResult = objValue
                        status = loginResult.LoginStatus
                        strMsgCode = status.MsgCode # 訊息代碼
                        strMsgContent = status.MsgContent # 訊息內容
                        intCount = status.Count # 筆數
                        result = '{0},{1},帳號筆數:{2}\r\n'.format(strMsgCode,strMsgContent, str(intCount))
                        if strMsgCode == '0001' or strMsgCode == '00001' or intCount > 0 :
                            for i in objValue.LoginList:
                                result += f"{i.Account},{i.Name},{i.InvestorID},{i.SellerNo}\n"

                    case 'SendAlgoCOOdrStrategy':
                        SResult = objValue
                        sResult = SResult.ResultList

                        result = ''
                        result += "新增條件單:\r\n"

                        for i in range(sResult.Count):  
                            result += '{0},{1},{2},{3},{4}\r\n'.format(sResult[i].OrdStatus,sResult[i].OrderNo,sResult[i].EffTime,sResult[i].ExpTime,sResult[i].Msg)

        if result:
            print('##================================================##\n')
            print(result)

    except Exception as error:
        print(f"處理回應時發生錯誤: {error}")

objYuantaSparkAPI.OnResponse += on_response
#測試環境帳號:UAT 正式環境:PROD
objYuantaSparkAPI.Open(enumEnvironmentMode.UAT)
time.sleep(2)

objYuantaSparkAPI.Login('S98875005091', '1234')
time.sleep(2)

ms_day_list  = List[MS_DayTradeSpiderStrategy]()
ms_day_obj = MS_DayTradeSpiderStrategy()
ms_day_obj.Account = "S98875005091"
ms_day_obj.EffTime =  System.DateTime(2026, 3, 30)
ms_day_obj.ExpTime =  System.DateTime(2026, 3, 30)
ms_day_obj.Order = StrategyOrder2(6)                    #限選母單成交子單就立即下單 :6

ms_day_obj.M_SpiderStrategy = DayTradeSpiderSettings()

#母單條件設定------------------------------------------------------------------------------------------------------
m_lstSettings =  List[SpiderStrategySettings]()
cond_1 = SpiderStrategySettings()
cond_1.MarketType = enumMarketType.TWSE       
cond_1.StkCode = "2885"                         
cond_1.StrategyConditions = StrategyCondition2(1)       # 成交價
cond_1.Direction = 1                                    # 1:大於等於 2:小於等於(成交價才可使用) 3:無(漲停或跌停) 
cond_1.Price = 0                                        # 非總漲跌幅填 0
cond_1.Value = 47.0                                     # 觸發數值

cond_2 = SpiderStrategySettings()
cond_2.MarketType = enumMarketType.TWSE                 # 上市
cond_2.StkCode = "2885"                                 # 商品代號
cond_2.StrategyConditions = StrategyCondition2(3)       # 當日漲幅:3
cond_2.Direction = 1                                    # 1:大於等於 2:小於等於(成交價才可使用) 3:無(漲停或跌停) 
cond_2.Price = 0                                        # 非總漲跌幅填 0
cond_2.Value = 1                                        # 當日漲跌幅(0.01~10)%

m_lstSettings.Add(cond_1)
m_lstSettings.Add(cond_2)
ms_day_obj.M_SpiderStrategy.lstSettings = m_lstSettings
ms_day_obj.M_SpiderStrategy.Eligible = 1
#母單下單設定------------------------------------------------------------------------------------------------------
ms_day_obj.M_SpiderStrategy.OrderSettings = OrderSettings2[OrderType3, OrderPriceType1]()
m_order = ms_day_obj.M_SpiderStrategy.OrderSettings
m_order.MarketType = enumMarketType.TWSE
m_order.StkCode = "2885" 
m_order.OrderType = OrderType3(1)                       # 現股買進:1
m_order.TimeInforce = 0
m_order.PriceType = OrderPriceType1(1)                  # OrderPriceType1 1:市價

m_order.OrderValue = 0
m_order.OrderQty = 1
#子單設定--------------------------------------------
ms_day_obj.OrderSettings = OrderSettings2[OrderType3, OrderPriceType1]()
s_order = ms_day_obj.OrderSettings

s_order.MarketType = enumMarketType.TWSE
s_order.StkCode = "2885" 
s_order.OrderType = OrderType3(2)                       # 現股賣出:2
s_order.TimeInforce = 0
s_order.PriceType = OrderPriceType1(0)                  # OrderPriceType1 0:限價
s_order.OrderValue = 48  
s_order.OrderQty = 1

ms_day_list.Add(ms_day_obj)
objYuantaSparkAPI.SendAlgoCOOdrStrategy[MS_DayTradeSpiderStrategy]('S98875005091', ms_day_list)
time.sleep(1)

# 保持程式運行
while True:
    time.sleep(2)
void objApi_OnResponse(int intMark, uint dwIndex, string strIndex, object objHandle, object objValue)
{
    try
    {
        string strResult = "";
        if (intMark == 0)
        {
            Console.WriteLine(Convert.ToString(objValue));
            return;
        }

        if (intMark == 1)
        {
            if (strIndex == "Login")
            {
                var result = (LoginResult)objValue;

                string strMsgCode = result.LoginStatus.MsgCode;
                string strMsgContent = result.LoginStatus.MsgContent;
                int intCount = result.LoginStatus.Count;

                strResult += $"{strMsgCode}, {strMsgContent}{Environment.NewLine}";
                if (strMsgCode == "0001" || strMsgCode == "00001")
                {
                    strResult += $"帳號筆數: {intCount.ToString()}{Environment.NewLine}";
                    result.LoginList.ForEach(r => strResult += $"{r.Account},{r.Name},{r.InvestorID},{r.SellerNo}\r\n");
                }
                else
                {
                    Account = "";
                }

                Console.WriteLine("\n======================");
                Console.WriteLine(strResult.ToString());
                Console.WriteLine("======================\n");
                return;
            }

            if (strIndex == "SendAlgoCOOdrStrategy")
            {
                var result = (OrderStrategyResult)objValue;
                try
                {
                    strResult += "新增條件單:\r\n";
                    result.ResultList?.ForEach(r =>
                    {
                        strResult += $"{r.OrdStatus} {r.OrderNo} {r.EffTime:yyyy/MM/dd} {r.ExpTime:yyyy/MM/dd} {r.Msg}\r\n";
                    });
                }
                catch
                {
                    strResult = "";
                }

                Console.WriteLine("\n======================");
                Console.WriteLine(strResult);
                Console.WriteLine("======================\n");
                return;
            }
        }
        Console.WriteLine($"[{strIndex}] {Convert.ToString(objValue)}");
    }
    catch (Exception exc)
    {
        Console.WriteLine("OnResponse Error: " + exc.Message);
    }
}

Response Body

{
  "Result": {
    "ResultList": [
      {
        "OrdStatus": "SstBuilt",
        "OrderNo": "k263R000000056",
        "EffTime": "2026/04/03",
        "ExpTime": "2026/04/30",
        "Msg": "策略已建立"
      }
    ]
  }
}