SendFutureCombined

期貨複式單組合

bool SendFutureCombined(LoginAcno, lstDepositOptimum, lng)

回傳:

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

Input Parameters

Name Type Description Memo
LoginAcno string 組合帳號 期貨:F+分公司代號(7+3)+帳號(7)
例如 FF021000P001234567
lstDepositOptimum List 組合物件清單 建議由保證金最佳化查詢結果篩選代入
lng enumLangType 語系 參考列舉物件-語系
預設為 Normal
- Normal:Big5
- UTF8:UTF8
- SC:簡體中文

DepositOptimum 期貨保證金最佳化物件

Name Type Description Memo
StrategyID Byte 策略ID 6.買賣權混合部位(跨式,勒式)
7.多頭價差
8.Put空頭價差
9.溫跌作莊
10.溫漲作莊
11.Call時間價差
12.Put時間價差
FutAccountInfo string 期貨帳號
Qty Short 口數
BuySell1 string 買賣別1 B, S
BuySell2 string 買賣別2 B, S
DealPrice1 double 成交價1 此值即為市價
DealPrice2 double 成交價2 此值即為市價
Decimal1 Short 小數位數1 +為小數位數,-為分數分母,0為整數
CurrentIM1 Int 商品一保證金
CurrentIM2 Int 商品二保證金
SaveIM Int 可節省保證金
CommodityID1 string 商品ID1 TXO
CallPut1 string 買賣權1 C/P
SettlementMonth1 Int 商品年月1 202502
StrikePrice1 double 履約價1
StkName1 string 商品名稱1 台指選 02 22800 P
CommodityID2 string 商品ID2 TXO
CallPut2 string 買賣權2 C/P
SettlementMonth2 Int 商品年月2 202502
StrikePrice2 double 履約價2
StkName2 string 商品名稱2 台指選 02 23000 P

Output Parameters

FutCombinedResult 複合式組合下單結果

Name Type Description Memo
ResultCount OrderStatus 交易狀態
ResultList List<FutCombinedData> 複合式組合下單結果清單

OrderStatus 交易類狀態

Name Type Description Memo
MsgCode string 訊息代碼 0001:執行成功 其它:失敗
MsgContent string 訊息內容
Count Int 筆數

FutCombinedData 複合式組合下單結果明細

Name Type Description Memo
Identify Int 識別碼
ReplyCode Short 委託結果代碼 0:委託成功 others:委託失敗
ErrType string 錯誤類別
ErrNO string 錯誤代號
Advisory 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, enumEnvironmentMode, LoginResult, DepositOptimum

# 建立 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 = "FF0210132243219588";
string Password = "abcd123";
enumEnvironmentMode enumEvenMode = enumEnvironmentMode.UAT;

List<DepositOptimum> DepositOptimumList = new List<DepositOptimum>();

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

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

