def sync_status():
    """
    Get current sync status
    :request:
    type=0|1|2|3  // 0 为同步分钟级别数据(实际间隔为30s,我们认为30s同为分钟数据)
                  // 1 为同步1秒级别数据,实际间隔为1s
                  // 2 为同步tick数据
                  // 3 为同步Realtime实时数据,30s间隔同步一次数据库(提前停止会导致最后30s数据丢失)


    :return:
    {
        "success": true  // 当前接口是否成功
        "data": {
            "status": 0|1 //0:当前未开启同步,1:当前已开启同步
        }
    }
    """
    t = int(request.args.get('type'))
    try:
        if t not in SUPPORTED_SYNC_TYPES:
            return parse_resp({'message': 'Type not supported.'}, False)
        return parse_resp(get_sync_status_helper(t))
    except Exception as e:
        return parse_resp({'message': str(e)}, False)
def start_sync():
    """
    Start sync stock data.

    :request:
    type=0|1|2|3  // 0 为同步分钟级别数据(实际间隔为30s,我们认为30s同为分钟数据)
                  // 1 为同步1秒级别数据,实际间隔为1s
                  // 2 为同步tick数据
                  // 3 为同步Realtime实时数据,30s间隔同步一次数据库(提前停止会导致最后30s数据丢失)

    :return:
    {
        "success": true  // 当前接口是否成功
        "data": {
            "status": 0|1|2 //0:同步进程未开启,已经开启,1:表示同步进程已经开启,不需要再开启,2:当前没有需要同步的股票数据
        }
    }
    """
    t = int(request.args.get('type'))
    try:
        if t not in SUPPORTED_SYNC_TYPES:
            return parse_resp({'message': 'Type not supported.'}, False)
        return parse_resp(start_sync_helper(t))
    except Exception as e:
        return parse_resp({'message': str(e)}, False)
def get_sync_metadata():
    """
    get stock sync metadata which could configure the query date, start date, duration or bar size

    :return:
    {
        "success": true  // 当前接口是否成功
        "data": [
            {
                "type": 1  // 配置类型为分钟级别数据(实际间隔为30s,我们认为30s同为分钟数据)
                "startDate": "20140606 00:00:00"  // 开始时间,同步股票数据不会超过开始时间
            },
            {
                "type": 2  // 配置类型为秒级别数据
                "startDate": "20140606 00:00:00"  // 开始时间,同步股票数据不会超过开始时间
            },
            {
                "type": 3  // 配置类型为tick类型数据
                "startDate": "20140606 00:00:00"  // 开始时间,同步股票数据不会超过开始时间
            }
              // 历史股票元数据配置信息
        ]
    }
    """
    try:
        return parse_resp(get_sync_metadata_helper())
    except Exception as e:
        return parse_resp({'message': str(e)}, False)
Beispiel #4
0
def get_symbols_info():
    """
    Start symbols syncing info.

    :request:
    isFuzzy=1
    code=US.H

    :return:
    {
        "success": true  // 当前接口是否成功
        "data": {
            "status": 0|1,  // 0为当前股票没有同步数据或者为模糊搜索状态,1为当前股票有同步数据
            "codeList": [  // 模糊搜索列表
                {
                    "symbol": "US.HUYA",  // 股票代码
                    "title": "虎牙",  // 公司名称
                    "date": "1969-12-31"  // 交易所日期
                },
                {
                    "symbol": "US.HMI",  // 股票代码
                    "title": "華米科技",  // 公司名称
                    "date": "1969-12-31"  // 交易所日期
                },
            ],
            "codeCnt": "US"  // 股票总数
            "syncInfo": { // 同步信息
                "1M": { // 分钟级数据, 秒级数据为1S,天级为1D,还有5分钟(5M),10分钟(10M),15分钟(15M),30分钟(30M)
                    "startDate": "2016-01-28 00:00:00", // 开始日期
                    "endDate": "2018-01-28 00:00:00" // 结束日期
                }
            }
        }
    }
    """
    try:
        data_map = {}
        is_fuzzy = bool(int(request.args.get('isFuzzy')))
        code = request.args.get('code')
        if not code:
            return parse_resp({'message': 'Code can\'t be empty'}, False)
        if is_fuzzy:
            res_list, cnt = fuzzy_query_code_list(code)
            data_map['codeList'] = res_list
            data_map['codeCnt'] = cnt
        else:
            data_map['syncInfo'] = query_sync_info(code)
        return parse_resp({'data': data_map})
    except Exception as e:
        return parse_resp({'message': str(e)}, False)
