| | |
| | | """ |
| | | 同花顺交易操作工具 |
| | | 掘金交易 |
| | | """ |
| | | import json |
| | | import logging |
| | | import time |
| | | |
| | | import gm.api as gmapi |
| | | # import gm.api as gmapi |
| | | # gmapi.set_token(token) |
| | | |
| | | import constant |
| | | from code_attribute import gpcode_manager |
| | | from db.redis_manager import RedisManager |
| | | from logs_.log import logger_juejin_trade |
| | | from db.redis_manager_delegate import RedisManager, RedisUtils |
| | | from log_module.log import logger_juejin_trade |
| | | from utils import network_util, tool |
| | | |
| | | __context_dict = {} |
| | | |
| | | account_id = "77916efb-b856-46ee-9680-71be0fe18a42" |
| | | token = "38fb624832c1949708c7600abaf1e863d27663b3" |
| | | gmapi.set_token(token) |
| | | |
| | | |
| | | |
| | | # gmapi.set_account_id(account_id) |
| | |
| | | # 添加订单ID |
| | | @classmethod |
| | | def add_order_id(cls, code, account_id, order_id): |
| | | cls.__get_redis().sadd(f"juejin_order_id-{code}", json.dumps((account_id, order_id))) |
| | | cls.__get_redis().expire(f"juejin_order_id-{code}", tool.get_expire()) |
| | | RedisUtils.sadd(cls.__get_redis(),f"juejin_order_id-{code}", json.dumps((account_id, order_id))) |
| | | RedisUtils.expire(cls.__get_redis(), f"juejin_order_id-{code}", tool.get_expire()) |
| | | |
| | | # 删除订单ID |
| | | @classmethod |
| | | def remove_order_id(cls, code, account_id, order_id): |
| | | cls.__get_redis().srem(f"juejin_order_id-{code}", json.dumps((account_id, order_id))) |
| | | RedisUtils.srem(cls.__get_redis(), f"juejin_order_id-{code}", json.dumps((account_id, order_id))) |
| | | |
| | | # 查询所有的订单号 |
| | | @classmethod |
| | | def list_order_ids(cls, code): |
| | | return cls.__get_redis().smembers(f"juejin_order_id-{code}") |
| | | return RedisUtils.smembers(cls.__get_redis(), f"juejin_order_id-{code}") |
| | | |
| | | |
| | | def init(context): |
| | |
| | | def order_volume(code, price, count): |
| | | if not constant.TRADE_ENABLE: |
| | | return |
| | | if code.find("00") != 0 and code.find("60") != 0: |
| | | if not tool.is_can_buy_code(code): |
| | | raise Exception("只支持00开头与60开头的代码下单") |
| | | code_str = code |
| | | if code[0:2] == '00': |
| | | if tool.is_sz_code(code): |
| | | code_str = f"SZSE.{code}" |
| | | elif code[0:2] == '60': |
| | | elif tool.is_sh_code(code): |
| | | code_str = f"SHSE.{code}" |
| | | start_time = time.time() |
| | | results = gmapi.order_volume(code_str, count, gmapi.OrderSide_Buy, gmapi.OrderType_Limit, gmapi.PositionEffect_Open, |
| | |
| | | logger_juejin_trade.info(f"{code}:下单失败:{result['ord_rej_reason_detail']}") |
| | | raise Exception(result["ord_rej_reason_detail"]) |
| | | else: |
| | | TradeOrderIdManager.add_order_id(code, result["account_id"], result["cl_ord_id"]) |
| | | TradeOrderIdManager().add_order_id(code, result["account_id"], result["cl_ord_id"]) |
| | | logger_juejin_trade.info(f"{code}:下单成功 ord_id:{result['cl_ord_id']}") |
| | | return result["symbol"].split(".")[1], result["account_id"], result["cl_ord_id"] |
| | | else: |
| | |
| | | |
| | | # 撤单 |
| | | def cancel_order(code): |
| | | orders_info = TradeOrderIdManager.list_order_ids(code) |
| | | orders_info = TradeOrderIdManager().list_order_ids(code) |
| | | orders = [] |
| | | if orders_info: |
| | | for order in orders_info: |
| | |
| | | gmapi.order_cancel(orders) |
| | | logger_juejin_trade.info(f"{code}:撤单成功,撤单数量:{len(orders)}") |
| | | for order in orders: |
| | | TradeOrderIdManager.remove_order_id(code, order["account_id"], order["cl_ord_id"]) |
| | | TradeOrderIdManager().remove_order_id(code, order["account_id"], order["cl_ord_id"]) |
| | | |
| | | |
| | | # 撤单 |
| | |
| | | |
| | | |
| | | def run(): |
| | | print("启动读取掘金交易数据") |
| | | # strategy_id = "e97a257e-1bba-11ed-a1b1-00e070c694ff" |
| | | # token = "a2eed2b159e9238dc0353fc3e73734d7677f7baf" |
| | | # gmapi.run(strategy_id, filename="trade.trade_juejin.py", mode=gmapi.MODE_LIVE, token=token) |
| | | while True: |
| | | try: |
| | | if tool.is_trade_time(): |
| | | datas = get_execution_reports() |
| | | # 上传数据 |
| | | fdatas = [] |
| | | for d in datas: |
| | | fdatas.append( |
| | | {"code": d[0], "money": d[4], "num": d[2], "price": d[3], "time": d[7], "trade_num": d[5], |
| | | "type": d[1] - 1}) |
| | | if fdatas: |
| | | network_util.send_socket_msg("127.0.0.1", 9001, {"type": 3, "data": fdatas}) |
| | | except Exception as e: |
| | | logging.exception(e) |
| | | # 2s更新 |
| | | time.sleep(1.5) |
| | | if constant.TRADE_WAY == constant.TRADE_WAY_JUEJIN: |
| | | print("启动读取掘金交易数据") |
| | | # strategy_id = "e97a257e-1bba-11ed-a1b1-00e070c694ff" |
| | | # token = "a2eed2b159e9238dc0353fc3e73734d7677f7baf" |
| | | # gmapi.run(strategy_id, filename="trade.trade_juejin.py", mode=gmapi.MODE_LIVE, token=token) |
| | | while True: |
| | | try: |
| | | if tool.is_trade_time(): |
| | | datas = get_execution_reports() |
| | | # 上传数据 |
| | | fdatas = [] |
| | | for d in datas: |
| | | fdatas.append( |
| | | {"code": d[0], "money": d[4], "num": d[2], "price": d[3], "time": d[7], "trade_num": d[5], |
| | | "type": d[1] - 1}) |
| | | if fdatas: |
| | | network_util.send_socket_msg("127.0.0.1", 9001, {"type": 3, "data": fdatas}) |
| | | except Exception as e: |
| | | logging.exception(e) |
| | | # 2s更新 |
| | | time.sleep(1.5) |
| | | |
| | | |
| | | # 获取成交列表,返回的内容为:[(代码,买(1)/卖(2),量,价格,成交金额,订单ID,委托客户端ID,成交时间,成交日期)] |