|
1 | 1 | package com.webull.openapi.example.trade; |
2 | 2 |
|
3 | | -import com.webull.openapi.common.dict.*; |
| 3 | +import com.webull.openapi.common.dict.ComboType; |
| 4 | +import com.webull.openapi.common.dict.EntrustType; |
| 5 | +import com.webull.openapi.common.dict.InstrumentSuperType; |
| 6 | +import com.webull.openapi.common.dict.Markets; |
| 7 | +import com.webull.openapi.common.dict.OptionStrategy; |
| 8 | +import com.webull.openapi.common.dict.OptionType; |
| 9 | +import com.webull.openapi.common.dict.OrderSide; |
| 10 | +import com.webull.openapi.common.dict.OrderTIF; |
| 11 | +import com.webull.openapi.common.dict.OrderType; |
4 | 12 | import com.webull.openapi.example.config.Env; |
5 | 13 | import com.webull.openapi.execption.ClientException; |
6 | 14 | import com.webull.openapi.execption.ServerException; |
|
10 | 18 | import com.webull.openapi.trade.api.TradeApiService; |
11 | 19 | import com.webull.openapi.trade.api.http.TradeHttpApiService; |
12 | 20 | import com.webull.openapi.trade.api.request.StockOrder; |
13 | | -import com.webull.openapi.trade.api.response.*; |
| 21 | +import com.webull.openapi.trade.api.request.v2.OptionOrder; |
| 22 | +import com.webull.openapi.trade.api.request.v2.OptionOrderItem; |
| 23 | +import com.webull.openapi.trade.api.request.v2.OptionOrderItemLeg; |
14 | 24 | import com.webull.openapi.trade.api.response.Account; |
15 | 25 | import com.webull.openapi.trade.api.response.AccountDetail; |
16 | 26 | import com.webull.openapi.trade.api.response.AccountPositions; |
| 27 | +import com.webull.openapi.trade.api.response.BalanceBase; |
17 | 28 | import com.webull.openapi.trade.api.response.InstrumentInfo; |
18 | 29 | import com.webull.openapi.trade.api.response.Order; |
19 | 30 | import com.webull.openapi.trade.api.response.OrderResponse; |
20 | 31 | import com.webull.openapi.trade.api.response.Orders; |
| 32 | +import com.webull.openapi.trade.api.response.TradableInstruments; |
21 | 33 | import com.webull.openapi.trade.api.response.TradeCalendar; |
| 34 | +import com.webull.openapi.trade.api.response.v2.PreviewOrderResponse; |
| 35 | +import com.webull.openapi.trade.api.response.v2.TradeOrderResponse; |
22 | 36 | import com.webull.openapi.utils.CollectionUtils; |
23 | 37 | import com.webull.openapi.utils.GUID; |
24 | 38 | import com.webull.openapi.utils.StringUtils; |
25 | 39 |
|
| 40 | +import java.util.ArrayList; |
26 | 41 | import java.util.List; |
27 | 42 |
|
28 | 43 | public class TradeApi { |
@@ -111,6 +126,74 @@ public static void main(String[] args) { |
111 | 126 | TradableInstruments tradeableInstruments = apiService.getTradeableInstruments("", 10); |
112 | 127 | logger.info("Tradeable instruments info: {}", tradeableInstruments); |
113 | 128 |
|
| 129 | + |
| 130 | + |
| 131 | + // Options |
| 132 | + // For option order inquiries, please use the V2 query interface: TradeHttpApiV2Service.getOrderDetails(accountId, clientOrderId). |
| 133 | + OptionOrderItemLeg optionOrderItemLeg = new OptionOrderItemLeg(); |
| 134 | + optionOrderItemLeg.setSide(OrderSide.BUY.name()); |
| 135 | + optionOrderItemLeg.setQuantity("1"); |
| 136 | + optionOrderItemLeg.setSymbol("AAPL"); |
| 137 | + optionOrderItemLeg.setStrikePrice("250"); |
| 138 | + optionOrderItemLeg.setInitExpDate("2025-08-15"); |
| 139 | + optionOrderItemLeg.setInstrumentType(InstrumentSuperType.OPTION.name()); |
| 140 | + optionOrderItemLeg.setOptionType(OptionType.CALL.name()); |
| 141 | + optionOrderItemLeg.setMarket(Markets.US.name()); |
| 142 | + List<OptionOrderItemLeg> optionOrderItemLegList = new ArrayList<>(); |
| 143 | + optionOrderItemLegList.add(optionOrderItemLeg); |
| 144 | + OptionOrderItem optionOrderItem = new OptionOrderItem(); |
| 145 | + optionOrderItem.setClientOrderId(GUID.get()); |
| 146 | + optionOrderItem.setComboType(ComboType.NORMAL.name()); |
| 147 | + optionOrderItem.setOptionStrategy(OptionStrategy.SINGLE.name()); |
| 148 | + optionOrderItem.setSide(OrderSide.BUY.name()); |
| 149 | + optionOrderItem.setOrderType(OrderType.LIMIT.name()); |
| 150 | + optionOrderItem.setTimeInForce(OrderTIF.GTC.name()); |
| 151 | + optionOrderItem.setLimitPrice("2"); |
| 152 | + optionOrderItem.setQuantity("1"); |
| 153 | + optionOrderItem.setEntrustType(EntrustType.QTY.name()); |
| 154 | + optionOrderItem.setOrders(optionOrderItemLegList); |
| 155 | + List<OptionOrderItem> optionOrderItemList = new ArrayList<>(); |
| 156 | + optionOrderItemList.add(optionOrderItem); |
| 157 | + OptionOrder optionOrder = new OptionOrder(); |
| 158 | + optionOrder.setNewOrders(optionOrderItemList); |
| 159 | + |
| 160 | + logger.info("previewOptionRequest: {}", optionOrder); |
| 161 | + PreviewOrderResponse previewOptionResponse = apiService.previewOption(accountId, optionOrder); |
| 162 | + logger.info("previewOptionResponse: {}", previewOptionResponse); |
| 163 | + |
| 164 | + logger.info("placeOptionRequest: {}", optionOrder); |
| 165 | + TradeOrderResponse placeOptionResponse = apiService.placeOption(accountId, optionOrder); |
| 166 | + logger.info("placeOptionResponse: {}", placeOptionResponse); |
| 167 | + Thread.sleep(5000L); |
| 168 | + |
| 169 | + // This code is only applicable for single-leg options modification operations. |
| 170 | + OptionOrderItemLeg optionReplaceItemLeg = new OptionOrderItemLeg(); |
| 171 | + optionReplaceItemLeg.setQuantity("2"); |
| 172 | + optionReplaceItemLeg.setClientOrderId(optionOrderItem.getClientOrderId()); |
| 173 | + List<OptionOrderItemLeg> optionReplaceItemLegList = new ArrayList<>(); |
| 174 | + optionReplaceItemLegList.add(optionReplaceItemLeg); |
| 175 | + OptionOrderItem optionReplaceItem = new OptionOrderItem(); |
| 176 | + optionReplaceItem.setClientOrderId(optionOrderItem.getClientOrderId()); |
| 177 | + optionReplaceItem.setLimitPrice("3"); |
| 178 | + optionReplaceItem.setQuantity("2"); |
| 179 | + optionReplaceItem.setOrders(optionReplaceItemLegList); |
| 180 | + List<OptionOrderItem> optionReplaceItemList = new ArrayList<>(); |
| 181 | + optionReplaceItemList.add(optionReplaceItem); |
| 182 | + OptionOrder optionReplace = new OptionOrder(); |
| 183 | + optionReplace.setModifyOrders(optionReplaceItemList); |
| 184 | + |
| 185 | + logger.info("replaceOptionRequest: {}", optionReplace); |
| 186 | + TradeOrderResponse replaceOptionResponse = apiService.replaceOption(accountId, optionReplace); |
| 187 | + logger.info("replaceOptionResponse: {}", replaceOptionResponse); |
| 188 | + Thread.sleep(5000L); |
| 189 | + |
| 190 | + OptionOrder cancelTradeOption = new OptionOrder(); |
| 191 | + cancelTradeOption.setClientOrderId(optionOrderItem.getClientOrderId()); |
| 192 | + |
| 193 | + logger.info("cancelOptionRequest: {}", cancelTradeOption); |
| 194 | + TradeOrderResponse cancelOptionResponse = apiService.cancelOption(accountId, cancelTradeOption); |
| 195 | + logger.info("cancelOptionResponse: {}", cancelOptionResponse); |
| 196 | + |
114 | 197 | } catch (ClientException ex) { |
115 | 198 | logger.error("Client error", ex); |
116 | 199 | } catch (ServerException ex) { |
|
0 commit comments