def config_sync_metadata():
    """
        Config stock sync metadata
        :request:
        {
            "metadata":[
                 {
                    "type": 1,  // 配置类型为分钟级别数据(实际间隔为30s,我们认为30s同为分钟数据)
                    "startDate": "20140606 00:00:00"  // 开始时间,同步股票数据不会超过开始时间
                 },
                 {
                    "type": 2,  // 配置类型为秒级别数据
                    "startDate": "20140606 00:00:00"  // 开始时间,同步股票数据不会超过开始时间
                 },
                 {
                    "type": 3,  // 配置类型为tick类型数据
                    "startDate": "20140606 00:00:00"  // 开始时间,同步股票数据不会超过开始时间
                 } // 历史股票元数据配置信息
            ]
        }
        :return:
        {
            "success": true  // 当前接口是否成功
            "data": {
                "metadata": [
                    {
                        "type": 1  // 配置类型为分钟级别数据(实际间隔为30s,我们认为30s同为分钟数据)
                        "startDate": "20140606 00:00:00"  // 开始时间,同步股票数据不会超过开始时间
                    },
                    {
                        "type": 2  // 配置类型为秒级别数据
                        "startDate": "20140606 00:00:00"  // 开始时间,同步股票数据不会超过开始时间
                    },
                    {
                        "type": 3  // 配置类型为tick类型数据
                        "startDate": "20140606 00:00:00"  // 开始时间,同步股票数据不会超过开始时间
                    } // 历史股票元数据配置信息
                ]
            }
        }
        """

    data = request.get_json()
    meta_data_list = data.get('metadata')
    if not meta_data_list:
        return parse_resp({'message': 'Metadata can\'t be empty.'}, False)
    try:
        return parse_resp(update_sync_metadata_helper(meta_data_list))
    except Exception as e:
        return parse_resp({'message': str(e)}, False)
def get_current_time():
    """
    Get current time

    :return:
    {
        "success": true  // 当前接口是否成功
        "data": {
            "time": 123123131 //获取当前时间
        }
    }
    """
    try:
        return parse_resp(get_current_time_helper())
    except Exception as e:
        return parse_resp({'message': str(e)}, False)
Beispiel #7
0
def sync_status():
    """
    Current sync status indicating if the server is syncing.

    :return:
    {
        "success": true  // 当前接口是否成功
        "data": {
            "status": 0|1|  //0:当前服务器没有同步数据,1:当前服务器正在同步数据
        }
    }
    """
    try:
        return parse_resp({
            'status':
            int(ManagedProcess.is_process_existed(TD_SYNC_PROCESS_NAME))
        })
    except Exception as e:
        return parse_resp({'message': str(e)}, False)
def config_sync_symbols():
    """
    Config symbols which has been or need syncing.
    :request:
    {
        "codeList": [  // symbol列表
            {
                "symbol": "US.HUYA",  // 股票代码
            },
            {
                "symbol": "US.HMI",  // 股票代码
            },
        ],
    }

    :return:
    {
        "success": true  // 当前接口是否成功
        "data": {
            "codeList": [  // symbol列表
                {
                    "symbol": "US.HUYA",  // 股票代码
                    "title": "虎牙",  // 公司名称
                    "date": "1969-12-31"  // 交易所日期
                },
                {
                    "symbol": "US.HMI",  // 股票代码
                    "title": "華米科技",  // 公司名称
                    "date": "1969-12-31"  // 交易所日期
                },
            ],
        }
    }
    """

    data = request.get_json()
    stocks = data.get('codeList')
    if not stocks:
        return parse_resp({'message': 'Stocks can\'t be empty.'}, False)
    try:
        return parse_resp(insert_sync_symbols_data_helper(stocks))
    except Exception as e:
        return parse_resp({'message': str(e)}, False)
Beispiel #9
0
def stop_sync():
    """
    Stop syncing.

    :return:
    {
        "success": true  // 当前接口是否成功
        "data": {
            "status": 0|1|  //0:正在同步,已经关闭,1: 已经关闭
        }
    }
    """
    try:
        is_td_process_existed = ManagedProcess.is_process_existed(
            TD_SYNC_PROCESS_NAME)
        if not is_td_process_existed:
            return parse_resp({'status': 1})

        ManagedProcess.remove_process(TD_SYNC_PROCESS_NAME)
        return parse_resp({'status': 0})
    except Exception as e:
        return parse_resp({'message': str(e)}, False)
