SendFutureOrder
國內期貨下單
bool SendFutureOrder(LoginAcno, lstFutureOrder, lng)
回傳:
| Type | Description |
|---|---|
| bool | True:此功能執行成功;False:此功能執行異常(結果請從回應事件 OnResponse 接收) |
Input Parameters
| Name | Type | Description | Memo |
|---|---|---|---|
| LoginAcno | string | 下單帳號 | 期貨:F+分公司代號(7+3)+帳號(7) 例如 FF021000P001234567 |
| lstFutureOrder | List<FutureOrder> | 下單物件清單 | |
| lng | enumLangType | 語系 | 參考列舉物件-語系 預設為 NormalNormal: Big5 UTF8: UTF8 SC: 簡體中文 |
FutureOrder 國內期貨下單物件
| Name | Type | Description | Memo |
|---|---|---|---|
| Identity | Int | 識別碼 | |
| Account | string | 下單帳號 | 期貨:F+分公司代號(7+3)+帳號(7) 例如 FF021000P001234567 |
| OrderNo | string | 委託書編號 | 委託新單不需填 |
| TradeDate | string | 交易日期 | yyyy/MM/dd |
| FunctionCode | short | 功能別 | 00:委託單 04:取消 05:改量 07:改價 (Opt複式單沒有改價) |
| CommodityID1 | string | 商品名稱1 | 請參考 FunctionList.xlsx 股名檔對照表的下單代碼 如:台指FITX 如:台指選TXO |
| CallPut1 | string | 買賣權1 | "C":Call "P":Put (選擇權才需填值) |
| SettlementMonth1 | Int | 商品月份1 | 如:201912 |
| Price | double | 委託價格 | 非限價請填0 |
| StrikePrice1 | double | 履約價1 | |
| OrderQty1 | short | 委託口數1 | |
| BuySell1 | string | 買賣別1 | "B":買 "S":賣 |
| CommodityID2 | string | 商品名稱2 | |
| CallPut2 | string | 買賣權2 | "C":Call "P":Put (選擇權才需填值) |
| SettlementMonth2 | Int | 商品月份2 | 如:201912 |
| StrikePrice2 | double | 履約價2 | |
| OrderQty2 | short | 委託口數2 | |
| BuySell2 | string | 買賣別2 | "B":買 "S":賣 |
| OpenOffsetKind | string | 新平倉 | 0:新倉 1:平倉 2:自動 |
| DayTradeID | string | 當沖註記 | "Y":當沖 " ":空白 |
| OrderType | string | 委託方式 | 1:市價 2:限價 3:範圍市價 |
| OrderCond | string | 委託條件 | " ":ROD I:FOK 2:IOC |
| SellerNo | short | 營業員代碼 | 請填0 |
| BasketNo | string | BasketNo | 目前無作用 |
| Session | string | 盤別 | 1:預約 其他:盤中單 |
Output Parameters
FutOrderResult 國內期貨下單結果
| Name | Type | Description | Memo |
|---|---|---|---|
| ResultCount | OrderStatus | 交易狀態 | |
| ResultList | List<FutOrderData> | 國內期貨下單結果清單 |
OrderStatus 交易類狀態
| Name | Type | Description | Memo |
|---|---|---|---|
| MsgCode | string | 訊息代碼 | 0001:執行成功 其它:失敗 |
| MsgContent | string | 訊息內容 | |
| Count | Int | 筆數 |
FutOrderData 國內期貨下單結果明細
| Name | Type | Description | Memo |
|---|---|---|---|
| Identify | Int | 識別碼 | |
| ReplyCode | Short | 委託結果代碼 | 0:委託成功 others:委託失敗 |
| OrderNO | string | 委託書編號 | |
| TradeDate | TYuantaDate | 交易日期 | 參考物件-日期物件 |
| 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, FutureOrder
# 建立 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;
objYuantaSparkAPI.OnResponse += objApi_OnResponse;
objYuantaSparkAPI.SetLogType(enumLogType.ALL);
objYuantaSparkAPI.Open(enumEvenMode);
Thread.Sleep(1000);
objYuantaSparkAPI.Login(Account, Password);
Thread.Sleep(1000);
List<FutureOrder> lstFutureOrder = new List<FutureOrder>();
FutureOrder futureOrder = new FutureOrder
{
Identify = 1,
Account = Account,
FunctionCode = 0,
CommodityID1 = "FITX",
CallPut1 = "",
SettlementMonth1 = 202506,
StrikePrice1 = 0,
Price = 21000,
OrderQty1 = 1,
BuySell1 = "B",
CommodityID2 = "",
CallPut2 = "",
SettlementMonth2 = 0,
StrikePrice2 = 0,
OrderQty2 = 0,
BuySell2 = "",
OpenOffsetKind = "2",
DayTradeID = " ",
OrderType = "2",
OrderCond = " ",
SellerNo = 0,
OrderNo = "",
TradeDate = DateTime.Today.ToString("yyyy/MM/dd"),
BasketNo = "",
Session = " "
};
lstFutureOrder.Add(futureOrder);
objYuantaSparkAPI.SendFutureOrder(Account, lstFutureOrder);
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 'SendFutureOrder':
futOrderResult = objValue
status = futOrderResult.ResultCount
futOrderDatas = futOrderResult.ResultList
result += '期貨下單結果:\n'
Rcount = status.Count
result += f"{status.MsgCode},{status.MsgContent},下單筆數:{Rcount}\n"
for i in range(Rcount):
yuantaDate = futOrderDatas[i].TradeDate
date = '{0}/{1}/{2}'.format(yuantaDate.Year, yuantaDate.Month, yuantaDate.Day)
result += '{0},{1},{2},{3},{4},{5},{6}\r\n'.format(str(futOrderDatas[i].Identify),str(futOrderDatas[i].ReplyCode),futOrderDatas[i].OrderNO,date,str(futOrderDatas[i].ErrType),futOrderDatas[i].ErrNO,futOrderDatas[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)
futureOrder = FutureOrder()
futureOrder.Identify = 1
futureOrder.Account = 'FF0210132243219588'
futureOrder.FunctionCode = 0
futureOrder.CommodityID1 = 'FITX'
futureOrder.CallPut1 = ''
futureOrder.SettlementMonth1 = 202512
futureOrder.StrikePrice1 = 0
futureOrder.Price = 27000
futureOrder.OrderQty1 = 1
futureOrder.BuySell1 = 'B'
futureOrder.CommodityID2 = ''
futureOrder.CallPut2 = ''
futureOrder.SettlementMonth2 = 0
futureOrder.StrikePrice2 = 0
futureOrder.OrderQty2 = 0
futureOrder.BuySell2 = ''
futureOrder.OpenOffsetKind = '2'
futureOrder.DayTradeID = ' '
futureOrder.OrderType = '2'
futureOrder.OrderCond = ' '
futureOrder.SellerNo = 0
futureOrder.OrderNo=''
futureOrder.TradeDate = datetime.today().strftime('%Y/%m/%d')
futureOrder.BasketNo = ''
futureOrder.Session = ' '
lstFutureOrder = List[FutureOrder]()
lstFutureOrder.Add(futureOrder)
#傳送下單
objYuantaSparkAPI.SendFutureOrder('FF0210132243219588', lstFutureOrder)
#測試環境傳送後要休息一下
time.sleep(2)
# 保持程式運行
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;
}
if (strIndex == "SendFutureOrder")
{
var result = (FutOrderResult)objValue;
try
{
strResult += $"期貨下單結果:{result.ResultCount.MsgCode},{result.ResultCount.MsgContent},{result.ResultCount.Count}筆\r\n";
result.ResultList.ForEach(x =>
{
strResult += $"{x.Identify},{x.ReplyCode},{x.OrderNO},{x.TradeDate:yyyy/MM/dd},{x.ErrType},{x.ErrNO},{x.Advisory}\r\n";
});
}
catch
{
strResult = "";
}
Console.WriteLine("\n======================");
Console.WriteLine(strResult.ToString());
Console.WriteLine("======================\n");
return;
}
Console.WriteLine($"{Convert.ToString(objValue)}");
}
}
catch (Exception exc)
{
Console.WriteLine("OnResponse Error: " + exc.Message);
}
}
Response Body
{
"Result": {
"ResultCount": {
"MsgCode": "0001",
"MsgContent": "執行成功",
"Count": 1
},
"ResultList": [
{
"Identify": "1",
"ReplyCode": "0",
"OrderNO": "4a002",
"TradeDate": "2025/1/1",
"ErrType": "",
"ErrNO": "",
"Advisory": ""
}
]
}
}