Batch Cancel Order
BatchCancelOrder
Input Parameters
| Parameter | Type | Description |
|---|---|---|
| account | Account | Account |
| orderResults | []OrderResult | List of orders to batch cancel |
Result Return
| Parameter | Type | Description |
|---|---|---|
| IsSuccess | bool | Whether successful |
| Data | *[]OrderResult | Returns cancellation result list |
| Message | *string | Returns error message when IsSuccess = false |
Request Example
package main
import (
"fmt"
"fubon"
)
func main() {
sdk := fubon.NewSDK()
// ... Login, connection, and other initialization steps ...
// Method 1: Batch cancel (using content returned by batch detail)
batchList, _ := sdk.Stock.BatchOrderLists(account)
if batchList.Data != nil && len(*batchList.Data) > 0 {
batchRes := (*batchList.Data)[0]
batchDetail, _ := sdk.Stock.BatchOrderDetail(account, batchRes)
if batchDetail.Data != nil && len(*batchDetail.Data) >= 2 {
cancelOrders := []fubon.OrderResult{
(*batchDetail.Data)[0],
(*batchDetail.Data)[1],
}
batchCancel, err := sdk.Stock.BatchCancelOrder(account, cancelOrders)
if err != nil {
fmt.Printf("❌ Batch Cancel Order Format/Parse Error: %v\n", err)
return
}
if batchCancel.IsSuccess && batchCancel.Data != nil {
fmt.Printf("✅ Cancelled %d orders\n", len(*batchCancel.Data))
for i, result := range *batchCancel.Data {
fmt.Printf("Order %d: OrderNo=%s, Status=%d (30=Cancelled)\n",
i+1, *result.OrderNo, *result.Status)
}
}
}
}
// Method 2: Batch cancel (using different single orders)
ordResult, _ := sdk.Stock.OrderResults(account)
if ordResult.Data != nil && len(*ordResult.Data) >= 2 {
cancelOrders := []fubon.OrderResult{
(*ordResult.Data)[0],
(*ordResult.Data)[1],
}
batchCancel, err := sdk.Stock.BatchCancelOrder(account, cancelOrders)
if err != nil {
fmt.Printf("❌ Batch Cancel Order Format/Parse Error: %v\n", err)
return
}
if !batchCancel.IsSuccess {
message := "No message"
if batchCancel.Message != nil {
message = *batchCancel.Message
}
fmt.Printf("Batch cancel failed. Message: %s\n", message)
return
}
if batchCancel.Data != nil {
fmt.Println("✅ Batch cancel succeeded!")
for i, result := range *batchCancel.Data {
fmt.Printf("\n--- Cancelled Order %d ---\n", i+1)
fmt.Printf("FunctionType: %d (30=Cancel)\n", *result.FunctionType)
fmt.Printf("OrderNo: %s\n", *result.OrderNo)
fmt.Printf("StockNo: %s\n", *result.StockNo)
fmt.Printf("Status: %d\n", *result.Status)
fmt.Printf("AfterQty: %d (0 after cancel)\n", *result.AfterQty)
fmt.Printf("BeforeQty: %d\n", *result.BeforeQty)
}
}
} else {
fmt.Println("⚠️ No orders found for batch cancellation")
}
}
Response Example
Result{
IsSuccess: true,
Message: nil,
Data: &[]OrderResult{
{
FunctionType: 30, // Function Type (30=Cancel)
Date: "2024/03/08", // Transaction Date
SeqNo: "00000308998", // Order Sequence Number
BranchNo: "6460", // Branch Code
Account: "26", // Account
OrderNo: "x0028", // Order Number
AssetType: 0, // Asset Type
Market: "TAIEX", // Market Type
MarketType: Common, // Market Type Category
StockNo: "1101", // Stock Symbol
BuySell: Sell, // Buy/Sell Action
PriceType: Limit, // Original Price Type
Price: "41.2", // Price
Quantity: 5000, // Original Order Quantity
TimeInForce: Rod, // Order Condition
OrderType: Stock, // Order Type
IsPreOrder: false, // Is Pre-order
Status: 30, // Order Status (30=Cancelled Unfilled)
AfterPrice: "41.2", // Effective Price
AfterQty: 0, // Effective Order Quantity (0 after cancellation)
BeforeQty: 5000, // Effective Qty Before Change
BeforePrice: "41.2", // Effective Price Before Change
UserDef: "12345678", // User Defined Field
LastTime: "12:53:57.536", // Last Modified Time
// ... Other fields
},
{
FunctionType: 30, // Function Type (30=Cancel)
Date: "2024/03/08", // Transaction Date
SeqNo: "0000030899", // Order Sequence Number
OrderNo: "x0029", // Order Number
StockNo: "1101", // Stock Symbol
Status: 30, // Order Status
// ... Other fields
},
},
}