| | |
| | | |
| | | from __future__ import print_function, absolute_import |
| | | |
| | | import schedule |
| | | |
| | | # import gm.api as gmapi |
| | | |
| | | from cancel_strategy.s_l_h_cancel_strategy import LCancelBigNumComputer |
| | | from code_attribute import big_money_num_manager, global_data_loader, gpcode_manager, gpcode_first_screen_manager |
| | | from db.redis_manager_delegate import RedisUtils |
| | | from ths import client_manager |
| | | import constant |
| | | from code_attribute.code_nature_analyse import LatestMaxVolumeManager, HighIncreaseCodeManager, CodeNatureRecordManager |
| | | from l2.l2_sell_manager import L2MarketSellManager |
| | | from l2.l2_transaction_data_manager import HuaXinBuyOrderManager |
| | | from third_data.third_blocks_manager import InvalidBlockManager, CodeThirdBlocksManager |
| | | from trade.buy_money_count_setting import BuyMoneyAndCountSetting |
| | | from trade.deal_big_money_manager import DealOrderNoManager |
| | | from trade.trade_manager import AccountAvailableMoneyManager |
| | | from utils import global_util, tool |
| | | import threading |
| | | from trade.trade_manager import AutoCancelSellModeManager |
| | | from utils import tool |
| | | |
| | | import server |
| | | |
| | | from db import redis_manager_delegate as redis_manager |
| | | from user import authority |
| | | import decimal |
| | | |
| | | from third_data.history_k_data_util import HistoryKDatasUtils |
| | | from trade import l2_trade_util, trade_manager |
| | | from l2.cancel_buy_strategy import L2LimitUpSellStatisticUtil, LCancelBigNumComputer, DCancelBigNumComputer |
| | | from log_module.log import logger_juejin_tick, logger_system |
| | | from trade.trade_data_manager import CodeActualPriceProcessor |
| | | from trade.trade_queue_manager import JueJinBuy1VolumnManager |
| | | |
| | | redisManager = redis_manager.RedisManager(0) |
| | | __jueJinBuy1VolumnManager = JueJinBuy1VolumnManager() |
| | | __actualPriceProcessor = CodeActualPriceProcessor() |
| | | |
| | | |
| | | # 设置账户信息 |
| | | def setAccountInfo(accountId, strategyId, token): |
| | | redis = redisManager.getRedis() |
| | | try: |
| | | RedisUtils.set(redis, "juejin-account-id", accountId, auto_free=False) |
| | | RedisUtils.set(redis, "juejin-strategy-id", strategyId, auto_free=False) |
| | | RedisUtils.set(redis, "juejin-token", token, auto_free=False) |
| | | finally: |
| | | RedisUtils.realse(redis) |
| | | |
| | | |
| | | def getAccountInfo(): |
| | | redis = redisManager.getRedis() |
| | | try: |
| | | account_id = RedisUtils.get(redis, "juejin-account-id", auto_free=False) |
| | | strategy_id = RedisUtils.get(redis, "juejin-strategy-id", auto_free=False) |
| | | token = RedisUtils.get(redis, "juejin-token", auto_free=False) |
| | | return account_id, strategy_id, token |
| | | finally: |
| | | RedisUtils.realse(redis) |
| | | from trade import l2_trade_util |
| | | from l2.cancel_buy_strategy import L2LimitUpSellStatisticUtil |
| | | from log_module.log import logger_system |
| | | from trade.trade_data_manager import PlaceOrderCountManager, AccountMoneyManager |
| | | from utils.ths_industry_util import ThsCodeIndustryManager |
| | | |
| | | |
| | | def init_data(): |
| | |
| | | L2LimitUpSellStatisticUtil().clear() |
| | | # 重置所有的大单数据 |
| | | big_money_num_manager.reset_all() |
| | | # 清除水下捞数据 |
| | | __actualPriceProcessor.clear_under_water_data() |
| | | # 载入行业股票代码 |
| | | global_data_loader.load_industry() |
| | | # 载入代码自由流通市值 |
| | |
| | | # 载入量 |
| | | global_data_loader.load_volumn() |
| | | # 初始化载入 |
| | | AccountAvailableMoneyManager() |
| | | AccountMoneyManager() |
| | | # 初始化载入 |
| | | AutoCancelSellModeManager() |
| | | |
| | | ThsCodeIndustryManager() |
| | | |
| | | InvalidBlockManager() |
| | | |
| | | CodeThirdBlocksManager() |
| | | |
| | | BuyMoneyAndCountSetting() |
| | | |
| | | gpcode_manager.WantBuyCodesManager() |
| | | |
| | | # 9点25之前删除所有代码 |
| | | if tool.trade_time_sub(tool.get_now_time_str(), "09:25:00") <= 0: |
| | |
| | | # 删除禁止代码 |
| | | l2_trade_util.init_forbidden_trade_codes() |
| | | # 清空白名单 |
| | | l2_trade_util.WhiteListCodeManager().clear() |
| | | gpcode_manager.WhiteListCodeManager().clear() |
| | | # 清空想要买 |
| | | gpcode_manager.WantBuyCodesManager().clear() |
| | | # 清空分数禁止代码 |
| | | trade_manager.ForbiddenBuyCodeByScoreManager().clear() |
| | | # 清空暂停交易代码 |
| | | gpcode_manager.PauseBuyCodesManager().clear() |
| | | # 清除L撤数据 |
| | | LCancelBigNumComputer().clear() |
| | | # 清除D撤数据 |
| | | DCancelBigNumComputer().clear() |
| | | # 清除大单成交数据 |
| | | DealOrderNoManager().clear() |
| | | # 最近是否有最大量 |
| | | LatestMaxVolumeManager().clear() |
| | | # L2卖行情清除 |
| | | L2MarketSellManager().clear() |
| | | # 涨幅过高代码 |
| | | HighIncreaseCodeManager().clear() |
| | | # 股性清除 |
| | | CodeNatureRecordManager().clear() |
| | | # 下单次数清除 |
| | | PlaceOrderCountManager().clear() |
| | | |
| | | |
| | | # 每日初始化 |
| | |
| | | # if not tool.is_init_time() or True: |
| | | # raise Exception("交易时间不能初始化") |
| | | init_data() |
| | | codes = gpcode_manager.get_gp_list() |
| | | logger_system.info("每日初始化") |
| | | |
| | | # 今日实时涨停 |
| | | global_data_loader.add_limit_up_codes([], True) |
| | | # 主要获取收盘价 |
| | | __get_latest_info(None) |
| | | # 获取60天最大量与昨日量 |
| | | global_util.today_volumn.clear() |
| | | global_util.max60_volumn.clear() |
| | | global_util.yesterday_volumn.clear() |
| | | # 清除大单数据 |
| | | global_util.big_money_num.clear() |
| | | # 初始化大单数据 |
| | | for code in codes: |
| | | big_money_num_manager.add_num(code, 0) |
| | | big_money_num_manager.expire(code) |
| | | # 清除涨停时间 |
| | | global_util.limit_up_time.clear() |
| | | |
| | | # 初始化同花顺主站 |
| | | if constant.L2_SOURCE_TYPE == constant.L2_SOURCE_TYPE_THS: |
| | | l2_clients = client_manager.getValidL2Clients() |
| | | for client in l2_clients: |
| | | try: |
| | | server.repair_ths_main_site(client) |
| | | except Exception as e: |
| | | pass |
| | | |
| | | |
| | | def __run_schedule(): |
| | | while True: |
| | | schedule.run_pending() |
| | | |
| | | |
| | | def init(context): |
| | | # gmapi.subscribe(symbols="SZSE.002529", frequency="1d", count=30) |
| | | # 订阅浦发银行, bar频率为一天和一分钟 |
| | | # 订阅订阅多个频率的数据,可多次调用subscribe |
| | | # 获取需要监听的股票 |
| | | init_data() |
| | | logger_system.info("掘金初始化") |
| | | schedule.every().day.at("09:15:00").do(everyday_init) |
| | | t1 = threading.Thread(target=lambda: __run_schedule()) |
| | | # 后台运行 |
| | | t1.setDaemon(True) |
| | | t1.start() |
| | | |
| | | # 多个时间点获取收盘价 |
| | | gmapi.schedule(schedule_func=__get_latest_info, date_rule='1d', time_rule='09:28:00') |
| | | |
| | | # 初始化内容 |
| | | clients = authority.get_l2_clients() |
| | | for client in clients: |
| | | for i in range(0, constant.L2_CODE_COUNT_PER_DEVICE): |
| | | gpcode_manager.init_listen_code_by_pos(client, i) |
| | | |
| | | |
| | | def __get_latest_info(context): |
| | | # 初始化内容 |
| | | clients = authority.get_l2_clients() |
| | | for c in clients: |
| | | for i in range(0, constant.L2_CODE_COUNT_PER_DEVICE): |
| | | gpcode_manager.init_listen_code_by_pos(int(c), i) |
| | | codes = gpcode_manager.get_gp_list() |
| | | result = HistoryKDatasUtils.get_gp_latest_info(codes) |
| | | for item in result: |
| | | sec_level = item['sec_level'] |
| | | symbol = item['symbol'] |
| | | symbol = symbol.split(".")[1] |
| | | pre_close = tool.to_price(decimal.Decimal(str(item['pre_close']))) |
| | | if sec_level == 1: |
| | | if symbol in codes: |
| | | gpcode_manager.CodePrePriceManager.set_price_pre(symbol, pre_close) |
| | | else: |
| | | gpcode_manager.rm_gp(symbol) |
| | | |
| | | |
| | | # 获取最新的信息 |
| | | def __get_current_info(): |
| | | data = gpcode_manager.get_gp_list() |
| | | results = HistoryKDatasUtils.get_gp_current_info(data) |
| | | logger_juejin_tick.debug("定时获取:{}", results) |
| | | for result in results: |
| | | price = result["price"] |
| | | symbol = result['symbol'] |
| | | # 保存最新价 |
| | | symbol = symbol.split(".")[1] |
| | | |
| | | |
| | | # 设置收盘价 |
| | | def re_set_price_pre(code): |
| | | codes = [code] |
| | | re_set_price_pres(codes) |
| | | |
| | | |
| | | def re_set_price_pres(codes, force=False): |
| | | result = HistoryKDatasUtils.get_gp_latest_info(codes) |
| | | for item in result: |
| | | symbol = item['symbol'] |
| | | symbol = symbol.split(".")[1] |
| | | pre_close = tool.to_price(decimal.Decimal(str(item['pre_close']))) |
| | | gpcode_manager.CodePrePriceManager.set_price_pre(symbol, pre_close, force) |
| | | |
| | | |
| | | __prices_now = {} |
| | | |
| | | |
| | | # 获取近90天的最大量与最近的量 |
| | | # 获取最近一次涨停/涨停下一个交易日的最大值 |
| | | def get_volumns_by_code(code, count=60) -> object: |
| | | datas = HistoryKDatasUtils.get_history_tick_n(code, count, "open,high,low,close,volume,pre_close,bob,amount") |
| | | # 计算 |
| | | datas.sort(key=lambda x: x["bob"], reverse=True) |
| | | return datas |
| | | |
| | | |
| | | # 解析最大量 |
| | | def parse_max_volume(datas, is_new_top=False): |
| | | max_volume = 0 |
| | | |
| | | max_volume_date = None |
| | | if is_new_top: |
| | | # 如果是突破前高就取最大量 |
| | | for item in datas: |
| | | if max_volume < item["volume"]: |
| | | max_volume = item["volume"] |
| | | max_volume_date = item["bob"] |
| | | return max_volume, max_volume, max_volume_date.strftime("%Y-%m-%d") |
| | | else: |
| | | |
| | | date = None |
| | | target_volume = None |
| | | for i in range(len(datas)): |
| | | # 查询涨停 |
| | | item = datas[i] |
| | | volume = item["volume"] |
| | | if max_volume < volume: |
| | | max_volume = volume |
| | | max_volume_date = item['bob'] |
| | | # 是否有涨停 |
| | | limit_up_price = float(gpcode_manager.get_limit_up_price_by_preprice(item["pre_close"])) |
| | | if abs(limit_up_price - item["high"]) < 0.01: |
| | | # 涨停 |
| | | next_volume = 0 |
| | | if i > 0: |
| | | next_volume = datas[i - 1]["volume"] |
| | | date = datas[i]["bob"] |
| | | if volume < next_volume: |
| | | volume = next_volume |
| | | date = datas[i - 1]["bob"] |
| | | target_volume = (volume, date) |
| | | break |
| | | if not target_volume: |
| | | target_volume = (max_volume, max_volume_date) |
| | | |
| | | # --判断近60天无涨停的最大量 |
| | | max_60_volume_info = [0, None] |
| | | # 60天内是否有涨停 |
| | | has_60_limit_up = False |
| | | for i in range(60): |
| | | if i >= len(datas): |
| | | break |
| | | item = datas[i] |
| | | volume = item["volume"] |
| | | if max_60_volume_info[0] < volume: |
| | | max_60_volume_info = [volume, item["bob"]] |
| | | limit_up_price = float(gpcode_manager.get_limit_up_price_by_preprice(item["pre_close"])) |
| | | if abs(limit_up_price - item["high"]) < 0.01: |
| | | has_60_limit_up = True |
| | | break |
| | | |
| | | if not has_60_limit_up and target_volume[0] > max_60_volume_info[0] * 3: |
| | | # 60天内无涨停,且60天内最大量小于最大量的1/3,判断为地量,返回近60个交易日的最大量 |
| | | return max_60_volume_info[0], max_60_volume_info[0], max_60_volume_info[1].strftime("%Y-%m-%d") |
| | | else: |
| | | return target_volume[0], target_volume[0], target_volume[1].strftime("%Y-%m-%d") |
| | | # 保存运行时数据 |
| | | def save_running_data(): |
| | | HuaXinBuyOrderManager().sync_dealing_data_to_db() |
| | | |
| | | |
| | | if __name__ == '__main__': |