def get_progress():
    """
    Get current sync progress

    :return:
    {
        "success": true  // 当前接口是否成功

        "data": {
            "1M": {
                 "histDataSyncTrack": {
                    "syncLogs": [  // 当前同步历史记录,最多显示20条,一条记录即一次得到的同步记录数据
                        {
                            "datetime": "20180510 12:00:03",  // log时间
                            "log": "[US.HUYA] xxxxxxx"  // 同步内容
                        }
                    ]
                }  // 历史股票数据同步轨迹
                "histDataSyncProgress": 0.4621, // 46.21% 同步进度
                "syncedSymbols": [{
                    "symbol": "US.HUYA"
                }]
            }, // 分钟级同步数据
            "1S": {
                ...
            }, // 秒级同步数据,格式同上
            "TICK": {
                ...
            } // Tick级同步数据,格式同上
            "REAL": {
                ...
            } // Real级同步数据,格式同上
        }
    }
    """
    try:
        return parse_resp(get_sync_progress_helper())
    except Exception as e:
        return parse_resp({'message': str(e)}, False)
def get_sync_symbols():
    """
    get symbols which has been or need syncing.
    :request
    code=US.AAPL  // 股票代码
    type=0  // 类型

    :return:
    {
        "success": true  // 当前接口是否成功
        "data": {
            "stocks": [  // symbol列表
                {
                    "symbol": "US.HUYA",  // 股票代码
                    "title": "虎牙",  // 公司名称
                    "date": "1969-12-31"  // 交易所日期,
                },
                {
                    "symbol": "US.HMI",  // 股票代码
                    "title": "華米科技",  // 公司名称
                    "date": "1969-12-31"  // 交易所日期
                },
            ],
            "syncInfo": {
                "startDate": "2016-01-28 00:00:00",
                "endDate": "2018-01-28 00:00:00"
            } // 同步信息
        }
    }
    """
    try:
        code = request.args.get('code')
        t = request.args.get('type')
        if t is not None:
            t = int(t)
        return parse_resp(get_sync_symbols_data_helper(code, t))
    except Exception as e:
        return parse_resp({'message': str(e)}, False)
Beispiel #12
0
def start_sync():
    """
    Start syncing td stock data.

    :return:
    {
        "success": true  // 当前接口是否成功
        "data": {
            "status": 0|1|  //0:当前数据同步成功开启,1:当前数据同步已经开启,不需要再开启
        }
    }
    """
    try:
        symbols = StockUtils.get_stock_symbols()
        is_td_process_existed = ManagedProcess.is_process_existed(
            TD_SYNC_PROCESS_NAME)
        if is_td_process_existed:
            return parse_resp({'status': 1})

        ManagedProcess.create_process(TD_SYNC_PROCESS_NAME, start_sync_helper,
                                      (symbols, ))
        return parse_resp({'status': 0})
    except Exception as e:
        return parse_resp({'message': str(e)}, False)
Beispiel #13
0
def get_sync_progress():
    """
    Get syncing progress.

    :return:
    {
        "success": true  // 当前接口是否成功
        "data": {
            "lastSyncStocks": [  // 最新同步的25条股票数据
                "symbol": "HUYA",
                "frequency": "1M",
                "syncDateTime": "2018-08-14 11:10:00"  // 我们所有的时间都是New York Region时间
            ]  // 最新的同步的股票数据
            "currentProgress": "0.223",  // 表示当前同步的进度比例为22.3%
            "isSyncing": true,  // 表示当前股票是否在同步,如果出现异常则为false,并且进程就会关闭
            "eta": "3600"  //表示当前股票还需3600s=1h的时间才能同步完毕.
            "syncedSymbol": 200  // 表示有200支股票已经是最新状态.
        }
    }
    """
    try:
        data_map = {
            'isSyncing':
            bool(int(ManagedProcess.is_process_existed(TD_SYNC_PROCESS_NAME))),
            'lastSyncStocks':
            SyncProcessHelper.get_sync_records(),
            'currentProgress':
            SyncProcessHelper.get_sync_progress(),
            'syncedSymbol':
            SyncProcessHelper.get_synced_symbols_count(),
            'eta':
            SyncProcessHelper.get_sync_progress_eta()
        }
        return parse_resp({'data': data_map})
    except Exception as e:
        return parse_resp({'message': str(e)}, False)