def context_setting(self): """ API trading and quote context setting :returns: trade context, quote context """ if self.unlock_password == "": raise Exception("请先配置交易解锁密码! password: {}".format( self.unlock_password)) quote_ctx = ft.OpenQuoteContext(host=self.api_svr_ip, port=self.api_svr_port) if 'HK.' in self.stock: trade_ctx = ft.OpenHKTradeContext(host=self.api_svr_ip, port=self.api_svr_port) if self.trade_env == ft.TrdEnv.REAL: ret_code, ret_data = trade_ctx.unlock_trade( self.unlock_password) if ret_code == ft.RET_OK: print('解锁交易成功!') else: raise Exception("请求交易解锁失败: {}".format(ret_data)) else: print('解锁交易成功!') elif 'US.' in self.stock: if self.trade_env != 0: raise Exception("美股交易接口不支持仿真环境 trade_env: {}".format( self.trade_env)) trade_ctx = ft.OpenUSTradeContext(host=self.api_svr_ip, port=self.api_svr_port) else: raise Exception("stock输入错误 stock: {}".format(self.stock)) return quote_ctx, trade_ctx
def open_api(self): SQLog.info("open_api,quote already open=", self.is_open()) if self._quote_ctx is None: self._quote_ctx = futu.OpenQuoteContext(self.ApiIP, self.ApiPort) if self._trade_ctx is None: if self.Market == futu.Market.HK: self._trade_ctx = futu.OpenHKTradeContext( self.ApiIP, self.ApiPort) elif self.Market == futu.Market.US: self._trade_ctx = futu.OpenUSTradeContext( self.ApiIP, self.ApiPort) else: raise Exception("open_api failed,Market parameter wrong.") if self.EnvType == futu.TrdEnv.REAL: ret, data = self._trade_ctx.unlock_trade( self.TradePassword, self.TradePasswordMd5) if futu.RET_OK != ret: raise Exception( "open_api failed,unlock_trade failed,data=" + str(data)) ret, data = self._trade_ctx.get_acc_list() SQLog.debug("open_api,get_acc_list,ret=", ret, "data=\n", data) self._trade_ctx.set_handler(TradeOrderHanbler(self)) self._trade_ctx.set_handler(TradeDealHandler()) self._trade_ctx.start() super().open_api() if self.AveVolaStockCodes and self._frame: self._frame.load_savequote_data( self.AveVolaStockCodes.split(',')) return True
def context_setting(api_svr_ip, api_svr_port, unlock_password): quote_ctx = ft.OpenQuoteContext(host=api_svr_ip, port=api_svr_port) hk_trade_ctx = ft.OpenHKTradeContext(host=api_svr_ip, port=api_svr_port) ret_code, ret_data = hk_trade_ctx.unlock_trade(unlock_password) if ret_code != ft.RET_OK: hk_trade_ctx = None hkcc_trade_ctx = ft.OpenHKCCTradeContext(host=api_svr_ip, port=api_svr_port) ret_code, ret_data = hkcc_trade_ctx.unlock_trade(unlock_password) if ret_code != ft.RET_OK: hkcc_trade_ctx = None us_trade_ctx = ft.OpenUSTradeContext(host=api_svr_ip, port=api_svr_port) ret_code, ret_data = us_trade_ctx.unlock_trade(unlock_password) if ret_code != ft.RET_OK: us_trade_ctx = None return quote_ctx, hk_trade_ctx, hkcc_trade_ctx, us_trade_ctx
def __init__(self, password): """ https://futunnopen.github.io/futuquant/api/Market_API_Python_Doc.html """ self.quote_ctx = ft.OpenQuoteContext(host="127.0.0.1", port=11111) self.USTrade_ctx = ft.OpenUSTradeContext(host='127.0.0.1', port=11111) self.HKTrade_ctx = ft.OpenHKTradeContext(host='127.0.0.1', port=11111) self.quote_ctx.start() self.USTrade_ctx.start() self.HKTrade_ctx.start() self.password = password
def _process_init_api(self): if type(self._quote_ctx) != int or type(self._trade_ctx) != int: return # 创建futu api对象 if self._quote_ctx == 0: self._quote_ctx = ft.OpenQuoteContext(self._api_ip, self._api_port) if self._trade_ctx == 0: if self._market == MARKET_HK: self._trade_ctx = ft.OpenHKTradeContext( self._api_ip, self._api_port) elif self._market == MARKET_US: self._trade_ctx = ft.OpenUSTradeContext( self._api_ip, self._api_port) else: raise Exception("error param!") if self._env_type == ft.TrdEnv.REAL: ret, _ = self._trade_ctx.unlock_trade(self._trade_password) if 0 != ret: raise Exception("error param!") # 开始futu api异步数据推送 self._quote_ctx.start() self._trade_ctx.start() # 市场状态检查 self._check_market_event = FutuMarketEvent(self._market, self._quote_ctx, self._event_engine) #定阅行情数据 self._futu_data_event = FutuDataEvent(self, self._quote_ctx, self._event_engine, self._tiny_strate.symbol_pools) # 启动事件 self._tiny_strate.on_start()
print('smart_sell 下单失败:{}'.format(data)) return None else: print('smart_sell 下单成功') print(data) return data if __name__ == "__main__": ip = '127.0.0.1' port = 11111 code = 'HK.00700' unlock_pwd = '123456' trd_env = ft.TrdEnv.SIMULATE order_type = ft.OrderType.NORMAL quote_ctx = ft.OpenQuoteContext(ip, port) trd_ctx = ft.OpenHKTradeContext(ip, port) quote_ctx.subscribe(code, ft.SubType.ORDER_BOOK) if trd_env == ft.TrdEnv.REAL: print("* unlock_trade:{}".format(trd_ctx.unlock_trade(unlock_pwd))) # simple_sell(quote_ctx, trd_ctx, code, 380.0, 100, trd_env, order_type) smart_sell(quote_ctx, trd_ctx, code, 2600, trd_env, order_type) # smart_buy(quote_ctx, trd_ctx, code, 1000, trd_env, order_type) # quote_ctx.close() # trd_ctx.close()
print(quote_ctx.get_market_snapshot(code_list)) # 获取市场快照 print(quote_ctx.get_plate_list(market, ft.Plate.ALL)) # 获取板块集合下的子板块列表 print(quote_ctx.get_plate_stock(plate)) # 获取板块下的股票列表 # 高频数据接口 quote_ctx.subscribe(code, [ft.SubType.QUOTE, ft.SubType.TICKER, ft.SubType.K_DAY, ft.SubType.ORDER_BOOK, ft.SubType.RT_DATA, ft.SubType.BROKER]) print(quote_ctx.get_stock_quote(code)) # 获取报价 print(quote_ctx.get_rt_ticker(code)) # 获取逐笔 print(quote_ctx.get_cur_kline(code, num=100, ktype=ft.KLType.K_DAY)) #获取当前K线 print(quote_ctx.get_order_book(code)) # 获取摆盘 print(quote_ctx.get_rt_data(code)) # 获取分时数据 print(quote_ctx.get_broker_queue(code)) # 获取经纪队列 # 停止异步数据接收 quote_ctx.stop() # 关闭对象 quote_ctx.close() # 实例化港股交易上下文对象 trade_hk_ctx = ft.OpenHKTradeContext(host="127.0.0.1", port=11111) # 交易接口列表 print(trade_hk_ctx.unlock_trade(password='******')) # 解锁接口 print(trade_hk_ctx.accinfo_query(trd_env=ft.TrdEnv.SIMULATE)) # 查询账户信息 print(trade_hk_ctx.place_order(price=1.1, qty=2000, code=code, trd_side=ft.TrdSide.BUY, order_type=ft.OrderType.NORMAL, trd_env=ft.TrdEnv.SIMULATE)) # 下单接口 print(trade_hk_ctx.order_list_query(trd_env=ft.TrdEnv.SIMULATE)) # 查询订单列表 print(trade_hk_ctx.position_list_query(trd_env=ft.TrdEnv.SIMULATE)) # 查询持仓列表 trade_hk_ctx.close()
import futu as ft import pandas as pd import numpy as np import configparser config = configparser.ConfigParser() config.read('futu.config') pwd_unlock = config['DEFAULT']['Password'] trd_ctx = ft.OpenHKTradeContext(host='127.0.0.1', port=11111) trd_ctx.unlock_trade(pwd_unlock) deal_list = trd_ctx.history_deal_list_query(start=config['HK']['StartDate'], end=config['HK']['EndDate']) print(pd.DataFrame.to_csv(deal_list[1])) trd_ctx.close()