objYuantaSparkAPI.GetFutDepositOptimum(Account);
Thread.Sleep(1000);
objYuantaSparkAPI.SendFutureCombined(Account, DepositOptimumList);
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 'GetFutDepositOptimum':
                        # 期貨保證金最佳化查詢
                        fResult = objValue

                        # 最佳化清單(保留到全域變數)
                        global DepositOptimumList
                        DepositOptimumList = fResult.DepositOptimumList

                        result += '期貨保證金最佳化查詢:\r\n'
                        result += '最佳化筆數:{0}\r\n'.format(DepositOptimumList.Count)

                        for i in range(DepositOptimumList.Count):
                            result += '{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},{16},{17},{18},{19},{20}\r\n'.format(
                                str(DepositOptimumList[i].StrategyID),DepositOptimumList[i].FutAccountInfo,str(DepositOptimumList[i].Qty),DepositOptimumList[i].BuySell1,DepositOptimumList[i].BuySell2,str(DepositOptimumList[i].DealPrice1),
                                str(DepositOptimumList[i].DealPrice2),str(DepositOptimumList[i].Decimal1),str(DepositOptimumList[i].CurrentIM1),str(DepositOptimumList[i].CurrentIM2),str(DepositOptimumList[i].SaveIM),DepositOptimumList[i].CommodityID1,
                                DepositOptimumList[i].CallPut1,str(DepositOptimumList[i].SettlementMonth1),str(DepositOptimumList[i].StrikePrice1),DepositOptimumList[i].StkName1,DepositOptimumList[i].CommodityID2,DepositOptimumList[i].CallPut2,
                                str(DepositOptimumList[i].SettlementMonth2),str(DepositOptimumList[i].StrikePrice2),DepositOptimumList[i].StkName2)

                    case 'SendFutureCombined':  # 期貨複式單組合回應
                        fResult = objValue
                        status = fResult.ResultCount     # 包含 MsgCode/MsgContent/Count
                        datas = fResult.ResultList       # 明細列表

                        result += '期貨複式單組合結果:\n'
                        Rcount = status.Count
                        result += '{0},{1},組合筆數:{2}\r\n'.format(status.MsgCode,status.MsgContent,str(Rcount))

                        # 循環處理回應資料
                        for i in range(Rcount):
                            result += '{0},{1},{2},{3},{4}\r\n'.format(str(datas[i].Identify),str(datas[i].ReplyCode),str(datas[i].ErrType),datas[i].ErrNO,datas[i].Advisory)
        # 輸出結果
        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('FF0210132243219588', 'abcd123')
time.sleep(2)

DepositOptimumList = List[DepositOptimum]()
objYuantaSparkAPI.GetFutDepositOptimum('FF0210132243219588')
time.sleep(3)

objYuantaSparkAPI.SendFutureCombined('FF0210132243219588',DepositOptimumList)

# 保持程式運行
while True:
    time.sleep(1)
void objApi_OnResponse(int intMark, uint dwIndex, string strIndex, object objHandle, object objValue)
{
    string strResult = "";
    try
    {
        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;
            }
            else if (strIndex == "GetFutDepositOptimum")
            {
                var result = (DepositOptimumResult)objValue;

                try
                {
                    var list = result?.DepositOptimumList;
                    int intCount = list?.Count ?? 0;

                    strResult += $"保證金最佳化:{intCount}筆 \r\n";

                    if (list != null && list.Count > 0)
                    {
                        list.ForEach(x =>
                        {
                            strResult +=
                                $"{x.StrategyID},{x.FutAccountInfo},{x.Qty},{x.BuySell1},{x.BuySell2},{x.DealPrice1},{x.DealPrice2}," +
                                $"{x.Decimal1},{x.CurrentIM1},{x.CurrentIM2},{x.SaveIM}," +
                                $"{x.CommodityID1},{x.CallPut1},{x.SettlementMonth1},{x.StrikePrice1},{x.StkName1}," +
                                $"{x.CommodityID2},{x.CallPut2},{x.SettlementMonth2},{x.StrikePrice2},{x.StkName2}\r\n";
                        });

                        // 保存至全域(供後續送單)
                        DepositOptimumList = list;
                    }
                }
                catch
                {
                    strResult = "";
                }

                Console.WriteLine("\n======================");
                Console.WriteLine(strResult);
                Console.WriteLine("======================\n");

                return;
            }
            else if (strIndex == "SendFutureCombined")
            {
                var result = (FutCombinedResult)objValue;
                try
                {
                    strResult += $"期貨複式單組合:{result.ResultCount.MsgCode},{result.ResultCount.MsgContent},{result.ResultCount.Count}筆\r\n";
                    result.ResultList.ForEach(x =>
                    {
                        strResult += $"{x.Identify},{x.ReplyCode},{x.ErrType},{x.ErrNO},{x.Advisory}\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": {
    "ResultCount": {
      "MsgCode": "0001",
      "MsgContent": "執行成功",
      "Count": 1
    },
    "ResultList": [
      {
        "Identify": "9999",
        "ReplyCode": "0",
        "ErrType": "E",
        "ErrNO": "EEE",
        "Advisory": "申請組合 資料筆數1筆,總口數3口"
      }
    ]
  }
}