| | |
| | | """ |
| | | import time |
| | | |
| | | from log_module import async_log_util |
| | | from log_module.log import hx_logger_trade_debug, logger_real_place_order_position |
| | | |
| | | _place_order_info_dict = {} |
| | |
| | | |
| | | # 下单 |
| | | def place_order(code, price, volume, exec_index): |
| | | logger_real_place_order_position.info("下单:code-{} price-{} volume-{} exec-index-{}", code, price, volume, |
| | | exec_index) |
| | | async_log_util.info(logger_real_place_order_position, |
| | | f"下单:code-{code} price-{price} volume-{volume} exec-index-{exec_index}") |
| | | _place_order_info_dict[code] = (price, volume, exec_index, time.time()) |
| | | |
| | | |
| | |
| | | def get_order_info(code): |
| | | info = _place_order_info_dict.get(code) |
| | | if info and time.time() - info[3] > 3: |
| | | logger_real_place_order_position.info("get_order_info 间隔3s以上:code-{}", code) |
| | | async_log_util.info(logger_real_place_order_position, "get_order_info 间隔3s以上:code-{}", code) |
| | | # 间隔3s以上就无效了 |
| | | info = None |
| | | _place_order_info_dict.pop(code) |
| | |
| | | if d["index"] <= exec_index: |
| | | continue |
| | | # 获取到了下单位置 |
| | | hx_logger_trade_debug.info(f"真实下单位置:{code}-{d['index']}") |
| | | logger_real_place_order_position.info(f"真实下单位置:{code}-{d['index']}") |
| | | async_log_util.info(hx_logger_trade_debug, f"真实下单位置:{code}-{d['index']}") |
| | | async_log_util.info(logger_real_place_order_position, f"真实下单位置:{code}-{d['index']}") |
| | | if code in _place_order_info_dict: |
| | | _place_order_info_dict.pop(code) |
| | | __place_order_position[code] = d['index'] |
| | |
| | | # volume:交易量 |
| | | # price:价格(如果是卖时不传价格就按照5挡价卖) |
| | | # blocking是否阻塞进程 |
| | | def order(direction, code, volume, price, price_type=2, blocking=False, sinfo=None, request_id=None): |
| | | def order(direction, code, volume, price, price_type=2, blocking=False, sinfo=None, request_id=None,local_order_id = None): |
| | | timestamp = round(time.time() * 1000) |
| | | if not sinfo: |
| | | sinfo = f"b_{code}_{timestamp}" |
| | | local_order_id = f"l_{code}_{direction}_{volume}_{timestamp}_{random.randint(0, 999)}" |
| | | if not local_order_id: |
| | | local_order_id = f"l_{code}_{direction}_{volume}_{timestamp}_{random.randint(0, 999)}" |
| | | request_id = __request(ClientSocketManager.CLIENT_TYPE_TRADE, |
| | | {"type": ClientSocketManager.CLIENT_TYPE_TRADE, "trade_type": 1, |
| | | "direction": direction, |
| | |
| | | |
| | | |
| | | # 通过量下单,返回(代码,账号ID,订单号) |
| | | def order_volume(code, price, count, last_data_index): |
| | | def order_volume(code, price, count, last_data_index, local_order_id=None): |
| | | async_log_util.info(logger_trade, f"{code}下单方法开始") |
| | | price = round(float(price), 2) |
| | | if code.find("00") != 0 and code.find("60") != 0: |
| | | raise Exception("只支持00开头与60开头的代码下单") |
| | | start_time = time.time() |
| | | # 保存下单信息 |
| | | huaxin.huaxin_delegate_postion_manager.place_order(code, price, count, last_data_index) |
| | | if not constant.TRADE_ENABLE: |
| | |
| | | blocking = False |
| | | try: |
| | | async_log_util.info(logger_trade, f"{code}下单开始") |
| | | result = huaxin_trade_api.order(1, code, count, price, blocking=blocking) |
| | | result = huaxin_trade_api.order(1, code, count, price, blocking=blocking, local_order_id=local_order_id) |
| | | async_log_util.info(logger_trade, f"{code}下单结束") |
| | | except Exception as e: |
| | | if str(e).find("超时") >= 0: |
| | |
| | | # 交易管理器 |
| | | import datetime |
| | | import json |
| | | import random |
| | | import threading |
| | | import time |
| | | |
| | |
| | | from l2 import l2_data_manager, l2_data_log |
| | | |
| | | from log_module.log import * |
| | | from trade.huaxin.huaxin_trade_record_manager import TradeOrderIdManager |
| | | from utils import import_util, tool |
| | | |
| | | trade_gui = import_util.import_lib("trade.trade_gui") |
| | |
| | | print("开始买入") |
| | | async_log_util.info(logger_trade, "{}开始买入".format(code)) |
| | | __CodesTradeStateManager.set_trade_state(code, TRADE_STATE_BUY_PLACE_ORDER) |
| | | # 状态改变过后必须要有本地下单编号 |
| | | # _start_time = l2_data_log.l2_time(code, tool.get_now_timestamp() - _start_time, "买入判断时间", force=True) |
| | | __buy(code, price, trade_state, capture_timestamp, last_data, last_data_index) |
| | | # l2_data_log.l2_time(code, tool.get_now_timestamp() - _start_time, "异步买入时间", force=True) |
| | |
| | | if constant.TRADE_WAY == constant.TRADE_WAY_JUEJIN: |
| | | trade_juejin.order_volume(code, price, count) |
| | | elif constant.TRADE_WAY == constant.TRADE_WAY_HUAXIN: |
| | | trade_huaxin.order_volume(code, price, count, last_data_index) |
| | | local_order_id = create_local_order_id(code) |
| | | TradeOrderIdManager().add_local_order_id(code, local_order_id) |
| | | trade_huaxin.order_volume(code, price, count, last_data_index, local_order_id=local_order_id) |
| | | else: |
| | | guiTrade.buy(code, price) |
| | | __place_order_success(code, capture_timestamp, last_data, last_data_index) |
| | |
| | | RedisUtils.realse(redis_l2) |
| | | |
| | | |
| | | # 生成本地订单号 |
| | | def create_local_order_id(code): |
| | | local_order_id = f"l_{code}_{1}_{round(time.time() * 1000)}_{random.randint(0, 999)}" |
| | | return local_order_id |
| | | |
| | | |
| | | if __name__ == "__main__": |
| | | print(CodesTradeStateManager().get_codes_by_trade_states_cache([0, 1])) |
| | | print(CodesTradeStateManager().get_trade_state_cache("002235")) |