From 73931aa69aaf9b5b822b3a2fb515f5e326b80274 Mon Sep 17 00:00:00 2001 From: Administrator Date: Wed, 28 Jan 2026 16:32:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9C=AC=E5=9C=B0=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bitmart/test_api.py | 29 + bitmart/回测-三分之一策略.py | 656 +++++ bitmart/回测图表.png | Bin 0 -> 152243 bytes bitmart/回测图表_交互式.html | 3888 ++++++++++++++++++++++++++++++ bitmart/抓取多周期K线.py | 279 +++ models/bitmart_klines.py | 97 + 交易/bitmart-三分之一策略交易.py | 557 +++++ 7 files changed, 5506 insertions(+) create mode 100644 bitmart/test_api.py create mode 100644 bitmart/回测-三分之一策略.py create mode 100644 bitmart/回测图表.png create mode 100644 bitmart/回测图表_交互式.html create mode 100644 bitmart/抓取多周期K线.py create mode 100644 models/bitmart_klines.py create mode 100644 交易/bitmart-三分之一策略交易.py diff --git a/bitmart/test_api.py b/bitmart/test_api.py new file mode 100644 index 0000000..29b472a --- /dev/null +++ b/bitmart/test_api.py @@ -0,0 +1,29 @@ +"""测试 BitMart API K线获取""" +import time +from bitmart.api_contract import APIContract + +api_key = "a0fb7b98464fd9bcce67e7c519d58ec10d0c38a8" +secret_key = "4eaeba78e77aeaab1c2027f846a276d164f264a44c2c1bb1c5f3be50c8de1ca5" +memo = "数据抓取" + +contractAPI = APIContract(api_key, secret_key, memo, timeout=(5, 15)) + +# 测试获取最近1小时的15分钟K线 +end_time = int(time.time()) +start_time = end_time - 3600 # 1小时前 + +print(f"当前时间戳: {end_time}") +print(f"开始时间戳: {start_time}") +print(f"当前时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(end_time))}") +print(f"开始时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(start_time))}") + +try: + response = contractAPI.get_kline( + contract_symbol="ETHUSDT", + step=15, + start_time=start_time, + end_time=end_time + ) + print(f"\n响应: {response}") +except Exception as e: + print(f"\n错误: {e}") diff --git a/bitmart/回测-三分之一策略.py b/bitmart/回测-三分之一策略.py new file mode 100644 index 0000000..a9e3b06 --- /dev/null +++ b/bitmart/回测-三分之一策略.py @@ -0,0 +1,656 @@ +""" +量化交易回测系统 - 三分之一回归策略(优化版) + +========== 策略规则 ========== + +1. 开多条件: + - 找到实体>=0.1的前一根K线(如果前一根实体<0.1,继续往前找) + - 前一根是阴线(close < open) + - 当前K线的最高价(包括影线)涨到前一根阴线实体的 1/3 处 + - 即:当前high >= prev_close + (prev_open - prev_close) / 3 + +2. 平多/开空条件: + - 找到实体>=0.1的前一根K线(如果前一根实体<0.1,继续往前找) + - 前一根是阳线(close > open) + - 当前K线的最低价(包括影线)跌到前一根阳线实体的 1/3 处 + - 即:当前low <= prev_close - (prev_close - prev_open) / 3 + +3. 执行逻辑: + - 做多时遇到开空信号 -> 平多并反手开空 + - 做空时遇到开多信号 -> 平空并反手开多 + +4. 实体过滤: + - 如果前一根K线的实体部分(|open - close|)< 0.1,继续往前查找 + - 直到找到实体>=0.1的K线,再用那根K线来判断1/3位置 +""" + +import datetime +import calendar +import os +from typing import List, Dict, Optional +from loguru import logger +import pandas as pd +import mplfinance as mpf +import matplotlib.pyplot as plt +import matplotlib +try: + import plotly.graph_objects as go +except Exception: + go = None +from models.bitmart_klines import BitMartETH15M + +# 配置中文字体 +import matplotlib.font_manager as fm +import warnings + +# 忽略matplotlib的字体警告 +warnings.filterwarnings('ignore', category=UserWarning, module='matplotlib.font_manager') +warnings.filterwarnings('ignore', message='.*Glyph.*missing.*', category=UserWarning) + +# 尝试设置中文字体,按优先级尝试 +chinese_fonts = ['SimHei', 'Microsoft YaHei', 'SimSun', 'KaiTi', 'FangSong', 'STSong', 'STHeiti'] +available_fonts = [f.name for f in fm.fontManager.ttflist] + +# 找到第一个可用的中文字体 +font_found = None +for font_name in chinese_fonts: + if font_name in available_fonts: + font_found = font_name + break + +if font_found: + plt.rcParams['font.sans-serif'] = [font_found] + ['DejaVu Sans'] + logger.info(f"使用中文字体: {font_found}") +else: + # 如果没有找到中文字体,尝试使用系统默认字体 + plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'SimSun', 'Arial Unicode MS', 'DejaVu Sans'] + logger.warning("未找到中文字体,使用默认配置") + +plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 +plt.rcParams['font.size'] = 10 # 设置默认字体大小 + +# 尝试清除字体缓存(如果可能) +try: + # 不强制重建,避免性能问题 + pass +except: + pass + +# 获取当前脚本所在目录 +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) + +# ========================= 工具函数 ========================= + +def is_bullish(c): # 阳线 + return float(c['close']) > float(c['open']) + + +def is_bearish(c): # 阴线 + return float(c['close']) < float(c['open']) + + +def get_body_size(candle): + """计算K线实体大小(绝对值)""" + return abs(float(candle['open']) - float(candle['close'])) + + +def find_valid_prev_bar(all_data: List[Dict], current_idx: int, min_body_size: float = 0.1): + """ + 从当前索引往前查找,直到找到实体>=min_body_size的K线 + 返回:(有效K线的索引, K线数据) 或 (None, None) + """ + if current_idx <= 0: + return None, None + + for i in range(current_idx - 1, -1, -1): + prev = all_data[i] + body_size = get_body_size(prev) + if body_size >= min_body_size: + return i, prev + + return None, None + + +def get_one_third_level(prev): + """ + 计算前一根K线实体的 1/3 回归位置 + 返回:(触发价格, 方向) + - 如果前一根是阴线:返回向上1/3价格,方向为 'long' + - 如果前一根是阳线:返回向下1/3价格,方向为 'short' + """ + p_open = float(prev['open']) + p_close = float(prev['close']) + + if is_bearish(prev): # 阴线,向上回归 + # 阴线实体 = open - close + body = p_open - p_close + trigger_price = p_close + body / 3 # 从低点涨 1/3 + return trigger_price, 'long' + + elif is_bullish(prev): # 阳线,向下回归 + # 阳线实体 = close - open + body = p_close - p_open + trigger_price = p_close - body / 3 # 从高点跌 1/3 + return trigger_price, 'short' + + return None, None + + +def check_trigger(all_data: List[Dict], current_idx: int, min_body_size: float = 0.1): + """ + 检查当前K线是否触发了交易信号 + 返回:(方向, 触发价格, 有效前一根K线索引) 或 (None, None, None) + 规则:考虑影线部分(high/low),因为实际交易中价格会到达影线位置 + """ + if current_idx <= 0: + return None, None, None + + curr = all_data[current_idx] + + # 查找实体>=0.1的前一根K线 + valid_prev_idx, prev = find_valid_prev_bar(all_data, current_idx, min_body_size) + + if prev is None: + return None, None, None + + trigger_price, direction = get_one_third_level(prev) + + if trigger_price is None: + return None, None, None + + # 使用影线部分(high/low)来判断,因为实际交易中价格会到达这些位置 + c_high = float(curr['high']) + c_low = float(curr['low']) + + # 做多:前一根阴线,当前K线的最高价(包括影线)达到触发价格 + if direction == 'long' and c_high >= trigger_price: + return 'long', trigger_price, valid_prev_idx + + # 做空:前一根阳线,当前K线的最低价(包括影线)达到触发价格 + if direction == 'short' and c_low <= trigger_price: + return 'short', trigger_price, valid_prev_idx + + return None, None, None + + +def get_data_by_date(model, date_str: str): + """按天获取指定表的数据""" + try: + target_date = datetime.datetime.strptime(date_str, '%Y-%m-%d') + except ValueError: + logger.error("日期格式不正确,请使用 YYYY-MM-DD 格式。") + return [] + + start_ts = int(target_date.timestamp() * 1000) + end_ts = int((target_date + datetime.timedelta(days=1)).timestamp() * 1000) - 1 + + query = model.select().where(model.id.between(start_ts, end_ts)).order_by(model.id.asc()) + data = [{'id': i.id, 'open': i.open, 'high': i.high, 'low': i.low, 'close': i.close} for i in query] + + if data: + data.sort(key=lambda x: x['id']) + + return data + + +# ========================= 回测逻辑 ========================= + +def backtest_one_third_strategy(dates: List[str]): + """三分之一回归策略回测""" + all_data: List[Dict] = [] + + for d in dates: + day_data = get_data_by_date(BitMartETH15M, d) + all_data.extend(day_data) + + logger.info(f"总共查询了 {len(dates)} 天,获取到 {len(all_data)} 条K线数据") + + if not all_data: + logger.warning("未获取到任何数据") + return [], {'long': {'count': 0, 'wins': 0, 'total_profit': 0.0}, + 'short': {'count': 0, 'wins': 0, 'total_profit': 0.0}} + + all_data.sort(key=lambda x: x['id']) + + if len(all_data) > 1: + first_time = datetime.datetime.fromtimestamp(all_data[0]['id'] / 1000) + last_time = datetime.datetime.fromtimestamp(all_data[-1]['id'] / 1000) + logger.info(f"数据范围:{first_time.strftime('%Y-%m-%d %H:%M')} 到 {last_time.strftime('%Y-%m-%d %H:%M')}") + + # 验证排序:打印前5条数据 + logger.info("===== 前5条数据(验证排序)=====") + for i in range(min(5, len(all_data))): + d = all_data[i] + t = datetime.datetime.fromtimestamp(d['id'] / 1000).strftime('%Y-%m-%d %H:%M:%S') + k_type = "阳线" if is_bullish(d) else ("阴线" if is_bearish(d) else "十字星") + logger.info(f" [{i}] {t} | {k_type} | O={d['open']:.2f} H={d['high']:.2f} L={d['low']:.2f} C={d['close']:.2f}") + + stats = { + 'long': {'count': 0, 'wins': 0, 'total_profit': 0.0, 'name': '做多'}, + 'short': {'count': 0, 'wins': 0, 'total_profit': 0.0, 'name': '做空'}, + } + + trades: List[Dict] = [] + current_position: Optional[Dict] = None + + for idx in range(1, len(all_data)): + curr = all_data[idx] + + # 使用新的check_trigger函数,它会自动查找实体>=0.1的前一根K线 + direction, trigger_price, valid_prev_idx = check_trigger(all_data, idx, min_body_size=0.1) + + # 获取有效的前一根K线用于日志输出 + valid_prev = all_data[valid_prev_idx] if valid_prev_idx is not None else None + + # 空仓时,有信号就开仓 + if current_position is None: + if direction and valid_prev is not None: + # 调试:打印开仓时的K线信息 + prev_time = datetime.datetime.fromtimestamp(valid_prev['id'] / 1000).strftime('%Y-%m-%d %H:%M') + curr_time = datetime.datetime.fromtimestamp(curr['id'] / 1000).strftime('%Y-%m-%d %H:%M') + prev_type = "阳线" if is_bullish(valid_prev) else ("阴线" if is_bearish(valid_prev) else "十字星") + curr_type = "阳线" if is_bullish(curr) else ("阴线" if is_bearish(curr) else "十字星") + prev_body = get_body_size(valid_prev) + logger.info(f"【开仓】{direction} @ {trigger_price:.2f}") + logger.info(f" 有效前一根[{prev_time}]: {prev_type} 实体={prev_body:.2f} O={valid_prev['open']:.2f} H={valid_prev['high']:.2f} L={valid_prev['low']:.2f} C={valid_prev['close']:.2f}") + logger.info(f" 当前根[{curr_time}]: {curr_type} O={curr['open']:.2f} H={curr['high']:.2f} L={curr['low']:.2f} C={curr['close']:.2f}") + + current_position = { + 'direction': direction, + 'entry_price': trigger_price, + 'entry_time': curr['id'], + 'entry_bar': idx + } + stats[direction]['count'] += 1 + continue + + # 有仓位时,检查是否有反向信号 + pos_dir = current_position['direction'] + + if direction and direction != pos_dir and valid_prev is not None: + # 平仓 + exit_price = trigger_price + + if pos_dir == 'long': + diff = exit_price - current_position['entry_price'] + else: + diff = current_position['entry_price'] - exit_price + + # 调试:打印平仓时的K线信息 + prev_time = datetime.datetime.fromtimestamp(valid_prev['id'] / 1000).strftime('%Y-%m-%d %H:%M') + curr_time = datetime.datetime.fromtimestamp(curr['id'] / 1000).strftime('%Y-%m-%d %H:%M') + prev_type = "阳线" if is_bullish(valid_prev) else ("阴线" if is_bearish(valid_prev) else "十字星") + curr_type = "阳线" if is_bullish(curr) else ("阴线" if is_bearish(curr) else "十字星") + prev_body = get_body_size(valid_prev) + logger.info(f"【平仓反手】{pos_dir} -> {direction} @ {exit_price:.2f}, 盈亏: {diff:.2f}") + logger.info(f" 有效前一根[{prev_time}]: {prev_type} 实体={prev_body:.2f} O={valid_prev['open']:.2f} H={valid_prev['high']:.2f} L={valid_prev['low']:.2f} C={valid_prev['close']:.2f}") + logger.info(f" 当前根[{curr_time}]: {curr_type} O={curr['open']:.2f} H={curr['high']:.2f} L={curr['low']:.2f} C={curr['close']:.2f}") + + trades.append({ + 'entry_time': datetime.datetime.fromtimestamp(current_position['entry_time'] / 1000), + 'exit_time': datetime.datetime.fromtimestamp(curr['id'] / 1000), + 'entry_time_ms': current_position['entry_time'], + 'exit_time_ms': curr['id'], + 'direction': '做多' if pos_dir == 'long' else '做空', + 'entry': current_position['entry_price'], + 'exit': exit_price, + 'diff': diff + }) + + stats[pos_dir]['total_profit'] += diff + if diff > 0: + stats[pos_dir]['wins'] += 1 + + # 反手开仓 + current_position = { + 'direction': direction, + 'entry_price': trigger_price, + 'entry_time': curr['id'], + 'entry_bar': idx + } + stats[direction]['count'] += 1 + + # 尾仓处理 + if current_position: + last = all_data[-1] + exit_price = float(last['close']) + pos_dir = current_position['direction'] + + if pos_dir == 'long': + diff = exit_price - current_position['entry_price'] + else: + diff = current_position['entry_price'] - exit_price + + trades.append({ + 'entry_time': datetime.datetime.fromtimestamp(current_position['entry_time'] / 1000), + 'exit_time': datetime.datetime.fromtimestamp(last['id'] / 1000), + 'entry_time_ms': current_position['entry_time'], + 'exit_time_ms': last['id'], + 'direction': '做多' if pos_dir == 'long' else '做空', + 'entry': current_position['entry_price'], + 'exit': exit_price, + 'diff': diff + }) + stats[pos_dir]['total_profit'] += diff + if diff > 0: + stats[pos_dir]['wins'] += 1 + + return trades, stats, all_data + + +# ========================= 绘图函数 ========================= +def plot_trades(all_data: List[Dict], trades: List[Dict], save_path: str = None): + """ + 绘制K线图并标注交易点位 + """ + if not all_data: + logger.warning("没有数据可绘制") + return + + # 转换为 DataFrame + df = pd.DataFrame(all_data) + df['datetime'] = pd.to_datetime(df['id'], unit='ms') + df.set_index('datetime', inplace=True) + df = df.rename(columns={'open': 'Open', 'high': 'High', 'low': 'Low', 'close': 'Close'}) + df = df[['Open', 'High', 'Low', 'Close']] + + # 准备标记点 + buy_signals = [] # 做多开仓 + sell_signals = [] # 做空开仓 + buy_exits = [] # 做多平仓 + sell_exits = [] # 做空平仓 + + for trade in trades: + entry_time = pd.to_datetime(trade['entry_time_ms'], unit='ms') + exit_time = pd.to_datetime(trade['exit_time_ms'], unit='ms') + direction = trade['direction'] + entry_price = trade['entry'] + exit_price = trade['exit'] + + if direction == '做多': + buy_signals.append((entry_time, entry_price)) + buy_exits.append((exit_time, exit_price)) + else: + sell_signals.append((entry_time, entry_price)) + sell_exits.append((exit_time, exit_price)) + + # 创建标记序列 + buy_markers = pd.Series(index=df.index, dtype=float) + sell_markers = pd.Series(index=df.index, dtype=float) + buy_exit_markers = pd.Series(index=df.index, dtype=float) + sell_exit_markers = pd.Series(index=df.index, dtype=float) + + for t, p in buy_signals: + if t in buy_markers.index: + buy_markers[t] = p + for t, p in sell_signals: + if t in sell_markers.index: + sell_markers[t] = p + for t, p in buy_exits: + if t in buy_exit_markers.index: + buy_exit_markers[t] = p + for t, p in sell_exits: + if t in sell_exit_markers.index: + sell_exit_markers[t] = p + + # 添加标记 + add_plots = [] + + if buy_markers.notna().any(): + add_plots.append(mpf.make_addplot(buy_markers, type='scatter', markersize=100, + marker='^', color='green', label='做多开仓')) + if sell_markers.notna().any(): + add_plots.append(mpf.make_addplot(sell_markers, type='scatter', markersize=100, + marker='v', color='red', label='做空开仓')) + if buy_exit_markers.notna().any(): + add_plots.append(mpf.make_addplot(buy_exit_markers, type='scatter', markersize=80, + marker='x', color='darkgreen', label='做多平仓')) + if sell_exit_markers.notna().any(): + add_plots.append(mpf.make_addplot(sell_exit_markers, type='scatter', markersize=80, + marker='x', color='darkred', label='做空平仓')) + + # 绘制K线图(更接近交易所风格) + market_colors = mpf.make_marketcolors( + up='#26a69a', # 常见交易所绿色 + down='#ef5350', # 常见交易所红色 + edge='inherit', + wick='inherit', + volume='inherit' + ) + style = mpf.make_mpf_style( + base_mpf_style='binance', + marketcolors=market_colors, + gridstyle='-', + gridcolor='#e6e6e6' + ) + + fig, axes = mpf.plot( + df, + type='candle', + style=style, + title='三分之一回归策略回测', + ylabel='价格', + addplot=add_plots if add_plots else None, + figsize=(16, 9), + returnfig=True + ) + + # 添加图例 + axes[0].legend(['做多开仓 ▲', '做空开仓 ▼', '做多平仓 ✕', '做空平仓 ✕'], loc='upper left') + + # 标注开仓细节(方向、价格、时间) + if trades: + ax = axes[0] + max_annotate = 60 # 过多会拥挤,可按需调大/调小 + annotated = 0 + for i, trade in enumerate(trades): + if annotated >= max_annotate: + break + entry_time = pd.to_datetime(trade['entry_time_ms'], unit='ms') + if entry_time not in df.index: + continue + entry_price = trade['entry'] + direction = trade['direction'] + color = 'green' if direction == '做多' else 'red' + text = f"{direction} @ {entry_price:.2f}\n{entry_time.strftime('%m-%d %H:%M')}" + y_offset = 20 if (i % 2 == 0) else -30 + ax.annotate( + text, + xy=(entry_time, entry_price), + xytext=(0, y_offset), + textcoords='offset points', + ha='center', + va='bottom' if y_offset > 0 else 'top', + fontsize=8, + color=color, + arrowprops=dict(arrowstyle='->', color=color, lw=0.6, alpha=0.6) + ) + annotated += 1 + + if save_path: + plt.savefig(save_path, dpi=150, bbox_inches='tight') + logger.info(f"图表已保存到: {save_path}") + + plt.show() + + +def plot_trades_interactive(all_data: List[Dict], trades: List[Dict], html_path: str = None): + """ + 交互式K线图(TradingView风格:支持缩放、时间区间/价格区间平移缩放) + """ + if not all_data: + logger.warning("没有数据可绘制") + return + if go is None: + logger.warning("未安装 plotly,无法绘制交互式图。请先安装:pip install plotly") + return + + df = pd.DataFrame(all_data) + df['datetime'] = pd.to_datetime(df['id'], unit='ms') + df.sort_values('datetime', inplace=True) + + fig = go.Figure( + data=[ + go.Candlestick( + x=df['datetime'], + open=df['open'], + high=df['high'], + low=df['low'], + close=df['close'], + increasing_line_color='#26a69a', + decreasing_line_color='#ef5350', + name='K线' + ) + ] + ) + + # 标注开仓点 + if trades: + entry_x = [] + entry_y = [] + entry_text = [] + entry_color = [] + for t in trades: + entry_x.append(pd.to_datetime(t['entry_time_ms'], unit='ms')) + entry_y.append(t['entry']) + entry_text.append(f"{t['direction']} @ {t['entry']:.2f}
{t['entry_time']}") + entry_color.append('#26a69a' if t['direction'] == '做多' else '#ef5350') + + fig.add_trace( + go.Scatter( + x=entry_x, + y=entry_y, + mode='markers', + marker=dict(size=8, color=entry_color), + name='开仓', + text=entry_text, + hoverinfo='text' + ) + ) + + # TradingView风格:深色背景 + 交互缩放 + fig.update_layout( + title='三分之一回归策略回测(交互式)', + xaxis=dict( + rangeslider=dict(visible=True), + type='date', + showgrid=False + ), + yaxis=dict( + showgrid=False, + fixedrange=False + ), + plot_bgcolor='#0b0e11', + paper_bgcolor='#0b0e11', + font=dict(color='#d1d4dc'), + hovermode='x unified', + dragmode='zoom' + ) + + fig.show() + if html_path: + fig.write_html(html_path) + logger.info(f"交互图已保存到: {html_path}") + + +# ========================= 主程序 ========================= +if __name__ == '__main__': + # ==================== 配置参数 ==================== + START_DATE = "2025-01-01" + END_DATE = "2025-12-31" + + # ==================== 生成日期列表 ==================== + dates = [] + if START_DATE and END_DATE: + start_dt = datetime.datetime.strptime(START_DATE, '%Y-%m-%d') + end_dt = datetime.datetime.strptime(END_DATE, '%Y-%m-%d') + + current_dt = start_dt + while current_dt <= end_dt: + dates.append(current_dt.strftime('%Y-%m-%d')) + current_dt += datetime.timedelta(days=1) + + logger.info(f"查询日期范围:{START_DATE} 到 {END_DATE},共 {len(dates)} 天") + + # ==================== 执行回测 ==================== + trades, stats, all_data = backtest_one_third_strategy(dates) + + # ==================== 输出结果 ==================== + logger.info("===== 每笔交易详情 =====") + + contract_size = 10000 + open_fee_fixed = 5 + close_fee_rate = 0.0005 + + total_points_profit = 0 + total_money_profit = 0 + total_fee = 0 + + for t in trades: + entry = t['entry'] + exit_p = t['exit'] + direction = t['direction'] + + point_diff = t['diff'] + money_profit = point_diff / entry * contract_size + fee = open_fee_fixed + (contract_size / entry * exit_p * close_fee_rate) + net_profit = money_profit - fee + + t.update({ + 'point_diff': point_diff, + 'raw_profit': money_profit, + 'fee': fee, + 'net_profit': net_profit + }) + + total_points_profit += point_diff + total_money_profit += money_profit + total_fee += fee + + logger.info( + f"{t['entry_time']} {direction} " + f"入={entry:.2f} 出={exit_p:.2f} 差价={point_diff:.2f} " + f"原始盈利={money_profit:.2f} 手续费={fee:.2f} 净利润={net_profit:.2f}" + ) + + # ==================== 汇总统计 ==================== + total_net_profit = total_money_profit - total_fee + + print(f"\n{'='*60}") + print(f"【三分之一回归策略 回测结果】") + print(f"{'='*60}") + print(f"交易笔数:{len(trades)}") + print(f"总点差:{total_points_profit:.2f}") + print(f"总原始盈利:{total_money_profit:.2f}") + print(f"总手续费:{total_fee:.2f}") + print(f"总净利润:{total_net_profit:.2f}") + print(f"{'='*60}") + + print("\n===== 方向统计 =====") + for k, v in stats.items(): + count = v['count'] + wins = v['wins'] + total_p = v['total_profit'] + win_rate = (wins / count * 100) if count > 0 else 0.0 + avg_p = (total_p / count) if count > 0 else 0.0 + print(f"{v['name']}: 次数={count} 胜率={win_rate:.2f}% 总价差={total_p:.2f} 平均价差={avg_p:.2f}") + + # ==================== 绘制图表 ==================== + if trades and all_data: + # 如果数据太多,只绘制最近一部分(比如最近500根K线) + max_bars = 500 + if len(all_data) > max_bars: + logger.info(f"数据量较大({len(all_data)}条),只绘制最近 {max_bars} 根K线") + plot_data = all_data[-max_bars:] + # 过滤出在这个时间范围内的交易 + min_time = datetime.datetime.fromtimestamp(plot_data[0]['id'] / 1000) + plot_trades_filtered = [t for t in trades if t['entry_time'] >= min_time] + else: + plot_data = all_data + plot_trades_filtered = trades + + save_path = os.path.join(SCRIPT_DIR, '回测图表.png') + plot_trades(plot_data, plot_trades_filtered, save_path=save_path) + # 交互式版本(TradingView风格):支持时间区间/价格缩放 + html_path = os.path.join(SCRIPT_DIR, '回测图表_交互式.html') + plot_trades_interactive(plot_data, plot_trades_filtered, html_path=html_path) diff --git a/bitmart/回测图表.png b/bitmart/回测图表.png new file mode 100644 index 0000000000000000000000000000000000000000..a944312892b6c68533d4148d248b63e1ccfa44eb GIT binary patch literal 152243 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%0ARrc}rBu%FE{)E8`uXQ8V^!>xJCF0p*R#@UN zl>PphkBP1>@#|20KNuTotWamI|107|x%np&&p+^h5!A?H+=FW|UBmG{1;$42DSbac zP8OS)kwHdHjno~-+yQ9&Qgwj%k5QB=Dvc>8VhiY9+D_9D0|JQ;+kl4zyd~`H?QIuB zUoISv=?QN1_1&&TB|R42nT9Gh-6`8hC7bNb@Ug!7$7&{ZeQn~97prBRI1BAjUT`Pr zleHCSzjU5Y>C@XAR4iaD{SJ~cyArHj_7DBVF9hkeFuaLwZ`WabTH-wSstTP1&0;ss zKOQ@9?d+|zjZDvBY*BM-O#5|0)DvxUB_3MSn^r1Hb#iry9*4Mft)Wiuyr;YjKfCfo zD9&@%lA(v4cD+XefJjNhrb{|D-Q6iA-5}lF-3`(WXX*2Quk&8#eBB?{T>D;gjycBfJ``i~RB&$v zC6)7GE)$=PwMblyKUNd6fG5vhYKdE*^_~gHs%Yhjo@%2YuHusQ%n^h9de7zifx`;G z3kdvUKqRPofB5XS-aP*a6bxF=OVA6ME>Yi1b6V*rRxSAhguSwX>qY0bHzxTQu)UPn?4yiaSxOxHz56HaBK#cIu zW`v;OSmtMqs&A-3suR`ya$MrKqL#9$W@bT_F zIo;redilyGi;&Q#Q>pQ)X6ko7TIvbqe7L8@vNt3V=B3~TaUNm`^;g|Z_J{trdKo-& zqTCx5H0M?HMh13!kiJXEWH&p?@cqgij8W#hCE4BX!J zv0Nss@P5&3=a|Tv{Ayo?g)jLoNf}@&1cO%1-COUT$q0W5a1F~3W^Iq#4Tn+R1l2!N zf-|`o&+9#r99fd(Z+Ok3O8<2di9Hg&czjY^d=7i>7HTa+3o<;lP$<)Qoq7ac?&PaY z$6?*Bk1&L(&wyGJX*yC@j~FHW&2Tnr=eBEfA7Rl(b{#DM@TG! zU614b%xkwsSe)S2!bRD3EDNsM6JoTZ?*=IQHU8fOOm^~s-{Cu-#2A_P7sz~QOl-lD zl`*Ly@JQdJLc(2ElkObDhxutG{0<<0xUp57U>op$=%7qw*)aU^+V|-Z$F$pfU>3=6 zn<@~u1m6=&8^J;SC?MHm&MR(WLKJ$O9Ft5RF@M#X#LAd`S!yAmUI_F-7Yqx{$?=6( z#ylzPc--vu{?!Z3D$7di8qr(bEZnrrOOy#0XwXgf*oR!={u0;~N; zik`$g*1L%8d9-Re!~qgcVuvvP$M{(ite=>97{f0UB+gqu%(CGS9DBYb_DKI#ijEz$ zD`U#ijHPAp5B`?XThfv9GaPT`)3DGQ5l}xNi?y|P_ z*IoE#FFzzj6G0Pdxk>?PG$1%~-Nv8fas=jcS|y^J@)$ zU48;q%SQr{wwS?3N#+1Hl41F%hKU-=*B{@fxLM5t&q`TI#;HS`gzdAgp?$;*28P*Y z<_L!E;5#GgN-Taa{WwN*`{+LL8XmJ}-X_>xj;fj6+|fft9gq@z{vFNE^?sH6;?ddd z>xEDY^FN4b^%}^{I>spEIJ`1H>rQG5(bVo`xBiqALM*za9bYCNWKP?1z?Dr~Ux^aa zphh^nBGW%rBYIni;Ci!{ZSkeut(mVj$d2H@1k#-}q*7#7>{Lk;F4Av%a2_Uq;+(y_83{0R%3gD_haE4xW<{v2QA z&}A!9E)OkbUu*U>msDb==;A$|P5(}8{ziDlpGCz#7B?$JLo?1b=6N1H=et`%>ZeVu zeM2=Z7mLaB9f(Zclk|H)HIHJ)0DbbnBljI|T)k(br#NVq33wrzBeEWZm+${IVrI>3 z&K(zjkwdG`*PMz@lW67Tj7pZJRJ~Biy^D1rg!lJ?~9YNz=V9psltMOWD{i zyf$k>OYRrLq;JUA2zKI&m%7;H;d@ffhF8zHxG5Z zLr}j)YGG2>WpgG7#&&lvo9s z^wWf~U%;i-ET)PHXM-JBeHv88!%h+kPn{D|$$#E_(t`SX8jn`%G1e}Xhb4;jlg^O2 z?uM^C?mRkuSJ>lB{MjY{l6%t%x7kBV+Nu`4ygw!mwPr_HnRo*?c$OZLym{|hFqLh(?H;4p}aIsxaM;L~Nyb_*OLT2OMz z7Hr;}b^{*~#V@5)Mp7{q*2>CC)7i2#=jTpz!8yjzf0OHu^F{J7ul#i2_{C>1M@RCb;|_HNrp- zPt}RBeiCoBD9QDUdE`?Wo8IYV?B#+b5gz!6jT83(gnuk5A9q{;N7IV0JMAH5xVtdu z^Gx}EuK~{SM{SI#PSf0mg}H@d>#|miV+?@?js@Fw9sQVu0CDJ?nE-CytyP(36ZNDk z{k>7@aQ5zN*R$oQR1|BoBK-Iz7L1i&pICmL5?WGuFRE`Lq+zMxsZQi8BlMiUk(GEe zt~|>;3YO1j$;4Qp{-r~88@8WJJk>#VAE{W9I8xA7&2>%fbd{RF%GdZU5sA`u;6lp@ zH9NVt7n8yBmsi`@UKBDtd(;rNnQ0DzTNNxU-yN9WADP4;UOV!6-_P%=*ll=uPJK3&u6Cv9zag=wZyP% zRFw=}UeBWh$hj%E#i$AC^|Dv+*wVnH?A+U2FI7(X*k zO>08K^?H$mkpff!GkL>sq7(9`72FD|QR*p){&4Fen<> z+|9_M9P&ymBDF8sl)X(SQkDp!)@Ge*=Qm2NSx*&{&(9M1y*O4v0+;70{$3 zkH-KV)~~6}T&)y59UB;{khLDE(*E~&CdYA1!4aI#l~Z{ERNQhR4KnZDa^J|YYY>1~ z^q88lM~|*J`i@QTcechNy>=6Ga%K+2Eagh^Cp-%d#rlle*V`KaK1Oqqvafhdkfxqm zz=_eLvyaNV1(%N9>r+f6upkWosv!t>mQ~l+Q!bLkA*Ri#iNJoW%v*RqRpy_A%*PxmN2?KC9F{+N_IwC8P{Qx1@()TO(*OJ@GZ@kJF2dwY|#Dpt;)b2PK$vv)l~vXw1U-j-BV zl;-B@j06Z_A*@|sI}Jucg2(51{)wkWdG_t8;{*kr();(@*F3b|J}I!9l8-tfWEK4e z2jijwo}YMLa~dx@FNMqS;7aK6VV)j)qSv?)CfZw*4a5-by+YjBOiSeZh2W*X)3Ft0 z8x)an4fe-wUtB_#sD^X#^p04GdI2Q=UlyZntC?J`RIgvvL)3! zb6XAz+rmdB$>%Joj{`4nCI5NJ(nB#OIb<)*$397qWMHUkn1zL!j;?bmuA@zLGG4Cp zPg!TT_3KVT27~fSsy)3CAC1%u=2xfFAk1us7-e{Fv8WOvA!)Kb1(CKZ{x~(#@eZ;Q z++n9j^tO;^RRz1aCA7w#nQvdsN6lQ0nL`sN{3RA03r%?J7Pb~c(%^vU=LHihV!w$W z;|2t2)5m@SqukBgtbpgg=qw^NmI-=VBCIv3AxhZJj&Y(5%t)Tg@wT9kO&d(TDjgXV zvE_fzjcD5?{<`W>S2%AO5MHXe`^s&|XD9pxVsL1!F{1eLL-1=%mBe{$+F*0;!o!exD@Gp~%kA%m8`Xd;ni*MO( zkm2vV5)u-^?D^>Iem!sU$C;1I`OgPE=k?bt<=CI6=N19oY8^k1dJ%x>kdalg&=yUNID z;SA|=(I;_6O!beS!QC|puWX4uQt8>1)VdCrKW9afmCaL1j_yCaspDHH<9xu`ygDx5 zbUrU%fB8MKdL&9Grlu!;$@bJye~!2UsiC3m*5w~QC+vPZgG(3_fNKb9FB z++khrq2l(~dc-X1^4&V$#k^R!}tRB-8(@rfuO4gFECM$*)$ zyN=;oWsKPvVdD{J;<;|SzP#cIg==G>m*c}4Psh%E)VJq)j6&Ip#{OMT)>+7t;%Vty z7jU4RYcyR%EqUymOYte?_i^``|2Fp4l(4=M2(ve_vsbaKKTf4`@g>G;90Z^;toeC& z=-mWY{JKs{KKBUAp$Y}jx#mwElGK$kJ6JcLFob%AzW-tu`4OH3D5ViZRdbpN|I@ad zgUrGP?u;V%1H?jcgJ%@m{@NnutkuFp5Y0xZUqn@Z8iq3T(xui50Eu?_baJlAp zaNYGrJC`fJsp=U^w@2SZeB?L{NewSF$OV*t!g73$Xwl&Ua$};;U4?n3hA3Hqy@+&T0 zxcRTYJj`ep9QM96yX>a5AI~P#2TKH`$^St}8~yeG+4gyPeN<9z*W%M#byrsqC#p>CL$UFT+dp;z+zsq6CT%%M%= z%5iQXiDe-{{Og*N`8Z9HtyJmO2fVxb~=ZW~~hH460FJwVF~Im&T0oK&j?8JAV z&Bj-HJO=2FVWEtTlCpR-TL^KAwSjRU&2L-xUym67o1y!Eh&G&BHH<4=M5Q`Y*kOJO zxYV#9>4^aO-s=rs4wiG?S|mlMR58}bj-D(b(OEZ$(MR-zZhtjKBJCMT(k$@{=u#y> zEtv8K>A!l6O~lvn3h_&&QSMT9beUiffz9>HUUBfl2xpBDVxczSdaO#|y&u=ojeYP9?9-%(E|()&C+H!V)r6Sx#*J{($a#%fSD1|j z!5kZNW*JmgsBcn>Q)-MF$eIhLTjIZoIa0=7@(1DE)579bUTDnz+cL>+W{$r}$L5p~ z-U1M=WO~4idz{E_q1M-!G&T7bM2wTY*Y@&cEt|%J`ZKBM;o7+re3m`GZ;kLfNuNgH0Sf_jZ~? zQ1YJX<6%OMFobZfe4k6`NAl|H0tg}3=iTbGy`l*^3}<&ym(G2M=s5q}YBrSdDZg4Q z{$ZBd;yD_Zwg^%!&XQo^YdB;@>nx+51V8Z~jUWKRVYK!ws^=kR=g|4*cuoC~QLLJV z2alb=NMH7+zL(CKITQaJ)a0}!qxCqE zF~6js`mrEnN;PuDeM3k(fPjJJn~eBEk*>sFO`5DNYyO2%=GEIDGI3hewy+kBFgfBd zZdzOl9GOhh8WnG(Mr>?^~rWQ#DrAppFbJ=0i*bmIW5?)SaH4?sLbKe`;798_I zY!*aBkyGdXh)n;g{`OnVAxVa2}C0b0jKc<@1pZxzI(pN zc$pKR0BDLBudjsS-&vs`Q;HJ3a8AHXR> zO}x&fa-I}~J{hb^dnq6{tI(Cz7?NHrBwmw~3#TAlKFppMbaM~K&faV@&J<@i) zF-=Sy8tU-pqnpWYSnZuBDXrjZ=kDFIObxANTkKPqZ-n?b*lByNea z&N6DF?KTPtuPJBCHJ=E|Z6LJ>T-~Wmw^+x8UbYTn&`9Ue+c;FT~VgZX#N(R6ch> zka#P?^uDO)%wOpkMk*)=OZdyq*+b2IXeE10 zjORO6!9=37^Jyhm$Tl{G1IZWM#KXq_$sBlq*qq8~O$C*+z`^fwHDy|neSY0no zNyE$Z+lWU6Uz(`{r0bWh{^C#p&?u)U_6Y!ZbknJg(#hVsr)Oa3{tGB41 ze~N|L167n5S1$FH5>*9kd?$dzd)l|6 zIG*8Ud}3$u7!2&mBDlQ!YGi=KOliITEK&cCVDRWzel1f@G_ko@aUprHs1&e2Ww9Y0=gxX8+ey`$}4HoHmWbt+4& zwcj0i2BoO%Ui{^Uvd`-H0?624*L0w9AN6{k)Ni}c$TD39KChSnbrsLH5#U@lXsoVv z`2O8Mojqg8^ZBspTTA|1i6+Jz(~~VKsik+#W^Sz-Gf(PnXAy;`^oOo)y^Ht)L&0<_ z_GSd&Q(jh*wmFO-rm616;t}PS-3xYHV%nRvhS3aGaUgBGFB8q;hQ0PF`rB(OOh-3F zuNA>G5*w%D#BQ--D;~}gT$#7NZ3O0PdahqXUmjGKQ(Y(N>IXW1ilT z5J$WdA96$(ZjO7yhlh#{IraP{@VayAL2GjBa;e^uS1n_8rFPRhZOu8Wa97hHHBiNA z!QCpEM6aAHVL!Djn@|x{KsOJB0D75NvcbR(zl3S|T~7CYm6CgL{m$YPZQiKhw(3Ky z--pVW1z+%IYzy59GfB~7=6U#K_p5H<(U@nc=3hLYu4YL|c%4ozM^obB{1fzCrGml%82ntVB|&s_wBI{m7i}GK){BLy znLw}k0}1P6rfw6&aIs%e+K|o?u>t&F_6qD@6$VPoZBpjJ7eV@3yjj^%&vGF2b5gTF zD_^8n$KpMcn0!+qZxh0pSI^Go#IU%?nTSRpH;eYu>G;j#;;z;2ybJ}#tk(6*qV4u= z3-5yX+YMw7$=L&WB2>;?v~i7F{y$wN@*jZR>!a&9QQ|}nird1givWUbs?q|(U0MoN z_|b>i6(OkH*DP#2U8HtA$CeO83YJFbkkYXSJ)cw2Xg7ZVK* zjznjTK>>EK8GQ~QOggD*w#lC#X%&p#hwLS-HjZRdHSju0p&vM1_d>-B3M3B-eog)> za58akgK1~~HsI&M5Z z8eO#&Wgo2HROGecZTGva`(b%3ARZ-QTWj+KH7Udoj6GPiyEzH7a~@O=P)ie2EPm5$!pkCJZmd`OQUCqQa?g z9)a=x_fzwX_z__P@~u_m*%DcDtm>EbZC_iH4)D6GQDXi_S4<1LA7TZeD>oW`9Ew%S zPaYh)h%@(kDgLxXQ!G9k3zRizAB;q?YoP<)uDH>W>~~lF*DSTi9{aBX;b>rX_V?QXj!F|#sYu_$)Pxg35Q>DrwvFw(JNTtLV7j=6F%2}|+eMBB6Y@OAYQ)}BrKrwn(w z8}^;iyP2ufNJA>ESAtH=J&I2%rmYq(vi(LwR{xW_!Jz8S|C9FOn7U=QBv=0U$MsZa z@m7An$CRE?{+`e{{gWkwa!qZ4*5GBOd`5fA=1YErP1CD-uiTZZEMb;f-#P?Q+36x7 zsN*P@7%G+lVzK)iK1kZ$VeiBFoKueeEj)|gL-1Y6QSlGf@7ISCGiSm_OIsE?KVP3{ zexsMqJ5azOCisItKtf-~7m{vsm%)T@5u5j6g<6Nw(5fHC9D`RbGE^lb&HQPqTsDq+ z<{Fl`VIk2Iz@>I51GD7uSog`NsPS4=3E6!fFdvgV{0gTSdQ7J?lqp}03c`45$XDkW zboH}+36<&M4J0x#_v46`#PM+hLFRLoWu?1 zQ-`^hC`YvIx@zWb`WQvzXQBpl&v#476kU{yLo!!X+X9hS!TS>}_4OK4rj#sA#Y^fz zapt)vi-^`rn05u&nMby3DXFk$TBYTUjEvwRi3=uTu6O=ONb#VbDsETZ`e9SEdZ;4f zQDn0EEX$u-jp`0jF<3~)gEm#qx-TXkC_<9|8A_zkV=LZCABnQ&Y$|((oDqA>Mse}~ zpT(i=?;lkEzU8u5AHTXMlJWQ#yGUMeCMIiRxRbE2Bsb1}IzASvr9&P5X;uYm{xc^4 zOvLtFZ2l!^;|D9}0_qcK#aish`+&`J$XX7a;h!8jVC_4WB87d`)qYx=b8Zn`P2w}W z{F@UOJfBMV_Y3V>W}~rTc?crq1acT;JCGG;k?+-5yozs^YMA)<+#;bvFY{=bHHzdw ze`frt%fDEE?ntC*PIm!K_sB|Qt(##0%!gWQ9<P$%Oa&3RwQOE3m8x78ucM)hJ;{7N;h!MTz~A&vG0(pL6C3}wH@`6O=xQV7EBZb3 z_0ILH=wk0V>4?It`;Bd1QQa+eRi6hqX=jZiNRCcX8?8mTfY-F~b&a|RkhIm_0?gnt zCNeMeQ&rZYO;aVX@3(e9Rp|U%5xeZ6>D7c<#0;~kmtSsDyznOc=cL#K89GU<(N`zhx~RM??;Sc5Cy2t) ziZ^=}(gJ|w=#Sh5Hi-CZFg!#&U5JQV<_}g1L-*$EMD)3g(zs#|x>BWr`v^9$%eOmW z5Dj%Jg`1m8lrZ>4`%sF#;_ctrIH-1k+0AEh2&!e5eP?723yw2q&4DT!JkQ*dIxC4d zUHiR%wkJ*9GlM{iuS^&iNl0{3pk@O<1qwJeT%#zs!tJyUX_C{@qk_^Lz*LkR7onO; zuW~J3>#{l=5}OvI-lvnV+8mNzp85viGA)H-oj*u0N_0P&LPSUOV=UftR(YkW9l3us zLLt`My$(&w+W0=4#=qCt{4--#i7t&W<vabZ(wU8QG3Y15Ol#0Lu+UzISy2oM>u$(Br7uck(HRJ$T7xKpTe5t+86 zv*{+Lbd(h@d7H{PJu!s!h&ZJ}_lmj}m2?=pcjD_1?>(Q1Fa>HBAOY1@P#Po}5&d6D;M8tXv)u@MxzYZ;l63$)+gh$vB zFb-yWh6}>pL^u9Dye&?ndgh(uMh?gRx>C+bi36kUFU$U!((ot@XK|gsxef%m~X2ZE@JnpoZSeL33zpRsraJ~@u zlaEbF3YM6l5>8LsOikgVUg%jXkhi=TfSAb9%(x}6Z1FK1zRMmUA~CybY$8Y3yMi$PWYN(J6m^ne{it`E)y~@!oZWwZ<&|#) z^)dudI?4Lg{gg$qYyglbkZODRm9j^K;8884tulBmkU04B132k-68J)XKO2u%sw>Si zN4_3-E0mThz|G+$Z)M4`&qA`1*<4GbnF#kW6&DVJ2Gxjo7&7tK@>b4n>6z zUBY=f`6T93L-KGdj}bNFN}d_45?cmKqfhh~;jZZTk7Aj%g|sLwynMJ3I+&rkpO}DU zv%+G#F&wEOba#pxA5YhxPF+n?bkynLbr)E7snS%XCio|L-*j6Ba z_Rb073VRd6ohm>ypAzOFdKicLFf~`6F49On!X#1qyCvp?+n^V}lZ|b!?y%abv%-2% zdjl4WmNBhNa0@<_6@Jch%S}ZE9lM6pf=TB`zlY$TV>V=mT z?$slV-HpsP)E{*Xc!647h9mFw2xSW~S`JtDNT7iN#qg9xxYc%F`nl1#EcS_*-jSeJ z!xm?kC^*)?Jv-ivN&rC_cHPGL77U=cR8;qe<#6gK7-(0uR)|aLD4%~rISq_aw_9W0 z9f}D%LP-adBq9>@r#(l8hs__`a-wb83gFQ2+Y;DTDgE1>e8bMF(E~h;Njjf;p+exS z6&PAxm!tRCg!82-2qy4O*~KMuG#2IYcsQg*mQRfcO4-7ND*n;>tF+O0L7!!C$yRSt z|M{PKPZM1 zdMuJJ*?%j01SOvTfX=x*9OFC3Mmai)H3nuA`n1tw_fw0N6O0}(68e3PeAt6;0?ShZ z=1(z-tcIu+9j{R|dl4>%T@5lcaz~d|F0#(kOZsP9RZ+#%srokOcGBiwXK`4NFcw*n zW<4BrceLs=N9pk(eOd>i`*D*Ari<7tp0~Fi-$`s4qqWb{twl!5XQb4;^rv6692ifY z7p~E1XW9A61w~yyUX)uK8=w<091VcN1od zK41*(+LYTl!?9Eg+_+{h`ij7`WZ9OpO((pR@5=Qk|$!%Euz+uwbXsAauJ{BqYW5fAgH(1lnartOIakYi_?Zx?# zAjN;JD_p?8tXh8mpN)7Zl`(OE*_*`8P61-_b|$T-~rDK90BVMrOAP+FGvT`0ykQb)oMdKkMCV`w6R*H0Z1 zNrp5mO6Hm#6eRMV>V5Q2`XLg29X`r+3R?@SIqDI3L?GLx=)SOECcLF+)|buRNoWD` zDJXv9d*Q7pU1};7oWHXEMjGK3yYOr#=+F-k`<5O=KGiZHq(2kxnHt6CoOxEV@+_P` zXcZJra#&W+qTUf;j&mP}W-){#b1e-XCTf24LNt4Rt$X#ux^Pt)^kV9@$sHWa1M^F} z+`)YnCh@V6RGR6?vg>UiCjVyK-a>h?{S$l5G@1sQ@>h7Vg;1~x#*AKRacMUI6ac~* zJsV+R2z0J1Go3we2mg}-{>=}Qv59Stn^H-E1|Zn2uyHwF~t019T1^ny^@e6+mI$+_az}3EhnfDlV5Bctcm5PHmWDW z@;!rksUq8#Xs{0$o=o-R+^TD)^0nxx&_b3W)oNx z=5Io@G1dVL@JNtAr+ClNF*R-FRIE@5o+S$?X7-PXIV1aeroEl^sd6$b{^`5@dj{R4 z9SaXRZ00kf_I-|4r+WrvV0*iFXU}xlEW(LDNOW#l9h86`7*>t0>ZZ!$FpG-+O5QA! zDh8XMW~DaE_F?{i7zQKszh~0l<0+Y0Zn>M@B1wt9JgutgbW}(QN0i*Qt+IWISjY_L zj~4qo^%5tGL;@io!f@k(OmPd6lsZak#^>@7EQ${h>0FYOQ-p}j!gdNw@iHQTiXdJ8)ZDwQhfGSzTB+2mh>?mxIn!V zk05E+;k6;TE(f}PYOd~gis80~B!V{0YqW2d!MLdBG$vo~jXsPX=f6$wpn8S$`g~46 z_3vYqp8`8zG~|d(C36^+v6o`;Z}N-l+;4nq@*A|@F)pnkOQOiL449N1hi4B?gJ+Ld>v^UAof$-vM*L+%+HL$Ibos827rovNs)!}K>&J_05Cj^P zqM$T=R>(HjnJ%(lobNv4F#GjOR5S~Gi83w8`u;T+jaK*j z*B+a-6=a_W#3{cppG(>@hKtH!M)~|oMLd(7vYG0TlSZ-f<$)SW;fwNxO5)KjOA&A* z`+zRAE^h=0UQXT9G~-!sR-FFf>!Woyxnbpyd%2}nS#!jQ=OY8#g>Hn()M^n~9-MMt zp}JlD%NdTMNupneU|haMg2isS!^|tq8X>u#)+9P_V>6J3_6SpVgwnXF)ozPazL+4d zovaJVIoJ?g$}j9}{CsNf8@2es<5f88sX00czEpWVD!OXvt;>JLqC3e_Q7pY^D+W=^ z0y7yd1)wfm{g*tRlK8K+PP8FJtQ&kB8mx!$DZ*oOlrX8+%2$b*(kZyS5B+llf|oW~R@$G+UCS-V<1MXrJ_FyxbIC)|WpYo{@ou#RI`VGBE_Xmtw*O=XBy z+$0+F49wxz%P~$cCdU){fzuXkTBEF~dzu(<&2fczyhXlh+Qto8JSAf{8qbINi)9J_ z+ME2=j{nYYiZh8|e|u{s^b5n|4`1@1l^b<2UK5j4*wCllc%F;S zbkpf9+!jOAvAg?g_>%IS)1bLC)kF{=IH{L=zsS60vPm4*^@*%;CP*(qSgU^ZRh33< z7t+vb1D1bOP`ZFgL-TAt{>gi@cJ~aK@v!AnASmE-CC?3KgLA8dJ=Eq~+_^mK(`D7L zQ>cB%>$(`CdTTvnt#DiS_VV}+mXZH-_4y%Ssg582lTm>2gZK^t4|-lMz8UHhXTYh0 z=v?>6q3EbWTb+ss+r$X1vJ#Q=SyrI%iAW9OZSap6;(xJ=VC;YANMb$_CGJSe{#7>h z067T!tNGdr&lSu+P{O9JX8*)C{*IOGt=JT5nn5`08KuPcRX1QyHK*UIk8%vquQoig zNgsUtP1UgSaEx8cnYCz(Y|oAjJAKXyCxi%#&oHngLbi)gp67xpYb=%+8TE`8gNTBe zDVEb9fdA3S74ql&DI;nbaut|}UypbxVm#~MMecDHaj#|%Di29JlV;m+rxZ}+a8|zj z_0fPMcMYRxjwXVVY-IKpyeMW>Wb;p7(iw~~vlCUa;KANGd`=kX$|3iFMQH85d+R)m!_{@{!MwVh)_KDDjyE~!26d&rFA{wd zxWCVJ2>N-EnVDA`KVe(gUWp8XuRqIw_Vn0 zXfPhezyMRbL!Kh_5@_Lp#eeR9aeOvQS^fb>XoDr44-LUj{^sp!^9V@s8I@7BFgxH1 z<3Y33cH~pc2rwXQYB1fO!S+e z@Z~ZImDR(in?}DdE2pstZ}gDt_><2ET_z`&1?ew4_A4H@%(Un@fkz5rH(d_a^gxVA zEx5O5Uy6uQ{NydMiC!Bvf5v?mm0G^p0ba~)QtHtQA5S3P=gn=CjGIBl!n5F92%`kh zOD1cUCOHtvF`}Oy<>G5QdX)>vzbqDJpK!*3Qce}}#|rnZNrTguXu|)VLy7lj|6qEu zF+EE;OJyvxWq90jB^;OvP(e(2nw6O{7-w-$i*;P1#7(J^A0#$sQ*C5rOaAQK+_>Wx zZNrd|H_F25yHQ;uo=i;VoaU8#MWm#kyVmwaM?buUE@-a*ef*TaSgZW^xR07N!XB3v zl%$|(RXhh4PV>R(kl*iuGp*%@k?0@++5%0-2T0Q7PlLKX@g`sWEOTcKoLZ7w8Rjuh z6DPRI_juk*A5pCT$YveBltzJowhLYfl4!nWLuUHB`qvP3|0Jti%Fb{gCf-fJPHvI2 z{u9a)Pzh!MhebI4h6%*~C{78R=S|fUq@7@B@>2DXqkEw0{4f#f_l7!c12TSW{`KHe zpr@rwlfJ5Hr~4xnFrF?(X2hI8_lc8c#umVVYs#3nTAflQo^v` z^kx>WZ)C|lUl=W*ahEM(Yj$D(*%&40Wf$}kWIQTwAUDJYADmhq(eegYQ-!e(c$;ko zVk;gZ|9uH|R676r667kn#g-I88@8pH>~vc`m_Mp!5uZ=}p(l_XVvqhSFj<=#B6vU31*sTwiuRc2xst2!10q^y^3$knzOhCWRLO+(Qvc0jFZkOO<%} z6ONE;9VL95UqCegtHjFu=w`OPK6You+a80{l`})h(@8GZu?tB5ao5;YB=X^NHJV~L zwO812b+JHS)2O8VJ4P{OR2iO|K8)f}t5N>Mh^087D75kZ2Wwam zh4VpKsd;m$=Fckamt+AzYB=@pU%uOj7iyWdi$Lby_c_dI_KKK!6T`NAf8~?|1R@tB zls%UnUwNE(JTPDQ`qmeQms+zuEt0?j^AWm|ov74Wi=^0SNTx^P;R{+nw>h2>!M+Fb zf0M3<-~T3Ea<|wN49AdcpF8OYJJr3h$|~wrOk-}BO2tsgptMyU@71Rf(^rbbVx_4* zvsfS5?mT`^p&r=29JA-pZ|40i89>4Ku@b{LT6}KDlJ@?j-&#Zs*E~9g9Ft!g{?bG+ zBf`qRHRfb|#?r`Ol9@It>VBq~9?&U}PNWAb-b4g?1^@8})O=%|?PjTf=9LbK6 zquiDI|8S#@mFn}sn6XM z03P1!$AeF6NYKq|!&QeY$)B(sPPO4wz3=^0W91O@TxjtF33*mJ-F;zBK-K9J>M#>oySe6(k0)*HVsW*9>DM3et$xHP+ zX-jnF9r-{E8UKEZz%hI23reRS1wfMd{{S05EiE_R%W(UJSS6g*LWJjMH_OYL=pr!{ zsClLniZQL8rn3HY%pP@vlQRz9Pg*aB4Qe4fQHfnEx7cA)7ER9Dn-w|V&!=WScopB# zmmKfssKk{Xuz1AJup0f#xoHMh86!QL2~kqi9vb8b)t%*}G| zgC95Td9Mztyquf@9|Oyt2RfP zX-26Jm)gv?+AUSA9WXsdGCIp$= zXiq`NYV!k z8w=K$^_h&}(uE-L|K$_-&=dD~uhx84KCt<+&5V+hXL(V}_5EU5#pxhu;*!mIa47C3m*p^0*s(5ag)x)fndDW&MRH=jvvRYh0}0H;0f8RG>$#MUd)*it2HR zuuHI7Nc1L#df(-mCiAE8Be8e{8;{*>H<*NY)q~ek-qMzh&@BvS!r}j6>MYozY};rp zq978|9a2(K(hMP;lF|**-CfdM(hMj1M_uKo}e_`%Ccg7(QDHJ52Y)1ar1jq&8D)A7 z#MLK63>k|aTnzG&VB&%04tyQ4aDcue009PJ7vTleU2|Ht?WY9#*u8{#w+RGdKQcdW zncp*g@k1}{TDx$Ov+ENEJeiD4v0fmLlSaFTC}(X-!qjRnTYlou%l6;M?Sm=*R`}3a zwC1Xi-%bQIkL0g((XVX6KKNcSz7|dXCF~}lo`nh8?_q*X6kvV6D3aw2r zm)e$p^2+$%^S3Le7O86zp~zmLT&+!8_@@FZwTOR$82p;h&@*y*;fhng`XsYgIXNo@ zw4ptx^jiw4*!ms|mFO_4lnjl<&ERXrVs)2^F5bPC%?MPSEDPd!@_pYU;?uU1)CaTA zF=IZ8jgdkN%0zzVuNc7vUd;?pBg*>&0U6P=f>5TpOJXW)Zr|{ zBr5@d(P^CRM{hlz=+ZX~XKMLy?kfcktm8?IzzVrJHZ4{!#U)O&@ch+P$q)U0yK!B9 zOgdc!#5)+8lFI+I@}R(0p9&{x&Pr>Tg=H4RJ<8^C&kW!2wy*7EhTRQ$Bp6UPS-;JmNH zASF~;p?|+8|2S!9&S(M>->Ki!a_`8V2~~3GqH;nvgF4Kqe(^N_0-*j(N?|t435~|$ z3K0RkExFrHYUTc)r_M0M3b*hYIBJZKdV{J@XWqh|L4Q1XNqdIT^IM(=`WK-E)Y+tI z>D+`6(zHUI|H$JLe!cR@O@&ez%q|!<3$C#DWH17Uk7qQWD%&})9FZS;fBJq94?lP8 zjgg}Q&lLDYXStii%rO1Yafe;-zSSmNaUfz5v%tVnh~Sf9(8Wj1dgCUEc(b4a4O<-> z^!`oCk=u23Co}Wll2L)@zxMlk9Fn-hq}D=k(VO=5CJVqC4Oc#s!X`C?3q<9g)C~|# zD_UL~Q6Di{dX!hY8^z|Srs?=+CBepfON z8-JRt+1?Y8tzn@&=~wwGDQN#0{OD6Vp}u0Zd)>$AgKww;OnF{c-W`(@_B$@IS zvM(#r_xZmyGYELT(c)vh%(JLN;?dC=$*}-<98C;bwn+9*_r5O|Bxb6y`uRD1=1*Og zb;}g#GcJoR2i_g>-_HA%Q=>oPhlvP&0b-rbuTcOTqy2#VC7|v zf+!ESn};GBGf^4Q5udW#}+u z`|0O~^WI^GByYSSY8Gl61h=H^)GTppFJDRRR0Ux0?(%m|lAGEnHQ1hv`%N1fz3%zb z{?}^S&_(~E?J9&lNIz`+E4oO_K~m3)LXH9VtZSKmm&2qM`I(Z%AIGthE>Bgds2_=I zh!3|xND3dK=5TN`UJO~?t;uDiN!bws)F*!1>>l7=V_t*`ZrHa(hmE4x+XzCAA9KPaw^Ytx@U z)kM>fn6Phl{$UIG(1S06Op3zINxdT?M0yD?n)_>TI?)*6RddEW z7uZ_MMyHa6Hj+)PM&OPCHVBTC(kdaX@%3KAc>n$6j3+m}hKnrbmy)EgT-HT>qZT#* z)NOiRl$-z{-y)?REb&ocf*a6CNEFrkDxK1b_HUGrXvAdPzUqciH1aMJp$_(Mx>keT z7TMUu-Hm>FKLGGvAO>Yf8Z38G>%iFd1+5_1*QPya!O8xdXKHELxax+&NG92|^g^N= zh3`XQYH3l0n{}q(6Mx^bu6_B}wuMxmasI`()^7vCGXG=&^BW&I5{EY(F{2b$(W{CL z#F1qiKu8^(;Y}r&=GbcMR|Q%B63$M^t(YU&VI3g=V zDPniHF0}l4IQATf43gYZupy!8Qw2TeH4~+#q^;XqC>Gk*hs;yuyl6!Ef?7~XItgY( zPi=Ri%b$1+JdP+G;%RyOPZj7Z)~-`ejaq$!!P)Cd>?*JRFnAuGV&U|xh1pJ{RI-+$ zvap>cEkzqmYfYgW?z01(!ARl~mD5=9azDzKS~~MlbmgPW>d`+EX92VbnN$ytkPw5UXfkx<7~2B$Hqq={o;3SMEhkm zj`~iYqnZ<0*(jbKts5TU46Dckd*jFh@%g;=z>zA$Y}4goMMd`HC$|?i^_tgzt5^O; z*|x=#_|f@txkkINlb-M*walY}y14KsXE_l1+)02-;}LSr=V|Tt@FsdZb$5rE_FmdD z%CirDnHpU*8ri$q&al9Ws%L9qF88n9`=Z_MFO?Tlolc@@Z7VD1uX}QqzS`wJE~>Ju z@nD0JMPsl9qk|i42bAyY=49HMSg7f9iXZ~{j&c@F&C3CyR$}h|%IVMc373e6O(ka* zS{88Lmhx+3bf}L4{ecG8cXnEbr<*w36<5>n(cXs_^KRSR%yIe_LISThycv1I8`NsB z^uP*mHVRt13f0G<{I>>T! z5awj|Sxg^@`c^{Hkp-6_PtHhG`}K~cBS04vV{_ps;9Mc}9@DSl-f zH`Szb;u-&ODSs`mrh~f-X>>C$KV;`pd_SlN9Ck1*dmaUoz5sJ?Yp_JFA@Nx=ZdHWR z3)@jN@tl{sHz0L8m%ta@{0SW|hln=4>Z2qhh#S^EHTzY~wZWz?NDoOf*$aBP9A;cmH&OIv=eU;XzWBYb&~ z0d+x1Kmajpc`}jS6DzUwnvu!yy}D;&c?2>UY5oKYvo5}4h)d2*$Jt0Ln?*B>T`!2b_m$@uj&RUA+xIIB?MWJ{pIBoc7+TXtgh_j6(mz+ z%yO~UUKz-@292y^Hik)A1_q+;kyo|$CkL~>0Mb$;fC@;!x7laPG(*gzg>%g-`w#BN2)z3qZ{|qID1loajOtmlP z&wM5tkujbZP&iUd{oRl(7-J7(>kiS*i7#i7vR5f6(uz?f7O7LDt}h(lbrIOvpEmir z^y)7b-p7r#kBC@j**t0J^F$z08I8A2aq%PImlGq37R1en~7#%MSF5Uo{d!rKw-Qx6?v$bPF>a3vh2&FSF*k=zi_| z`QLWOiurQVbO^15m6Qv$6oMY1^v@{s0hY_{&gdG2N&X3$4>luT{(V9RO+*ea&CQzp zUszc=5b*6(^K=L~#Py_HCQi4&D+jtgO!#S>_|CO}Nz$vlD}<$Mbd)07^YQrGz&Bv> zz_prNna1scD~(~i><6pr5W0wU4d67e(#eTm@?!DU<{pX6ef+L?6s{Mz)^Vim%Hb4$ zfG(t^i8~~ACPw>3F`T%8MiAk;`+@ud2)#s_W)#~rJ7*e^g`~@m$xtWn=LyJsJ?ZKH&A29v0TWZDJ2Kh)S;P6f)ssB5$jWN(N&jX&5EiH zF7sJ}O4rQ!_o#s3A&>#|oV=rRBU=e~Zcl%(xum9kMp+ANwDZuASksGGj(5g@+w>7K ztR}UXm>s||{X~S~VXxE=9bM!a0QQ{!y_N9aKbuJ=GD*ioLcy`X*hDbO5c@nu0fZO=Ewtq6)?VV{!8Qp|lZ`aa#k~z;3%wyZX{Fnf2Azh__^USxMF_y$r=UQP z`Mv-%JKr+eoCFv>I6?AJ#n_46o1G1?c)eY37+0l3d$UlOlg{p_J$R^5WypT}T;XTrU6wt@^!Ts}t$gUes(0tCpoJ-zbeN9;yTU!`s)q0=iS#*qGf28+ z0Kn=CVPM|AD1K9k4>4b_Fyezk{f=bs_3_s3fzghqjwH)XL*m#UUr6~b-|xSOi;wSZ zZe?M{Y*&_*#ITmiKGDpI^bK4DNh!PwqLmIrFH&-|tc#rB65Ralc;zVE&=-()?w4>P zpRyvKVzmWdC69CKrV;Wmi#Ei3K(Ou|@i$aYbUR)ST;;!0ctg_ne?QkZFQ2P`5Ck!V z(MbH9qOx6+E*B6n^=0;_#T(CtF&gHO!;)}+$R=fBg_E?gcdeaQV}T?%8w|H-Fk)Ml z@ek&%^4M!b&CnzY*z-{X)nB>hx)$6|)yz7oBQ?YO=;^2dUdDG!52Bu$rSI7|#Yt(t zBg@smjaJu8>}>=ipm*r&A1|1bV68NP`)Tou_o$tw#S#UDcEeX`=r2Gti`FeP5M!mu z2l^fvkn!PtsdC2|&D0UeiO4{HpGnlIM;9uB$G-JwZZ;kecz^kTvT z-I=HRR)~@YX&KY?eHi8^;Pwu@=4$NM&Mgc~>MYKziA63Gl+`VB9K1!rbTx*m*xSK3 zd#?}s;H|)cI35z1d+g<{Zy;6g9f#4oO#YQUrk*ww3gXx$}<&fxaam+YB*5n0C_l z?HD3HlX-8Mk@hXCTg#l2-}Yq4hY8;(;Wn((OJupJNLOx2OaT!oRH-&ZSd855aX-~N z1giOfvdLb40Cyn!C9qoyUiv2$8qu`{VcQG9TUzMni}X^n!v%~joZ?}rN)Xp3`~{J0w*%Er^?NyLFZI7tZwHVE#+@Q zj1z?JOo<|9jdg^eWD(s*&GznZB#Fc4`S!+oiqoX_)7n3B#g?^4sa}Z$nKQVVaec z0@Ul^L##e%6S1oz5wWoWrAuL?LsIMMhg$+yF<1p;3xxx3E#3_W<=%zV8%;+%o$e#| zKUjfLo8F-hrZ*2$Ltu{V1D!-MUydmguK!1U|C_L|Atd%VM zO2#(XGy7Yap02CL);{Pc^VeM442VhVdpzKqB^8-NLNhc&lFz1C&_%>ocr z1eLLwJh^{!;PH+Pt>rn4nDq=-EAAiVi0T%RV26;4kP*?e)XoHAgH+TA1htC?aUh?j zKwoBt$MovF^bdPPp~ncGuUpQ@DQTVK54~72;K{76G+NH84;qY_jwAUeT_3_9py(na z<0tkDeE-yS+_(GW+dtLSluZC8Y$T6sJs;vpmbP9hZ0TzvWyQY8 zmBxX(pK{p!!L~!|!=qa(ytC(P>0Jn8whbv4tLMmeRR4L{4_dQ%Nn65-Gge&y?5&m; z_DvEUTsU||^$eJm`~HvT)AlFNX@<&a0+W=dnf)`L*O{B0Pnj!giQU)beM>(Le94wM zl(dMeOP6bT=2JWbYrpPG2OcUgz!nGZS@Wl|1lDr8wf$J^Z?UmJnWpBT`tU z`;U+J{5PYv8|r{pI#QCt+W)e=SoZR-bGl&K#A&lQHSOF)Px+O+f`(^R>x+s$-wAsK zZEXitS)mHeXE^mg48ACOiX?hLz(^-TM)TV3{vzRIQjTMD3fTR}y5at~xpDu0PolQv zReQwepaHv`1fA2`WD}?mZT7QFQKgdiVQl$fa_RmY5#W+(ypZgZQo*m`CHFP+PN1A^ zGKuU#!?;+ceexm~l-^8+vhB3z{<9Sea4-6!+E-uf3_5}ghfF(Sc6<0tQ>Y!BZWr#10V zOFZ2;UheUv)~#=xBS$};WnQ}Ocv8D}g}LW!y#x2LkWBRe6JjU`8Ke2$Gb8b9Ie&K$ z2Z=)>pJo0cw*WN7MRG0qRyJQm;#?U6IH(MD9XNAW?jVF>fqjTe6`6-J`M zXt<{K!-T{BF|!O&>Q7Qfe#6P0{@%df0;`UNttK3BXxPpo|J8SY2cIM46gS)V%!bE? znt0X@-{wf?iQa90pilPg`f**3ZIY{+c^F7TRPnCP5w+Wav00gc@O3z`mFABD}{$RC{ap2nbbQfBa+ zxNKP%LBZyEu2R~)U2;SRNemuD7d+9EuX)VVOtr8kzH`|XC1AEMt<(&;dGastc4d=G zH$ev>s0THq7mZ6yes&Y(f<%L8a4b_b_8aWe{<}Z1Gh_SO3g14Yd<|v>g)j(#^X(LC2 z+}@E0$D}ctWH3?}F@<5VzJC&jwur8V$o-w`H^gnxY-)9TCKxS@{#^;Hs`HlH8x#DR z4t`S7sV8ko$-G0yi_yg%!3y1^Kp!o2af%D`&GU>%Q=*u-@uSDsqw@Q!X|zxfp>Iqm=q*!(bj-RH)G^F6a|u+mAa--X6-gJ{yP_A8SG&csbLMIg+` zQw*izOudBzIix+yMQ72Rl4k||E4(+4>FHk`92_cUX|#&Jy9qY(uz`hhcjm_D&}k%S zaHF|Du0ezU8v@h3M5-go1lIEJMZSh84a#Rd;EH6OzuC z9}tQ!K?{)8F?k83n=J())09S{tb>}<+|5n)4{ob(D8xQ;!Tuq|Elg!ft2z!OU=VrY zSgtII#V0)?z(q~_et>UGvwV3vk}W?)Cc~=zhOGjLty|L0sYpfHtl6wpmN8wjLy9#p z9QN<7swM3CkshZkxnp<1T2p@Yq_Rgoek5>7s}~4Q195M&2&}J2vf__fX`tohYEI04 z5*|TiHv1L>S(80peQUT1?%syIimGO}P)Msj0&##?9jzh(X3B|N$&{rOS|9&|7>T@A zB2XU;^ny89uQJf_eyWVSUgnt0t<;f7+`ZSV{}t#}6Bkg{p(C>Gl9H+vMj5bbuE`?p z>2s7T=twK~mKij5rrRUn;c<8~e-%3*6b42IWGpJDaYtU7N;P3h%AGU%U3Vr(4n_)t z=3f6F-D%@0f2Q3A_9aH?*kT?+wy|F8gfua%PrJO1ja1Oz?+em7QQr6{(P~P_P%-fLTS?)jU_z zB$7k{=s#8$cg`1XZ*0z~opyoTiZ|rnUpICiHOX?q{6P~ZQ!5}oaJ0ovSazaw zYr6=@-IAkl^t3QPE;)fXFRDRog)Bd-xfibX#|_JLP9qd`>)#MaHQsJTvFHzxId=Qw ztgPa!m}|D{#EY_U^Y=Go_oDqxQbK3}_$8|(LL8FC5te2VWL3x0JA3ofFy(b{?w5G- zmet-k`Jfx)h9O$`}~K(vcL~TuG@A zE05;6L%@QVn?x;L&8~E*KR7epHmZcOU>~)Nk@x)MU6Xz? zZ~ybbO8O(pAw*?bf;J{kXFKWd5XA)`~yd zFo8Rt8CE&<+!@K~@p^lYnFHdg*^C?b6NBz$2xcn%pP20X=)xa&6>jqfdHF{$Tb61g zIm!Nx>>cXAKNGD&hK`iVB$}4>=N@t%(du*}(@O_DKY|N%3OM;#Zkr z^OA?igFN|}Tq`T@f$B#;|2k2PnOYS2h4^%`wlkH85XCDP$MI;kGlk)P9wQETu)71w zvJ##uJiW>RiJCDEfb_ABs5SryO?y<6FnKOV`U5VFP99Srhx^;#tL;trhG+J#asnO~ z2X2>rJpN^5hYS1F2t}CBuJ7Jp$9%6D2dF#PC>wvBf&!?3*v7%$Z9v5(DeWXb63`bfCt=tP%6MNU za?v$qlCemO-Sx<7YN;_$vwaZ(bPU+zDi zkpRUS=umn9r?S4b&P>5R%`c;Hd#UVkk1|SyUmzhR<{-ewKKUwRN}WI|@Ep35*)4<4 zH;jM&ebl8&Dx8Uy&<9#L!r1`IJ z^#nRo%gRb`xxQbqG${9NZb2S=dgb$jyO%m227a13#1t#O9|XoOxGQrNasANiG^lf+ zqkVHsv`@cknd)mu&|6aaR_zXCG+V4}SlP&(%>9aZKRKVNy-^*x1cho|}fh5GK!y(C^@zC_M97 zO`CEy-Cy_9rNem$OZ=~E6UXi&nI?P)?WyNHpPlRS{AT8> z^oSG+glrg}K0X#ZepNsZU28G1?=}e6ImKo=V`fgj&gq@GIZ9X|=%Nd}UTLB~v-`MT zr~mBmOY}Uf`D*cSg;ZhiALJ}g`k_q&Xx0dMbrZC7Z>%LM5*wzsAAfr^NxsbTxWRZW zx(i-FGO<@CIOpoJAt}+Qp%tHXh@)P2$~IPtXTLqHQvcUP+n$=h0DvQqhB!tk5~fuS z{Nrd=D1#hBBuJ4Au{vyvLs2i~6YcKDw#^i?dcoe|e=$3&uZIhbC>sPZI=fwXE0Oj; zSqjXpw@)YffQo(V`2AhJML~_>(it`JEklX{e0`|Jk7#)fY^s7Ac>+tG$PP3iNdB;` zG;@$2|9g5T$;yaGF|$;RVG{EYny`rpLIXO$hMyu5RuM^76C3;Qn`EaW&f?b7@GkSw zPmLZIw@+r0yyqoz*!>DCRt5*U-(aTTyWAw!UbhAusBy&sfj0koIk6M~YOQQ1!(5k@bE2f|CP z))aG;N;IO=U^T`0xcp3O9}{;b`qcX!3cOkJQu z^t`}|@nYvT{koE`;`RYWVixKO%wU#XD*bCVio>+@DyvtQv^r+4WXE14`{$6juS)Sd zF8`{#H{D>O5LpUNmfYOf3L0z0Ch)ozZHnA=yfW;({q5|r67^HxI;mNQ*b2n z<{uPJPiRB&l0ePge9zwcM95levdd|iW(@c7N|?t<^_cCWx}(Oe`@;b7XmXEC-mW7p zXF@e9o;BSB_wYQ{vc%2550j*%B#4Ymn(2k`#XU7%(_9@_Ii!ZWeht(g;FP1u@lkbd<#iM3^es;7o!_AmRI`hX>5ta9Okx*m$vT<^-u^u(5#`Rd4u zuY-jiIUVKDHj(aq2!~EkozsSD08_?JgR6>+r{X?kiRSn!1oV&4hpi<#6N7RjYp< z$wjtObB_I*w5vr@1qO&fL2JS0ezoiE{4j1~N|`X{*u?NqR%krBogPq#r)J1vPDtOt zlP`<2U9Q8V6g@Fv?ZdyE3LsPb4pfDR3=7iJ@bG0Fci)93e?I0-yzk<`gz_4;7;w#_ zZ~}!7+*pK?Z?~l1zk7OJH&*!SMD&U~c{I!Y@g~>yx~NW!6XbXWs~uF+wN-%C>xt38 zqoZ!N*tOR!^Rsv2&O!F;(Qt~%w-GoDtf}}uC-2{(NAQTx$d!xuVwL~L-$NEY*g^kt zz?9z~ZIZ&=dDV7^`97TrmQDYQDOgGjM+M_KnofN2GyZS@Z}8AiHp;0RB^3+OObj_6`f@_A;_A=GKAs z^l}p+D_dyZb+X;W0jJUKy0jtuG z#@H=XTZ)F4;-QQGkA-Bm2HhddyHPuMZpu!&oJ z7{$568V4l1Lcyz#{9`~hrn%^ayyr=^ z{baCqMor4vFRB>w0C#zwL|PCWMp3H_=NOBzEO(%%$@-gb_UdWMMq?AvWhK8jVfD8& z+9Eo6uiE?-Mf9|Zx16C?h4~V4**!~i(B86GEq!rEX<1nkIx_k{b91{T#bZE6({?MdWV$KZnW=(g$TfdCvvk_~UKzVUbn_E-;FV3LGw4R`<292=gv z1he+t5_r$7NpMnWX;zEy(u?OgxDG4>3JA~}(iyLvfC_B;^#W0L1gLxh0;_xcAsv6qb&o+RR1baudJ=rSk^PkHm zpM5rYg_T|{1qe4vlHdLYOcW+92PT!Sf|JQk~*rxaFkKV)GUf7lkM1l1?#4L_}gSFxolgF?td_XlqjdCq1UstZsc5H6NY7 z)WMVT0s4v_waQ^8qt6hQvaOY+?7#6L2rPYiN>1`jq6xDBSET+ya1&xD!wyfU{AI2~oC7L|?Zf}Kcj)> z(nVw?1J*jdm0{;jCu}z7P*B2?Y|s`1_CTr13%4UY`f1_&K^hq1(N53u@MOJbj)(r@ zz{dSgf8G-=oe3k)XX>49u`nIoSIZdcOqXeIBN;@6GfQCq544str@R7xnC{#9|mXkauJEytP2DIN;C0P{D`fH=IED$oEhqg3*!nv+&IvkS&a3-Cs>} zD#_AU6l1E+A#>WJA3x67+DwafsSy|;8Gw@<|tt41@L+m5h216h)HgSHfa@fC@yDT zimMV92?6Z+p|__-RCcuhaNHzuDpO%R5i>_%*;+f**fOH;@lDDcRb1~kPpz3~NztHB+nce-( zNbr(c2ZAd6FIEn{kNdbs3pkjD4OZjW^8EQ-rpfhH_%3%s+3ArU_ZI;kPiIbsy~lUS zzE{=@INZw#nODzFzO+cekEvgJ#@oLlqyFB?q1`E2D167e6n=77(wwMEEm=U?T5aJoPVzq5-g`HrtQAl zIA9e5q80N3k-Ae@9u+Fiq#rTNpr_cmDai}3jG?UEf5p4m?bm_XB4u@&djgCz;qJID zKBM3i>2C~PL)cWFt#@pq5x6&A?P?1RuEqzn*OZq>L{UIoH{|wv)Gr+$F@~hTw)2^p zZ$SJ}(+TeLo!ZhT=Aj#(Y-BP>>$Kh!Dac@u;De+c&{~ zW2u85wfY~x`kE-YH6{LZq>9$5=qC!>_wW{Koym0833Jf# zikNTe?aFIRY<y-t2U51f5M6c5~e)So#Ntq|<15m>$f2A`Sl z6E<3!X*#%AwpI9J_PS2B?CJ?y?&fB?ytGHZ$1^RXN9{~pvp$MdIJ_+v;APO$58vH7qMz~cV$cckDcRbvn=3Ujz) z&uxzkf+znl>&L#C4;{5*GHASA9c0}nL2Zh8q+NZCT>x-5RmY!drf+UJl@ccN$V@=t z$1g@0Sb$(MCA|_|=HPLv4sFpqX}|Id-%Pn_vHzH-q-LEYMJGjn1?S)`ctseb0G__X zpgiJFL_>Wvf`mzAi-_q*)sg8S<-R{|tt@(;y zn->+8*jA;uXaM4R-Ae8?f4RSQU!x}he%9=+xD56OK=34l5C+bR{1gN@fVOP+pXg0?nP82f&gsZ`FCuf%DC3H-)}s%zR|exO_{M2=^YrG z5oU{i!LsG4i;_OCc6cp!S&DBhKl?&NLEu-!g6BNbCXz2F3MK?{d^gKCFC%`sT+%}8mZEP# z$@;V$*{Z(xo$sIcKVI)~As!~E(LWs_pP$Md98wfpO1b%~WqZU)%)@Th{D2=C$Va_z zwr2m!2zfgXZ3dvxXj6$^JSC&XGi(;~ zA?bbi-(G$}X{K}*#jfe#oCTGuIT+*o_d^_)RPYID7>4z97-_*!)RIsyb_#6!BPq-f zwB=cs`-i`inOAfphm_qaWFQueMUXg9L(mWY6;?ZRC?(4p{~+ASB%p63W`?zrt~#M0%;2-yoRv?16})?V!(Q3FlPZGCLxxe-fs|`V-DMl?^YLIdb)eVey|+H+1%5Ygo)YKj zqF*}3+z(e*!_Ql(N`vWZHn^pUWrso6NSvR zW@hgru2wMECsAV2I*C^Q8?%(Wj9L7AA#|xz!lncm)Md)25VG4@gineqZ*R@25zv4B zjeY$ynpXNYn?I5N=UPLUCD@@z?uRHRFWX6NixX^DD+=+9yGX^nxP0cHsjMCu8W#~V zC&}9I!S;NEl9Qwj88+*IzpH<)jjplC@@mVFv4Pom2WJ`WKYS&ycYcjb<)BbT#AW<} zWofA8UNh^`FBPF~M2>`BM4bm!bjIA&e~VZRk0YhT<>w8&KwD4E7)ePdT`Sag&EFBS z%~omZb)rh#$GtiPP|2e3h^oKAdncDU?vHatoBVRa+CF&nN7bhy`tX6*-w|jWDpT7J z>-+@I*3g*2hp4&}7V(MWfW#{qjh#&6F>usDu@M(INPxF&I)2Qz{bIU}#%CE!8hs-c zyv3;#oQ(Mv{3~fEYVmfGJF4R zMi(TW{uTd+8sW?LltTDo@3sjJ5m3-)u{3zyGbP!f-zs}vi2=$`N1-?b02VO8{+V(= zQ4t(V`R4gOo*z};_FhNZ;6OCBzS0tKpf$mK`!AbLttg6u{qDM05;p>Jm z3c2a)zez^0aqCGe)AM~R{nE?JXNxq-j)`CtOADxMZWVW$uJ zC(ct1qMp?Le7&Zw5?HP8wu|@#<<2-NXgUcFgEHJjT6gVI#YeMM>rNx5O>bLj{zA{w zz)2*(eQmVlV^E*l+vDYDDI~{@Q|iZ!3oqquwT6khU4tTO-I>@U#2iNDjJqXH~DV;R6ch|uB$pE!0BmTqhb zzoqrIe(h(E%zRnKV>WcP6w3DWVklc)iON={I4#5~=HTU+lGV~X z{o2nACfm9J3*Xz;(uQcFQBFB)YZOkyICkT)wSj1AHt&#-22E8k%;U zrdg0Ff@2$NbuZ#V%CC*zEtzaNV_e3F$3RxZw!rJCyb-_iF5Wx>O3nY)%Q-((?L3Fv zc=?-8U9Ms<*jef7T{V#ki>zlqOJTiwIwz2>2c1gF$FD`)+ZODeq`P5%LXia0GcqX-E zLDTG<2HKnLG;CCLo=O-2@lp;hv*(9?d)zv(6m!9(?k+)&ZnZVsSbnvK9xbm5>{(*> zV^Y+&U{%-Nh(0l(&bSsBH?l(}NP2cLFb6DZ{d%7=thv?tSQW$x9TVek4J?$li%?S- zVMafFv_TlN57s{awHZ@@y~$O$OKl6ctg^2X8w{G?RR6P0vU# zI7i`Ak?|CB;i9x){20uDeR}!}v9;R?()!5qN`B=bVbk0TBc(^{CeHv;!K$7A-P<_- zdnpAmE>~uH=UtANmVRPLfbg#iae|=SneWmqPiuZgtFy$)Weew9$e^6hUJ8_FXp;ON z+P*ug$)<}FDM(iy@e)7 z4GF!seL&y$`_9=tyXWlLoj-D(z|51GJ2Q9g{oOnF)_vGM&bk2CG*O_GR_wg@_z6c} z{!Gyq$)2RtSk%FrD|}y`EXa_~_r1spYFY7(%Ut*%@cs*R7)eUR-CPeKYVxO;cQ4@4 z_X^zxTQ9hE{}74&N!2*kvF%c%J>z1@vbK@b=ttQ1HrTYvpG}OCP^7Vym<*)nzm^eV zol~O=Tja!k(QUp6_~v}&->npA-pwwHfI!uvZo`#?*lp_Aj>&#~^ca)ccrPkot;qt# z)hO39^yo8&DjgoFtv*Z@Bf2mBvL3W(cI6_gY^<9~r;p~G*W3oAsI@^0x zpmzi`=h@|tut1hXpOb46d&$hs{;r|S(EbAeO&xd%?od%V9(I$>XApD~2QDAaNV>kD z3-5T7#e9zc1%3LIUvk@K-YY@>%Y7pZVv@mM)R>q-U-Kxkv@j{yucsq&f&AEU} zf0Wk0H}g%3tyONIl0>E}Dvv)ZUV%+1BM|uRR!69CTPvAdj)0mAsD6B^Tvqs3W zGFX+nAsib{)8O0p&}3+b*~PLkDePtCJtpeUi5ywNibl^TJ{ImN&E}C@p?XRqo6d^j zdeC71vRCNak=UKRpLxcGGlNefyq;XV6AJxYckZvZKHd_)KDG))P3>G*?qtRw`ZIBE#!=J8rzqgsTcXe*Xx+DIdp__pbWlW%g0wt6>SE;kGng;& z{o~p^qgZvO0rAgm2KOFv>6wyl$-e}L3saSA@y7J|eS{j$UGH;f@&6I0kh~YHy zpjTTB1WX;jaLW7-ZP)W*tQ=WfRm2r#b&P_VZ?E*uOw?9CPpUh3v(?iwLiPySTx!X# z#Skjy>c1W3pPy)|Q-7eWgpxYx=YTw&+3@{?{ARWxf?AV5O(8kKgFF!bZ9gg0V&R?4 z`Y@Q@^)}W|-isqW&ACJ2t>N3)3kk%)jp>7rrNJqeP00Zj8Az1&22@3y%D_Lr6DZxM zO9m{9^}S*fr<=KDX$-7Dfc5f?PU=|+A~wj-(zq}0+xqz)VDUTZSZP5D2@nKs|&mB6s*7R`Lf`?Ehzd+*@Pztr0Z5kzUp8;FfR>+SF;wMw8>gFbya_}*AhmEXt3p5*&X)jB*6y9FW6!}1Em zkDs(ieqp5RN(o$gCxn+fRw~zxN(NyGv~J`n4&+`6Tmb zNm{7s!O%3QBshYANqrMY$475)VuS>s85J+o6GYvY12aP6zCxB<4Cw;wd=dnQFe!!QYrZx%}JM&pqDMQGg-`kMS zlhI%e2t{lpX6~y~YLiQPYVsL~8y>WM4pB7A4YbWmK7khq>2zhDWtYEGF(m#M=Hov< zyuPx0%olQVoIu^@?EG=}^Jn1$Ocrs~C3(D=Z)^25`&dwwCZ$au(;wduUj}V@FPc!`eWk!J`J54#27BY?m!dpXo>B zpRZ{FF`a=6uwNril!6_-qqL1)I3D+}mRZ)6U7Pw%@fu70K5VwQ@?-H& zV1cAGY`HQOdQPEaSXWVg)IE0Bs*x*C`+hxC?sR&NnQw$j27bTbzBIGS#-l$%dmnV; z2AUYxdasGQA?0{ixjz#5gWYjxcON$yvt9#^?B&n|R2?8^kP59VUdQJGb|!~VfS;oS zY^Zok*G~R@(Y*qnPolysWi+La3Y1yp3nF`GW{lS9^Rh?6q0pSwU+s43#Uc@RfKau~ zv8CF^!ql*SEe<0LzHO&*Zm`j*%#T9rgSsT7SCH$c>Gy&bk@VT+ILmm&#lu~Vwtz5l z#|z^+cW=$vG!#=?8QTMy4nO;SCvdp*E4@MJ?lr=TUyB%?2-&sNYF@NBRp+nK>f~*i zNY;nFzO5^k#q)fmQes)=RogE8M`l$o3P?>%%RofVuEy$G*ZQZ?{l03q5 zOR@;?iW>~!DdE|kN-6LlH)lAyr$L$d`j}{5zIh(1vM3b*7@~E{W4@f)pe4+Ytg|wf z0%*^eUEaaz#XmcYT@+-aw@!^4kz(P@>7yW_1hY<5|v`-BCw|dnkAk#%r}P=*ysX z7L}93{#`{>T_Bfo$Boa=EtQ#q+BFk2&F-{uHW0c_E=_7pWgqg~*X4x$cR|M>SK$?uhpvwYk_U?mWb4AZb;Pu3; z?_aCO$_lDVXCX~iw9`uaf|L*AcKFYU89`Y0A^Em>N%^!V89VF2#9MgBK*%*fT=yXV z#U-8NL9Xs@k8fwPi0&BFy9DyQ3&cYBb7AFuf#*5=lO~_2aTao;K=`1c=1IHG&D$A> zo$)|rG#ys)&0DcnUCMwXmss3eJ8Ih}>Qi;;DnF$&){$BPUZlHJ(4_#}omXR*JWJb2 z3$f%sgKWV2y$j(C$)#!Udx$bETHh`qgu>H;-GOAQPXIqOu|LUHu~hW@!6U++<(9tr z24A=l7p&DTnoyhb_psNjn0u*<3kdvxK9DoS6g)Cn-D2%U18%(C9w9(3z;|Jn%}ueW z0A{b`NOHYWeOO(@ zyI9s5sv^B+#?4)F~3G1M5|6^?SF&jifAWZy(^b_XZR8^?B0NhyJnNSS{%V=r4_OktsJN@k3a(a0F6Z0H=d$JuqySmGWsdR%@*w1Y zNd>w7msA4bZ#1_MMGu*%v)#KxYI>!$gZTis^;4uO+fZEd^}=5TDxocC|8f5)azWavFAadyqiPaGS0ow;@ibskK#YxSO26x& z%eDX(^jFU(Ssby8fRtFhaviwSI4$uKNE$O{01ZauUKO)(SYM*HTObr_)h%^$v!3oS zwXj8V3_3VQcJ8!|C?!cX^SDEfMl!nQALesiwJOpug4(667v6FJ4cdX0n^x8&YS>ZVS6uhnfvY5F)kFqsE7L5x=YgT+=1LAp=^d*L~iVGSN`nTT26Q92I4>x@yC`?sa z$mJ`Er%F`;W@=$7L;Gbn>si*Vuf2|P(SO3Ko`#aWjtT{gen-DZe@t3vmpy6|CKVN= z$24^85<8tN&fDI*x)XGRX`#@z-u-}C<*WV^{?2 z{LO*@#y8sr&fn8Y7sGS|L}|t_{pEE`SC(5-#bmsHcht4 z1D2Jb&J1?C7lA)6>;LU zbt#N2sJh{hUWT;2vn`NyN=5GmkpxFCtnRL8{vBP#EfsEp>-NE*@R5RoxO?$)v!&~Cg$eQVwPNJhMW2v6b-S>S;EO{K(c_0!|?84gZ z+6}*k#U%e*lsXs}JrB}U+h_J!3NcLVSAiTm-}d(tPG$i==77%iYlr%rSL0`1DpIh* zXH}8dhLNWW47CrZl9RJ2L3fx<2Trv!&D~(-E~Nn@>vuI`Dsj1SemlR$pFz{%dV|7oFC;m(V66B*T}Xv)iY{ld}7nuC9|H& z^()XWVVuN9a3OqTVmwYp+4H6TVIN(hn<z-NZ2S;+SWwJB~hS@ZT* zn>UxKt?%}X)87&tr0(HwwOYh7bA9+GS5CVYYM$<;)~o*;|NB}AdDL01cvcR=<+}N$ zD|TIucQP4UzD3{LiHj)v!n}6o5@~XGrI`IbY6lf`;m(5b;ia}!z`+d2S7y*%pUTs* zmu6@x)5ZK<$fpC*xL*)tS>TJ1G)=wa&KEPS7-_rdx#~H1U{pQ7`LyvLLSFkXLIU`9 zBKz;(61G5=%!oay+qqe)W|o!1Uec?NrZps-MJE@!RW1Rjse+IL#Ru&puw2i5C4zC( zfw%ZG4W{}Q~2OKcA23HJ4e1wO7|84}b8VIY`wDCitf$M;|Cu35mRgcCCOrBaCl`8h3HadP9 zm8%d6$zQVR#3%27BnfwBm;90=a|3==xiTk92~P`X)34jYt$$E``LJQ!aS;6b%`xO7 zN-9IYUa{=so$`8$v?tH2=`uXXLc-phh0y7z!38l33mJEiy}{NcKS65<@nVS;uJ2}^ z-_0>j8$ys=?miTA*f{pk@1g?|2k_`s?5>&6orL;(1I}(20Mx(xiXcUd@`4Q7muViO z6R2q}5{uD-ifA3sHdwCwaShAm`>MS0oB8Cez@Hdr5mZ2AkKE8(L+vyf9Wiu~b<~EL ztrt{q#1=P1W|)awmFvKlEM6L!yFO!E`EjQME7k2B{BthF?oRXB#q~`XAK()y?w{c}zQX(VB=QY>eV79+lK0gQ^ zvH1WP9Oim9;wi319_oPfF64Q)h`G!`un)P+w$~en(Ih-_by-V@09<4s$Uw4Tv0m&H zG@T^%JRkMz;D^*-mmCDEIv2BY?cbyBCc{}wl+cgBg=!$6($KH`jn@IwK;SO=&QR`~ z<(jgxslVXYLsEWU=8e3BM{4kc$1++WO6#wheH0k6Ndx8g4$^x^XJ(>Vrc;AunsaNd zrruO)7bi)KR&)~QsXR`oG}+-s9@xHIP!p&mH*4{-6bF^V%!ggpVrizzX*}(nB{kkW zK_4gx*{%=8mwm3p96&i*>qzrVhd20JfWszbh@o+V<>#U;uV^FqyyYZPm?DE zlFvG>e4-J2@BlP2>RtRd`YrD)=R?owI^)*}Mb4|sa@QWk;xXTLHJENMAWw$2dlvi< zqHEqZX_b!i%@3=ljc*+1w;nw8VagHLn5y1ulQCK!D~0sB^#C_laOG2jn7uL-{Xv*` zCE(?gD9Cx+TP}5`3NO%*^&B>&PkYna;RY4zm(1wwt*8X4OZeie)hLVlla0yMH6X9o zx0Kl6D>2ubSA&u+ki6_Bl^NA){CM%@r&c7dHw&Bev)8!`E)(|tKB&w7P{cKLrqER39UQ2avu4}+6?ye3{$X>FBl3~ZW?10!^rZ#1 z^3A51t*?&UWQxO3JAQ~}v9+-=R9kL6mH6sd7|lbx$1uw1mj)Yr8BRGl%K?7+r0H|2 zy@ZEoj|5-$%uZ)oEcfyorFa093`IK0oX+)uib7@B9_J;kW*lw6-7ocfUXZp^$ncEKSVEY9#|Zf62Tuv%sjx3i_Rj83qQqLor8cJON%070w(a|86+op;PfZnZ*&1 zS~KF=N~}PY4JgnPMRF}>{)gU~g-{VMYm9tW*beyi=D@T{25GpGN!7@9!59GF`MH)HuOP&$f=Ta#_m&R^+!=Uyy5Q-ZYT~+E5c*zM{n{d`zN2cv&$H zt?2k31+_@mGJI;QH+XUC{a&aBdVi|)$2JH-1nPBLygL2)boKy#PL)SI%bHPX1*fSY zu~dJw#e*AXD$s}-705$K42}B~nHP_}qAoNUFaNWvX-?ocbKz^*y{Ph%-hu8zJExc1 z-c4`Pe*Zy_xMz?mW?9^P*JBQAT7=7J?Tqg`%*N_%V<0SM_8y-IY8}ReEv&8Vu*~>H z;;o1)SG6yhXno{;JiCbOFAPL{pq(npVKCDJ?1o%G@Sb%EO#fB?-k9bN#)GAWQB3b$ zbs%PDU2^=*Xd?2!Y}WPrwsZ2~!&F)O%KTaGv*JK#ejq?{t@_%de(Ba*_sPM(0eSXK zCft;oMEi0|0q;dCO`bJ3Laa}v${@4qVdM@oZ^8~Y&h*c)-^&;;mkVyElYj0z2WSE9 z`rLgy1h^M+cWu}*)jF-_mVd8S<`8viQf!oqDFG6U9rl%lUpEl@nr+IGT9O*#KxwBxKZb9V#;Y}E@TrNKr!MxRNbmAshcBH68v6HgTIo|z z!W}K)qW~Yzi`LsCCoV_H$+^ipe&o38xQr*noU+%MV~xQ9oXpQD)N?A{L6l^lXFjpy zjMiWo^D>Ct@tfK`Xh7}m(OX+}tEj5Fb+2xDOP6hmV^=$q1nZ!Oo~FAV6IT05?4^ym zWNtE+Fc7=iL;gFGqx!$l2!T z`cX0tN5(PhA*Od!Nloc42DQA7=pImE&WW2^TbL2HZ82|FTsUxT9#ERodSX!a)jdIZ@jFS#!V~VhY zYZN6HMXcXu3J3J7zWQWbzDLRZtBV`IvQ%Sm)`i1cNn)c0DM^_F_4BH@?`A}01pyJG zC%5h~R$cR-yAGq#>Dc^(xMa93mMA9{Ktd$&W<*MK}bAKug4{fr*>P}fj-z@n@elO62l zN}=A8H-0czM>)T80%9Ut<%TJAa8O^66n1Wg$_GT9Mvlxf3|r22_~2fay?uVT3#^sK zBn1qrxw(Z+T%lKpfIucY;~Tk5p(3>o)T6denQ3&X)_LRs%n7CF|MG0G?P_{A_1RuA zc50Noij$G})KUx|dqyS1jnJm`WKi6x%StjgQbx<2YHJ-IUbPY|v@E|OWbUBeO&u#M2kq;wD8#77|YCy1c?8 z>+Qy&=^rD6d}eRLf}A*vu>NERyQ9@$jJ!i+*5hACEhWnPv?a3}!2utj)A5y)W+B-Q zw#Y+EP456U5NL(hPS`BtSfqWoP-*wmRNn3`kiJe3zj}dyAW%?YXrA}m@oj(zeZkk& z3EEV@v8sZ_%ge#P2pL}(sf0YJm@LMw4aB4=-2w<5#t;Qc{j^ePWTjPBBdPH`&SO0~ z_)Z+Jo%aR>k+v3FoOuAr;q1~}(9fdSF=Xxl3hr4nDQq{)1Gk<^7}avJ<~}gq2DRs> zD~yieII68*i)QEO@I6#3Y%eb=)pQyQ#>R+Ewuws!bsq3=ep+#1d$ikplCpK97QVV3 zou(8owQKYvd(P#Qp(7#va{wvO>r@(|ZhKyX_c++umm6fj67{H8Jmq;uJi0~I9&=l4 zHwU_MBksn{`0Y>nZv(jCL-uK}6~v`y9jyA`u?6at}!5D1Ww-b4xKLrlqOp$zA( zf(Uk<94&Yj7@>@&g+Q)3pSDt+z?IX_Q|cwwQEv#;H0_H$YO>TbgRLS1PE_$fH=KMh zm8_Dc`%CE-)*)0)=WFVI)n$%BD6qOnpLtyrWjiEUg)7d%Ya~UqV&X0G^7dI_SNpq2 z7{*?IFKSM$_PY^-&)5q{I8EP99QuB2?{`&w?m7_>Iy50=d-2m(_16_>iT>gy9vHsA zE`7iRn)>V_bEVC!0h%krdx#yTmUU8+zq7M7&REIBEM!}o<`Kj#uU=k9PH+@leu-e( zJ!_1dfMD+ekvh}Zgv$s0NIEN8;gQy(^&kvhyb8n2Cw`Jwy$ggj)+0hr5PD*usaB?@ z@f!*~(A13Rv?j`!O{8uWCosg+lL~rooDR&b8;DsgQ8lfqTp_4^IQeSxy?$t@GC3Pa zGC)Tp1)}&3XXByu45IeX^JvZcd;gJ`=;zC_Jq^2j#w*qPRzR>Bo|BidJkPOq{7bcU zO0^b;UhE!S#li6y!U2f57Q0~pzSehwz&8r${8?d@2wD{JsUDp~g742KrulS9VGY4$ zmd0BNxKYHgq+?qon-K>x?RVy^`%!u=iNVe#LI-rQKA(Ws?~%{J=~*}4ht~*$UF^A zmU6@nm%*9k-j9$CvXvk-l;QU)AoU58D4^-x~Av)!UZVR)Ye~oMOcocJLt%ZrGhF zCdUAGzzF*+qCbwpLYLEBMe;tDTBm4a)-XXOlVY7%M9|DM3S|Z>`^>;_zeL2MD3P?&AI3f&lD7 znRt0an8DP~k_@ttQP7A(mJ@75C6C|z7;a8m1aef~Ko1TSdmAm9$8K#&nLj|HzeGB$ zH2L3CYg1^UnZ}3dT!f>yu0!cs!VSA%%41t`r&nXR$T?DWZ*G@GyM7bQ(H*NoxR=wt zQ}_RT`41fff83(vb+GPAw(Lp~f$vTQOz9TCc-0a{31fK@Hd0~PVZS!rG?e*-*s#X= zRi=5adOALmM$9!^IX<4(aEOhMLnZO0$hh;{oAlz3exnaII`~U0JK}|H2kv{0i!G#@ z?{Cb(t`Jj=V9Oftk%O~}4wLnxj&)1yyEJh7Q8P*|?XQW6)F~3)6%!C_$<9(>r)AY(Bg?<#y-3{eTTGD~A$8Bp|KfF5S8DTtzgD1$!NIAzk`1J#1X=dm z@;4tkP0_yUeEp$i1u-A0=k9wiF73X}I3la6R<>33l97$yE7+nfl77O0O%lmk;JemD$TzBApvmU5KbOF($7g9pwpcDQ<=g+zy4xORjRx!F zL6Zcn$M_qL%+}Y}hw{`JcfDD)a#e;(jX?#y^du{viWEQEOdlXw*A`i-IO;^GfCD5499O9kPOpVa%16gjQbv9!+dKmoesai5 zvQgGJ?hg}4(H*q+osA_AX~IeM%Qes(+j|hf9y^fx>l#F-DaJs>O;)pZvAb>!?#HQ( zNh=z)6~a|kMnA6HZcHuJLH) zencF%F$P>_(A&;?K;0q_mhy8mu35bMEFaya(Y3*#>l1eYwRUx*S z(%P9ar(9C#lhxznavNo^(mUdxqm|0!jtjiw0~_&`pW9kx$zHk@P-?GVB&Uid!3C+bho| zy0Gf+EITb9lUBH5&ycWJj^;{1ZXxx%9jp*q;u?xW)G!5-co?(TiGz-zxv76RnrhV% zZTq_V%e(+4MzD43$C45g;92D7sn{OrvsxjUw)-MGBZ9J<;@JGon42(%^HjKwqPaE{ z*&a1G6Mh$svJqgbu4T1;u`Ex3boA&-oTk+rJjZv1 zQab54w~7GNHHlhwKxB>4-%d07C|_CrElK9kK`LQx%3@(X8rq~yRG44$r9%IM0g+-? zwj!E=+~);m%%Q{?A7D89N8BJ-Bb?%ph+4==Fsbl6+|l1z88v3hhr{!tV~DAEzCMk( z%LaOS2rf0K`Z+OKZr(<8OsC_HTKh(fuZ~Utm?aV2Dx11o6>K}ds+0_hsm_U}Q8L?{ z?+W_O+t+%SlJ8JH)yx30YSS+9U3u{X9Wb?R+;vsb3hempnC_5l2d`q+w;BI!Ze`Y# zjBKwd*Vtayu2la>dLls!vry6G4%;BQ(#_muTHicFk}{}Gxaey&fx=p;h6`1VsFYLr zY`tzi_Iqdy_HOoLmrvh1aGFB9@D;!VyfAfsqg@lahuD)*GBd5A?^c9nC-rsOhR2Oq!>>)a4t^?z28%_?25T{%H z>V`%}vQFq}Nik%bY zaYxUhV!exOr*8n7T)+mJB}o!Wk3CwauRTFZo|Xk?zcblw!LwESF1Q}Lujf$}L<-y7 z#YYjOy1a==o7p)Og2f9Nj?E!DHy9rHSjsM1_g$H4T?O`8UC4M_fYo9V>hl*2_ z!I5=7u{xk|BpA@C&Pqer*mX3(y)Y?Gs3k``(r!T7<6j$3^PIE+7(#Uft%w1p+F@cc zbgc!@V?W%Em)dcObB^nygD@?LkE(VftnfSOY9gCZj5o01Hqy<3^Dw%NpQ zdr&@9zABzx)cFe~pV3HFwa&##*SVj%a7SY-23}SLoI0fqCy?E-R57>QJ=hL@!Y)c; z;~CRvfw{ORK6Oz@%=IWmN8D@eW!UPRPOMc&JT5!Hvk{hOqvclBqCl>`=cA+6)UFmq zcER>IG5YRir|XJv2U*Hgp|&qZ7*#)vE2r^oPZNSGgWngf+$g;|ScT`vnN?CTvi-hr zb0LbTk&OjN+iCATyLlBAVKnNhpTY9ZeyKV~*U4(p!rGb5JCj;;YUOoPmazB!@5b4c zQGkb@l|55!Hi;@mJp>qM|NF;hJc^5V%6lPA1~Kw-Aw2-)2M80T$HfNYT%+C{yzr5b z+xNyzQca2sacwkV54+$K;1t!QhbnXluPqS(3!{)m>~7XqBN_{S zJg={@B>F5tss>@tX&XEcVC(1>#>DimOlL$?d$fJDKr>1~Mo3mBDW8FLllGj31hui4 zf#@@R$k`|MqD+Zq)kQ_Ll*mpwoy+==xj~dg+)P{tM`c}_SM8{wWO8sMzhKwh&WBj3 z5=6NEpK%dn$_-Rj8aMbO?Ft>#(P#=6bN4oFBL8|h?$$D%lVw|l2P=UT1>*Z@O zkGh3Z@w$fU9ILR2rhCuRAdYu1awj(=P3zokJUf>Mi{wyG4}%MlrLkN(%a;SpnLP9X zQSSYf>m$2{)!8Fs0-~cy1|UPR02f(q12(QA#asuZgd(T z>Qy^V)amD`rD>{wyOV`FCVf^VQ>6SLKNj>#3@D$a4i#u|^tvg>^OS?|HQ(7lgZ{cD zZdyuUNTF`Ya_K^668Xly_vU=9ZhfJ=7RB6C?&OtP%o6 zj}}j%kNbAm2{MP)x!T_Xy8KdbG}MsrV`emt$cu#h0X8;( zGgcBZcr_};^Vq0MA6I&;P6DahvDS>fYeAHpn$0?)T$}|%6~~9W>XiX`J0o-=j;V+e zE)|_1NZglc4NvZCGtD z?hg{}$BBJy6OUY`u35#6db8l{2Cu>cR0SO}llojr*(`QQz?el$F{FIC+8v__N)~H9 z6Rdq)TVMG0*qQUR&cH59lZ_R>w<5M>aBFMp3@^8RQj|9BM9ehi9rs(u|G-mvI+jY$ z9wWS8<8u|!Lg^4WrjO;o&_5aN07UH6n#5Ew+{h#n560JsV*D0wnKA-&xn+e?^Ri7> ztxBTA1?>Y`XWqeqTeld8vthde8})}9G-hrK-BnM*sq~xPTrqx^&&Asj%NeuyLg($W z^^ZxUPt+l7c}P{_QV}Z_P-pEM11|_${-oF)1vE6rZR{}IXB9bYJ6xJJKgIazc(&D` znu>P<=Xs|S=EJ2^j*2-L6FT%vvQ$2z=k(UMGT!*v{jzXz+|24bcZ&XeKooJ@)|P=R zYRV}X2}su%msR8H^|@g3)9iE?^>F^aEy8{u;2)AFKM2TlqNTN+LML|Nqwt$*rO`%r z)s^#EhYt&)k0NbZB`y#&hIR(%4)`s#_B@fQY8@aSl=54`P0R?TS*3H`ULSIMF`s_s_ zG&AwS=#EZ|vE_mg*fMk2QqrEv=ST6@``9V$3l&*cw`BZ%rzC8;GMA$IFj<9`bcb=J zSJ*1nPl`ZP--K;{NYm;V!>F8~4Q`X>wToesTu9MphSk*6$Q1q9vtN(rWbgJbzGHoiv4)rA%uLKy2LHvh2nc@3 zDjPN~L^6n5WF$@xV< z$(&nmUDnC^3@{nS~!zj4oPt!)rP+kEP#g;F#jUj zdlC8V9j|gXT|2{RiLyuv>}8N&?eE=BM5?%^+OHbRfQV$`_HvgGE?r%qA#y+iG_T^KKq#OFGo^BC^KJWv?-LB7{+SQ2SRwQoiu5O0zE*2aNIDith$kL5byg)$8Q|d?#cr%9`L6`$S^*dX067GA zG_r7CgwIAva}l;w5BJxH_|KyPjvFdf+{p78;aJ_D@x&V_=pug9{%am(|z=wd}09A(P4w&AD@- z_Ve80oa*;;6BEJI*^UYYYz4K;-LcVWf@Mz8W_^OZI?yCDGagSPBZ#lX**j&fM+yV; z4m_paCxgmRh}tWZv{f>2vV+=0gbtCGTApc|fVfj60ki71*D@SWR!jePkkbQaeQD&V zjW_&bkKj(=Unq_HovJJHOTaiUc57grQ^%V@)V29;#Nm$#6v8a7fBi3ddiH}9z~V_C z|8ENk9t^#mRXi3Dpr|{lUn?tC6w|&EzS;?Hu+X*e{8oj>u4lU+)i~12>UuLsf;+(g zOzJrGcR`(vh9HCv;Na3pk{J6{6A*=4XE)L+eVZ3CY(+0-)*rLMrD z5&g|@tHge2-3(S%^g#{cNdMp`xYRTS&q#mX4d7$i9hiWEAzW=4T^|v-+Vd*^cp(xbdyAo6kj{mJ zako+fihrs#q5zpN#> zg2O5PR|T@OIkoF=jr`rYnBG`8OtOqKo-G$Cg)?^aHb;4sTWGd;wxyr}|2?sN2>$#6FwBnpsHYBiqqF(JGQvm1b)*wl);rsx8>-D~d51iIVre#;&RQ@jeg1OB z+F6K+)EnCl)RyhgmPs)y>r#SU*Kz7KYK61;k$BOwnr9{OwG7Y;PBz}SdKD$bZjw!M zM{IKTe@J5m{2t>N07Lw+uuhP6yBeLwkg#Q>$uw$Lu=Vdz*&7J(u4 zd4z{1RFbzkY14<1>68C1>c%Kw`lYmrw0S!c?xid1a(OQShi&18wvP2si}J<6w5Iy( zyo8m3!+-bi9wqQ|A1W-m&BE*WUE4ddwdZV{>R*kLFt`qzcvwH6&zn^Q|J%6+Whl{w zY2t$F4CFEwY_3E7#On`jfzR|W-vG(@ZwYkzy!J262&N4I(*E-=f;}oC0ImL~pn#L= zpJ#&qQ!}8a!cMmVQ0%NcfFZbbfBBp}e&Z1yXC#mrv$X5o*a~nsmqC5MbtO`FB(ZfY zohF^tnHJpD2KEr}6if^Fj>v|EhQlN-U9H9F1KKbk$IhkvJIvc3&d=YoRzR8h)9TNc zMmRv>KaarY8ZTht|F`&t|9@#FT6#84!+(GEHXt1Y&er9T{fCUVlK!V&$^IOxzcO{> zpU#DN0aFkhTk=F1Mf1%(<)n|+-j*06h9tp5`quhcPa{_Fh}G(gSFW>y0DF>R4n8&Z{w6JtCw^Qv>*-AdU?ML844j+{dFbsS zL#JBwncc4=fj@n)K&uVkaO!`q{`&oA!!#z{^LsETNC}|Un&xGe+^#f zP6Oe36&O8+&ve%Ut-LWkQ$NcXcGZfqhLbTJlS0VmuMdpX0Qym59y{&3Qr>2dhDw&Q zXtn!)@q07fD?0a4mFjX%`v!>6SrPzC1iVf6fnIz0pK;b{pWv~bgSK$ z`sCZ_qc=Cs_+I7JizY(A)j9lOiDF?wG4mL<#kYwy?K|V zj@+M5nZRjK=KN=dGDUx#!Dye^{Gv#K(hsRsZdh<6hNsO(WxR%CWUPUxYA<41_kuMbA0Mw zHbWp2%PJ9PVLw`tqf=ra^n26Rvq-p7v(%_oMknXKSP~fy!FgthW91v9(yO<4t*Kw( z?C!HnK%hyeDF0adj|~n35Y26vR@nZUwok6RQMp-*QM67xzp4Ml2Ea$|pQ0!>dxy;g zvc!ggJEdEqp%bMwGhvOB(17FZ1l|{48v*nzc7+;;DX>)@EjL$~9#ekv-qsrXJlu#) z5pY_W$2*Nyu&o&>wQ-In0mvb+f_$cH$jbqwQ)Yw8X7-qOuzFucfpuLpP0&l=6#^GBq5q?LGRMO(gbqZ%V zKVs#f=P|G`-l;qwp?TQMCOHRK*YVfPCg&R08*7R;q0BP?U=z^$6FU0}@ z6Q|j^!R*qlu0O-$!wn!c4dtO>Bd>WV{Q8%O&5kMiC;oXY+EAAOKYq9Q|z)W;B_6q%)>%=1FaP|?6LXP#A5NJJ=8k#Vtz zEVGhADr9CE5=w?;h!%zX?sxmU_xH1Z`*WS^I@dYhbFOop{omf##(JLhyzl#UzlQrM zQ=;|S&^q*vSFD&?dc=L7>=L`kOj&3>{_*+hH?7_9RiblO@O>H?XTd&g*&(RC-KJzq$9Xu)F{ExBLx?=rVr(BplKeR5%Le zi@{2dXSyl!nGdFurS0Qupw=9NDiYmVh$o9i%aV+;b%*DPxV*|KxP2jtPD9l`1$ZMz z`&Nb7>e^8p(b%;I$U#=011aQ3KSsCkQne zzVE^6Oakhe*09?-#QztxAWz&o#o!U^7@VPy^Q7(C$I2Tm{HSCJIpW*5*BCZY zz<)D1x`}nq(;h3oW0QsEo_wxT=iahP9P;Mj_1aa zM9%=7|CPqWA$Z(x@#_Vk`jhPa`m=PB+*hprdT4@=o_G&!8zJDK2cGDd$jfn@B7#Ugjz)j`YmaZl-pS#5X zXDhmImu6FppyT@olE=>1Vo66Xg|BP{y0{FO_kMVolC0Yen|eVNsqm~oj=mKic#KNK z3d-xqVR_dv=28SMT){UMhv z{&GzJ@u%u;BIFCy<<_M$fBo^zyZ;{;Q~vsE|9}2I{<;bOFU*O5{q6q~Ux4+iH9D6O zD3$SFe?f)*@l$ucYD{6ncG7J(EPa>cZ{Gvm?aP1Essv9BH))N93&Q)q^fv7YeJbm} z{1k+`FlVHF{qc`ME>u0v-ASd1I(W)|Lzn;k6UCP*PhHqE&?qY;)L{AN&tll|_L-!Y z3NDvnp0jMf{U zb;t^0poRq`;~89p&g-&b`;8pRk7L23;FC#0QZkL9SaQkv% ztU0(5z_Z%gA~(J#A}Xp3ydpPOZ0N8UL{gV~eGKS%{&P~yi~gasy~(>|xo2eCwmKdu z+w)-Wa@F{NjD4yHu;n%|HePt-|1C@*Y-hb(ebpI0pVyP!Bzq1q6DSB9f@5hgR`&H4 z**JC)aWjEnBqOQc+fS=y*j7Go@oV+R4^O&f9veBV&0)Cq8Vy_9Fgs_dMCS_qG{W0?R(Vx>eP*4o30vu`g&!aZ5Z<1+xnYMg~qUt}AEm z?r|+-z>ZI}J-G!U@%t@151fZVkW8hJ-{Hu5De_%PL2YVWeE>R~#m!6MV=@NE^1b`q z6x%2$!!Zg*1p+ACZms74P0U<{&OS$_pA&4jilz5O9C~iMH(>Ez-q(DXuBjhieDt82 z!Sv$y9AtLSE}UtRIv2Ko14pV#h%XYWH}nBkzH+E~?mDi(qEG1;AP`E9!4rp{ixbBH z*!1kDf+xzgOJ6{VZnAGhb{vFCN*B$Dco)op4) zFcu9e37v{?iq_!bk6nJxEt9%38?;kETwAs6C-c3W%Lza`quZFN%bjwWW>6nHK^Bm7=J-%M8<>_l9M}F3o3BxV2X7nTM$o;O3%z)KF zPu-rz)Cz)k#miWe7@z8lD}Yu=Fv6NVJ%7UQdzY!>%s_=_kEK^dMmD9tI9oVaJ&XN> zWp(^rG%fTH`g!+EmFx{q?NEzQ+_;Tzn)cl2$WCm3+(RV6AylI;-S>0h9~Z7eU>IdaD^Q?p`4{^8CP)o|++u2=5GIgGpr zVHX-{rGZ^NWWIx;cHSnL<|Dr{{cP~{gP2F*_Bq|H7_5UF50uh3=fNxF0 z*XsGP?YY0p1W(@Q=A@ox@`W6_A+ z+mWMkjou_vlSAf2mZskPMx&RVbtWA8U_ZOP+ah40Sq9NmOO)ZU1DGn?tZI?Vr@9&Z zN^fql(z3u2*@?4c0?xi8D-u^|H5e~pNjT>}AL=+*DSZc|$~})n6}Ex8WIgaaV1-Rw zo%#77BuOAvk}@?t4^vxThDPkNFP*9s-2Rpg;0`S2Rq!m=JvBssOmB|RSi9GZJaGn}XGUA5rGi;|n8$%`zXSzYMs~tLJ&=W4;Gd z5jcMkCJDyYM?Uj2P_jH093r?5mBQ583w0!6x_mezyHuq7=VTrv0@Oo`_Fxwef|SWE zezy3vqr)#S7WF}g8K7hbbGvBb=$tBLP{TYx11u-gtKxXXhAEsA1 zZFmQ$m~hOX1-f-7`wE0m~Tz*u|Li+dodQS zr%ogGEX-(Rs~X=vsIQLQ`Dd^7W*oD{XQZt?T3iNy%Xq2iW*qNuefhgXF9rsC=#M$m zZN@^_QPI)%%dt=EgChJ@-XZ5z;+X|k$|Iwa&noM`)+{5CC6H|28G@{F?YYSAA!`}k#?$wRwy!PfQR6-`H+ zhsOpb&K74>z3~5WH6{hCn~5{EDuPk$qu^mRT(Z^FY4V84rAm|LQs<9Dr~shw1Zj_l zb?@U73=t6#%&%pf<47?Xm89@o$Ntia6>K{za3jRsPpEy*gxf|5J%c57My7*jfe7>a z6v{RIYh|{~`NdjyeIYVWiJIhd=WJlP>q==f@++Bz4p~#kSxcu^83W6{V$eV1Dy)BNuHL`S1M49H*RqymlDq|QC}-&Yl2Of+utI81pF^g>}9Yr)-3 zSaKjds)u2Uzm>%Q?%uy{CC&9*j5mqN?RqGRm9!eY2wcne|MAUfZ!l0Km6O-P*oC3V ztypBhbYl6hZPJ!RSqN-=d94Wob|np&=`uT#Wlfp;jqgA9sRXE19!h`=(6il1N(=9gA`0K@ zIdR4T-y5&w=jl~V86;F^zik2BdUWq5?80`pJA<*;wq|l%z^@ga&`t1S$<4UuvkZkKD>og(-*DU8XW3l_l#oKGE3#~IDMZoPB zh-X-*@^uU~a#?w&aXpHUAhIHEs}yR|BfbB<2RIU2e2T}r4}dH`+4d@-wz(Xp$p z8j6o1RM(B*=zcut+Q-wV^>(IQeEyDc?4p#jL#C1}E))2^!YZY(Q}wdcmjwh*kC_h}9>{ws zg7wuY-C=&D-f52v5N$GF7HrdXR(9LdZH9qQ7L^*Rja+1ZiN}37SLLVr^KLg>eQ8sP z{JsUeNcQTlQ(@BM&7M!>oFL2>e3?c)=Ia#{mx|o6>m8knH;8L*RCr|VK0FCK#8Pm7 zZY#Ox3$V1Kc-tJF^IzUSq(R`K;^lolQ}eAPDI<IeqNFm1@dWY}!tPtjJ z1+oGMe|ll$L4&iVH}Rz9NkK*UqDLu@L`-tiEt_=eWpOq3@3W|zO88Z&uHTjM(`lR) zKr91mzj-&pDIri1ED~dl&g?tXCh~H$LKH{reG;WS8Iz&uOW0u!kHjFog`?8rqEyZq zA`zt};z1{nIo(Oy_#Q5NIeG`(k!X|axk@BTS4*l=e?iqu+x>;XWj z`F)NvJqW(X86Wcd=#04JO1)xs71`Xb(j00&MTyv~mm_QXScNWOvGd{!(Ua2ig*A#@ z#U>o{#E^ETONN?{fk6z3Xt4c;1j6`BL;IsLO7wL!^x)du2^Vg$B_+&I%#v8^MX|!cLNMHz_ z)3CyC94?Uub#L(X3)+0=d5!C)_Zd6Fi$K?^2*;=lkK=iUhMQuguBq%c$3A%ipsFgp zqlqV^-NbhaMdJ9#o7#VQ60LfEB@?Z0sj7XIbVaO5MhFWy&?>y{!$mst6cdit%F0 zEiED1_E;suN(;?-?i2@bz1Pf?;*U?hX28|RrcgXTEv zB=#v+^qM~NAjZ#zP6w%4tsD*m85&7H%!ZBtV2{}}Y%MdB5pk~eMBFnPrkqexXoh^} zGsb@e%n)@hFo<0uXjBEQ2l_!eabQ?9Gvf-3KZAUFgpWB}^fsDc`{kbdL>!iQzHD7q z_;iHwI*gqP58oE!6O4^=v!1}P5By3Fccm- z#=Zt@lqa+N@0e0AOpsq_#YXS=>!k&i$uF{FGBw$9I0|ULHU!`KA}Aa?6c3R0E#R>H zj(R^GXztpfYByvV(lB#2P;atq&@%EgJ1s@XYtC z5qc%{wVi(wriZ8X5nNS`Qej!)db4KGViR+EECX5C%QU$?-%96>r2k|%X)t5KIjo6%BHst$GqI{U%zV~Tb)uYAa z7?@j*Pl0|Gxks)&QN|fEIv!fbvO2mMccz?qXvB8kd% zk-iqclW?<95>)SMhKwVos?3&JD>4a4Kd-Y>HGsgrsL447CX%*=m%%Bq#;%=;v;o^B~Us#7(ZLo#Q4X z{Ac1I`N1hB`g$pkqnR(2k313`oa)LO7d;*Z-RT6!B;g&Y{xZesF8x0MH*$OkRaL&iM3THHJjVWit1NVg<0^J6R^rh=lgAL4*Zq zJG<#w$&cV6$}<-1y(hvGB8Mw-dg>#XkqNWA!q44^H!_Z}m)Y-z)%Y;U6qDJc|?(A&FPP6reL?AN3uE*$lY}jbw)HVemnV zNWkOsr>1DPFL)P@`g36W_a@oUWvf%U)r6zGz>wVh==evSFZTTRvx4q4YD5<&@CM(> z2+%a{gN&aunr_VBr-=%S&wLo`MKlU+&RDGy&ybSSX}t?Uv>!10P+x63UUHq084t7P zK&mI9Z4hQ?v^KM-xMgzg<>CRuUU&^hz$lcsFh$;^xesIXPwR?$^a!1a;mB&z>7m<)`BMCI4?SU{>zX+i5t zK{U9@{V-(xNWwPnK6E*^?&xx0J3K&}ZHu)#zZ{#eKS}i&0A|{&u4#l7`!rHtaxQ4C z%TjDYWQebBM11Z;#)Aegm=jCTwuBi7`FUC7m}PT&0dH%L0>c4BIXcxX^#^r^#3phd zWNXrp>xq%eBKqJ&Zckx?pV`#E7$%Jh?t>Lhm+SoR|&Lr?ifhNb^}J-oqt zrteuJb=!9!occkf5C@@QRR;@+^s@FsmL>bb6q`AwM_&CAra;T-eOL0>PvjO3k0OR| z3U-+rF$F$%kWB2XX|%Di8Ki=?Uj8;1@e|{?<^rY?)FkEy0rkY@v>QcqRW}_Kzxkw+ zT}5Et+7R>|ON$OU0$AAw_LmH6>Nyu7--!*(#F~qIP`^~S6uzS{AF4i&n7{Fdh|6ph zY4}dru#zE@30A*bR_#sxi*uohlSC8_itlOGXqAUjC_ub>7mt$Zb`DP=}JJ6I~C|M88s!z6y|Z` zw)+2^$R2DxZw1EyjGiug2xrYpY}+ofn^uwn=%rjLXDX)#YzRSF0@v{8ZE<~JFcci_ zP%9aE-!Hrkt5c)4pp`mhFI?K+x;aB@%Y%}f@YN?Jm_XlLMI+``hl`RU7e#Y1{ykFn z3K3}C7iZsVRd zvShEt7CBg{a@C7u5(Q2=SKeDK3bTq_d*i0JDhFMH%4O(1{(v~rd7bj|#wPG@jSif& zh@^J5o46|zxwB-mFJ=)HV8oo_^f@pj@@XRFnU!0!^vr&E!fIdG+A(L0K>sR3%S*25 z=X94)Iwp!5`4Cmhh`;dFgU8)2?kv8)e@l}twyVj0{A>Nw^V<~Xf<30Xo9m0u57~De zIRHjONnPPPC@m}A76^Cs;;a@7qXMsGNn<^A(z8C6CAFvW*5jr-*M>t0#Nm7sQeqY9 zb#Ms&&FMP~+eKU@9&p+nu*+=<6jYSH+>z=vIkv-}mB`A6W`eRB(d-P+k&nCu56PfM zj#)VwkhZWC&l1`I8dC6pJ=ZN&Iw8qCIZYbH{372hYdcqbD zRc!qV?6^?B|8%iH+5ng-n(B=MHM()B!byt&M?Yk0aaDm~3(SR=u6a^kqCs1COKiJ6 zQYJ))>lJi`?}od|i*zZAA}S2oAXg>nR4?A?P_^#wlWtd+@`PjXgQ>99K9 zamArgd`=#Cr@DQak9ATEH0T9SbE9jON9tVa9JoO=#!Jg%%*`X<^Yr&%8&~t68c4#Oy8PMj2 zCh%7>N(?!%Bkd#g5y;i!)S3m9o_mI6qJ?uR4Az zV6_vsT{UtCALjU4b`HfiNn(LvZbLRaNfXtbdBessccI6-UQ_Be;(6!z@%fM))U?5Gj_Upet)M)Q)Ughc7!s6rRb_3MW;iMzgG2H4!GJF&y%90SA^_{CSt z;7HNd0S>)`TRES=;{)Pdx#9zUqAdy zZr=cax2or;VvMad!Tr$GBX4dG8wIxN)e0fka>K8YOP?_XY=~`s8u*0zJHY)~5*vd?w|IQOVb75VxPA0RfR~2PZ`2 zmk#1fY=_OLZMkDv@S=jWTX=7KWjzf8@i`cX9-(X=Kbzg*j4*$ekPJZ5CNBa5euF9V zy+FnuO2J>s$gH8}6+WNTJyK&5EkK8b+~9gvvMqb$187vAY1}4N{5tnNsFW_v1PQ9{ zej`F(4z6fu==VGm08GuX3w0Yn5%J$UDs>{O=M6xUY07aYSP_R~JRtW0*wv+@)dV_h zPAj>?2LAwQ#yt%tg&jjFz9~azdVHNz*0%uileIw_vqd8r@Mdqd&w@p}5u&0@wWHh3 zbPInQ>>S0djmo426=CDqNW)dAy7Hf>L=5|N(ssvH2UJB2>b-559L0D7an zfnRZ4s{F%6lct#I4cjHc&jO{&dT{cC<}Y)niuxA$sr*{ivxF`>Uv1ZefD&eYfpR=0 znwA6qGmE5dtUcH{U2Mn*S6WKtqBVB?NQvTu3J4dxx^vw9&WI_@{)5NF2zFB-y@#A= ze@%xj=70n;gHVO@L&iyELj>3f=OwAFp+_#$!B6bcZk2ZE{V-_qZgzcbHmCq!0+lzc z;i`ZF9sf`LPfQsq3}WQw9N?;wI!*nyvOJJ_%p>bEtbz0Om37^)T{j#D(-wC&abY71 zPkDS~xXr6u+m1VV1UrdI5Wc?<-Qa#w14?zt>vCBCQ=tWTj6s9ZQA;0~!zFpn0=hYy zZLn*hMD2!0|rmezpR}yE8kcf z<=UcP+U1iMlX4O+C*vnz*1>dEK@sU+Zyz0hp#=8T?&3>YGG`JDGqb%&N_VAi+5>n2 zcyw^PSPj7oQ*jTM*$9jnU) z%d69ob1TX|c^0^)MHrAOCo%EK^5u~TOOIfa?wdq&w=co~ z*p?5N&B;#$Rwy-Gh23!;Zmu9>dT>0}yiDAl2F?d)$!IBLtXeyJ@VQ*;!90Bmti3~< z4+m*ND|!O^wy*M`>y!HHHy&IbFvO)o%)qs*#+3*5cd2OR%x!3wobUk$kl7>UfP7dX z<6nsF$7{y^%oW@K#-cB@Yw0n(Dj9!x%z+ELdI!87*yhmZNwp#$Qd0?qX-Z14yo-SR zBPVWboKK;@?Ja^k?6dMnU~m%wc=zraKd%+oEoj@%!awqd?{rV_QMm>?J-z07A3xtf zAaZHo^Qo$@bf1EKtX$B-Qesl!n^{C!?sV+-fX=`PX9V{ck5Ck zL$J|FKm=6e8#@c>WRD)p@h@LG(`-jxhkb&SSny$Ra7F9F);?QTSJ#7g zLQgw|j1KnwB#shn*y}G>EMr+&0H8&O(S}IyDAd;edIXBcg(x4-! z2X>qDzkX;~`?f2{j_$nSM=rg6{X-N>eu)B3!BUU(=~blm|90lXce$tME}zn5Oe*|7 z_VsPSIUe9*cL~~n$&%cUB($k}(*Nmq14Vt52hfx3vwL%|cg4;L&~4#QtVX#V5QRck zZ2rrTrqWv!aWuUJbpH#0R9wP>K{7K33Jk(Qp7AiUx&%pK>Ria^z2je}%^=^C4<{C! zQH?Up{KU5FJ5)*i*XQx*iCF{fY;!0X5ZRx9EMq`PJDGw9T%7n|77w;16D6VIo9#$i9_n(y&w zjR|mq?B3I84IQUAzV}jsWdr>-?D-M|e<+~9O@mp;V`9OdcMeSLR9_S54n%Of-K-?p9rPOV89!U*G&qo)%7kyu@F|Ug-dYE>3 zur6!dwDGE8v619^g-;!CgMPq6j=Z3D@;f@y?}F*{8zaN!DyXG>@ckYHfv#ZfVOj92 z-H$+`wviD(xq^D=>hiqAO*@AK!!lNo!_?E4zr#0f2B)6{2Xv-rcsWxxJ0Kj4cm7^M z@Ly?wFRSJ)H6s+D@a_+-WEFAB<@JKQ!LZ;y^dq;y3lcb<9Me3rI**hG5y!NY9Frq3cP7|N`bYX`3hY7RLWXgzhm>7)J-Ix+n3Zz0!7B8dCL=hxquSbWa1R z5$K1e^>kKjvvA~#l8=?8d*^6AhIK}xl0N_-TXKAb!ud(4F%^`GDhL)%!-!mh9?~YE zCQvW;OYV9sJMMUfU!&3SN{UB33PKLTP*A27O*GV$)NL{-#A~8!4;zVE-m*g~d%OlL%fjF=_HR_^>j-{RMG6Zd zZS5eg!}!(Da?`jbL-i#r%dZ;f1CUfD zzg=gRa2bCB1gC3MD3S6Wd_ZFA-edR9STN7RGc^DTz@RFVPUNOIDIAv!?uFOa5Bs7a z{64H2Jr^>&VQG0uceRr~2P*T-n4Z`=>;W6ary+A7OLDc%{m#zXJa7|t=b0APPM&p4 zmar;*4A|(}qqGxAF}Yauj%udE;vaG>t4ht2@44ghmJ*R=tR8{6afJNV2MA)XR~HI0r*Al*d6w@EeEWz5M3wVfPZ0ZqFskl~kXGNX8&| zJXPxNF9ib5yQgX?XKV&=gKnztS+;_V4*ubcfknrFC7`MSZhf2M9zV7_Un}G+%UwPX zp+3*iNEsArt$$9%g4s{ku|H1>e}`r^a;g6At+>m8t|jNHX$&8lGAQS4Pil+XOZy1D zWYU@qG1O=Vo~92#9sO)-)#Gx>d&^mbyO%*wxj8PMFK3STdzLle7~Yf>6+1kH)%;Q597 z;5PRd)n7GQarT&=8xexrBG4d5{?xty7Z zQbyw9)}cm}Py&{U_ zR#IU{olNBSYR3H-wrATV`#DD3zfiobN$6J>{VCyFcpc;cF3XM;sx3*#-e`(A_&6=R z8mBh9HIL#%x{0lb4sA-7e3l{jj#+0KQy|&R*r7drt00~G$*&|&maN7_dGdyKK0OGX zJ&W*xp3C~~pcIt_IH&fif$X!PpYEHBNkUxhLegfvDjhv3&{rTPz^4F2mNPsGy@BM|E zB7uMG+V5D_r^aPD2G-={RX`?|cRKi{HNy$4hwR!rB3$L2l4{2Wwnf;hb zBA`sw-Do|!r|7;P$gIS!5=EmL?=~k(8s+s%SXP#IKSM*cV+cUz&j2*WRuO=MKqMX# zzyo6sgxWhVp9(W#X*cHGg57(b^RJzP3ewlILdK!lJD_#xkfy)13@?|+2B!hjQ`kON zRg_G-Zm1TUJJxpt;h%9^dq zlZ&vV5zq03#j|8nxJk6gr`*?BWpB^LT2nB~8{#QuguOY47wfU#mV*?F0Q%0mr^MP) zfxxY`qT8B*sZOTf1%NuFL)+9Sa>xlep>bPmzc~OLEQsWZo5EJPM^$63Cu`Gmd0{Sb z>*ug-OSHYJP3o-lnw_ciuuV%6>cjYBMhB3KvXuWrxsG2B;IG5Z5gaMAlhr1!GsyQF z;NkIAzugTsx;xG2 zFrShV76v1WuO{w^VV3qT>pd9%;8WG@J2Zr^Pp%buUM2*kg$vHQ&Za9R1Be^tGwsKd zUw*)}xNyFR0*4}W9KmXHku0Uuk}Kh5Z?!oLG`HH0XyX`wUICwx2x$y9H)Nb$^ZAk}I7X#{vhJP)Yjv5QqrbmD|LF-Ial?+GX+YZ9_U3s3w;{`Yxo2nv zg4)lZs@4grk)M))ymNYg<_-gv!6mA=qp13I) zKE+;A9b%ksuIXaYe3C8pSJ3_mQ}M@)dr(&1o_#{_R3^X@r*%E&Pxv{$Mr=5tD0w82 zGDO&>KkJPPo*Xc-Q4rj`^CKeoW31bNVY1-bM-`sNd2T$UYZRA78Gu(obcmOBsr9Q( z>?wg6svD&F-;!!*73Zy-Cua_eZ*H@J(Ot!N|GOKvGcIQ7ZfE9_K*n`XaoZXbWj>Y? z_p7|PL8TFPl61xOaT@AGWf>B$4D8V|Z*X1xPSH(vW z`Sq*RsXe)CiZF^$IScGot`93I(bY!T$fe`~JZVKf7q0Oyt&e6$Qe&7YE3r_|lcgHI z(Tq*IDn}A!X4J5sXn}$4f`E)X2Yu9ROiz#>* zf)^X6vHdZ+J3Z=hIF&WMbrYpvE42L=+W6M2V<&n1MO+`cUwV-+t=&AI3JC+N&K;|G z(yFOiFp=_oDE~g=@Dev-%n}BW?YQa%?3#E7U*oV(y%M_C=PIT)rI0u11J8v{{=)ff zKs=U%3s|PBz!U7YP6i~@FHN99Zgy$L*P!G2?0k?3v>QmmQt8aqQx%Nj7m#p9osYXEtGu8 z*d@l$u~Mx+7eKS%T=JK3w7+Bpk{9_P2qF_og6wyJNW0$;z`s6)-5%2!nF^WDN^;tg zKeR1%@!L#}HI47q3L|DgAzz$&EZ9npM!1yTxXX!tU&EujBGJB3x_5FUIjOMdhnrd^q?QTe@HKKV4< zHmm3_0820Bw49SZmyJS>Xj_ecla{|z@6(r-_JR*hS|(i&_5A>GuS%c}2^a0gH;!Pp z;Z=9opQ{*HYadE&OTafq0x4W2s#nP9G#8kHVHY>BrOrtU%B%Txqp5|&&#dbi2*G-% z;LHp0QqxoF65Bi$Kc^9gi&F< zC3(#b!P{tF<~h;T9y05s`!ll+7nvzx4`+^kGi_$@ozM0EolkJcM-de26U-#G$uN z46Y6UsJIBx$Zf_!Hwo}Mwb}{T<8@(_#rGsjU^V;eQ6M4o&R=>MlLG4y(u&!GXNz(e z{#?X?Vj~>Ms3cG2pk)UFzB9-y6_wjTf!BcaT0uN4P2GF{!Rwop;46QIvJV-VCZQ<- zv_9ec)Ax}`0hUwkOTxjoU%?35c87ZtKLvn~>NBG-SMY#(bft_oMwOw(2jtSO)D&QC zitP(38k(1iYIcHtY<+iPy)XE%paMi6FQaAaVDzq7)9GAz0XLfl1w8eGpB>f(T%Xq} zu+_cK*i~NF%cZOeT6VgoyQlj=G!9*jDpHj_5fOc`#@ZrhiP>W>+})F*!bk3Zn;LpN zj;2iw&0J7t;RvH_iW6jEls_#QMce^{rx}oNgOf*1qUmmDsqt!h!`hUgdU=#O=lqqVEEimi|Pv5?fOKuBj5y9^b$jEGpb}*bT?jZ!} zu{tPa~BcR7LVgLI`lgC{q&JPG`nCrsPp&O^^A zfz{pZz`9-mU!v#@aqM~RKRyj;WIVqfZP}&kctlG7Equ>)K_L&1ggW@8)i6LYIuF6X zO!REN*ol3VnA|+nBj9at2G%+tbLEV(Fx0-_Kfn5;2(BdFgIi>@-zac>%}eIf-tZU( z0tuO2yn=u+-1T!8-SEY~KZfw+z{wL(y!Q!wUJl4P2oqXgXReVWFm_E=qqtM`jg3|I zICZ+@R7AI^_ z6b*Tqc)5^+R2k?xM#M5B5(d!Ht8-gaRL>hg*+pi6-_$=u#xWP62)QrcSsB|e=zoR> zA68|d*~W38yiM?gAkbc(FB!Rd;cx$5X$O-6dw0^;H9G!1J6qv>HG9lDi!L|wm{)rjMd-i)_6$~TK~Jb3m_poRPiYmbw()FL zS~7!~n!ali-}##@2Lj6x4T9glw!ISHNEht#mmGj@uWSc=ot64S14;SFNo|SCj(Gq? zeX*j?xAKr$a1KnwFi;LXhQ{?sJp=PfUM(*|x3gnh<-Cn!PhJ@)7q4pg6*e^ zkjGTvp#1KFznc~&pq_exK4wld?k;Q!i?195ZER#@#G=@cXnerYqJkfyj z>;-3_#XCG(61G~NbE+ig3AC9eP7lS!52t<;(>>mWI^n%w{zJpN!U+5&cnC3mI*wG? z0(7#V96&8}ECshYK!)_sZ|=Q9HlKq(ay8bF(hG9LMWmDQDfyNQoNy^NLYwV3UIckq zLlRy^AR|o9mx0SBgB_?HWV9)v6*#Vm2bf&uhEF6M=moKGcZuCz z#Y3)8OaETIP`SZ`VHL1pM#g8z2+=pa2e(_5W-Dax`vGR=gA(~WfI*8yd)7cJLD9wl zSkHts(DINkkj3Ry_e5t3-cNQJMO0B@zY$g!)SbgrdjDB$(3)gb^*;rxd;8U= zOGXJ}nCJT7&r{)-lF@6o&`LK%-DtdrjP&m`7o`sk!-AT)9q@7s3)q_0)Pk~ROC7&F z!Qo#Fc7_EmY&++_gPGsm8jJRX>i8ZwVP~|!0QzI|pfXe^`c{rZRs)vcVLJk@;RIxj z21)8Xs#}*@lKYUSa;iNu!aisPB?sveX+OcGbraaWcku_$j{K1Y{yzKhBkz*{MGqEi zSLi=alCJK1$?v?3F#-xeUCxL~iW%obJKR_t-tZZEGJ2z1sn@Jk9w_xnP$g&Zuq=;& zye5dEbwLb28rf)Lv3ix90Dy5T zto^E&fl~2C{jUxTax5n61Gm6|@uAQRNC{Vu*cEp?+0p`HeMLX4%&W|sgC&L$(Air6 z-M&;|a|26FDI_xbi)?QBJ%Ste5hRf@r`QeP{rh_pMMndzA`a<*t!L@7}%U~AFhb;Y!B=tfzQ6DPd{!0dp5WE?rqF1qi$Dc}Z(9-0Xw({?QTRfSY zoewqB>9}6~nR+E0F*{^=6aSOHR|wb+9TI!!oN}4-6)4WdQ{u==K zeS|0ebu49QlR^CAeE_Ug8QCSkv0eT0e%Ci{K^d^1T3*WTEIfyfX#BNDJeaPYzm}uH zt%5EZCsfnF6=q#tCcWf#el1+GrYAgjU9cFz0c5XIFbwr7WyhE1QlmCuyZ%GN&}D%i zT;!jEFlIre9T-~B=6!H8q>!BkDd4T0N)_&7;%ECOZmDgu*#`W9NdWoND z-w$NXR~26IqMutyt;cu50=X>J2zhiK(Np97_Xk@}va!=^r+PiinA0%Wc*UinCZiv1$wQ3m7Bqa!}4j}}4vZ9@&# z4!e(Z3DMtsZKC?1XWIcYjZ42c4%Kc@8e3-k=NFkQ3vczxJz-*Dk<6>;9eq(aIOjjr zUi52yqj5lxAQ1?;hB*Gi@mhvCq8YZ8Owx+{R_7Zvz(*kZABvnj{7FH0!wx^?KNQ}# z$gdDh|IbsW4#4f-_TT(|slb2#yYT-vmskCD0slwKlHM2o+N)?)^DIra<@c&x4K-cW Jf|KX3|1WJ|FCG8@ literal 0 HcmV?d00001 diff --git a/bitmart/回测图表_交互式.html b/bitmart/回测图表_交互式.html new file mode 100644 index 0000000..c13a2f4 --- /dev/null +++ b/bitmart/回测图表_交互式.html @@ -0,0 +1,3888 @@ + + + +
+
+ + \ No newline at end of file diff --git a/bitmart/抓取多周期K线.py b/bitmart/抓取多周期K线.py new file mode 100644 index 0000000..ff19b00 --- /dev/null +++ b/bitmart/抓取多周期K线.py @@ -0,0 +1,279 @@ +""" +BitMart 多周期K线数据抓取脚本 +支持同时获取 1分钟、3分钟、5分钟、15分钟、30分钟、1小时 K线数据 +自动创建对应的数据库表 +""" + +import time +import datetime +from pathlib import Path +from loguru import logger +from peewee import * +from bitmart.api_contract import APIContract + +# 数据库配置 +DB_PATH = Path(__file__).parent.parent / 'models' / 'database.db' +db = SqliteDatabase(str(DB_PATH)) + +# K线周期配置:step值 -> 表名后缀 +KLINE_CONFIGS = { + 1: '1m', # 1分钟 + 3: '3m', # 3分钟 + 5: '5m', # 5分钟 + 15: '15m', # 15分钟 + 30: '30m', # 30分钟 + 60: '1h', # 1小时 +} + + +def create_kline_model(step: int): + """ + 动态创建K线数据模型 + :param step: K线周期(分钟) + :return: Model类 + """ + suffix = KLINE_CONFIGS.get(step, f'{step}m') + tbl_name = f'bitmart_eth_{suffix}' + + # 使用 type() 动态创建类,避免闭包问题 + attrs = { + 'id': BigIntegerField(primary_key=True), + 'open': FloatField(null=True), + 'high': FloatField(null=True), + 'low': FloatField(null=True), + 'close': FloatField(null=True), + } + + # 创建 Meta 类 + meta_attrs = { + 'database': db, + 'table_name': tbl_name, + } + Meta = type('Meta', (), meta_attrs) + attrs['Meta'] = Meta + + # 动态创建 Model 类 + model_name = f'BitMartETH{suffix.upper()}' + KlineModel = type(model_name, (Model,), attrs) + + return KlineModel + + +class BitMartMultiKlineCollector: + """多周期K线数据抓取器""" + + def __init__(self): + self.api_key = "a0fb7b98464fd9bcce67e7c519d58ec10d0c38a8" + self.secret_key = "4eaeba78e77aeaab1c2027f846a276d164f264a44c2c1bb1c5f3be50c8de1ca5" + self.memo = "数据抓取" + self.contract_symbol = "ETHUSDT" + self.contractAPI = APIContract(self.api_key, self.secret_key, self.memo, timeout=(5, 15)) + + # 存储各周期的模型 + self.models = {} + + # 初始化数据库连接和表 + self._init_database() + + def _init_database(self): + """初始化数据库,创建所有周期的表""" + db.connect(reuse_if_open=True) + + for step in KLINE_CONFIGS.keys(): + model = create_kline_model(step) + self.models[step] = model + # 创建表(如果不存在) + db.create_tables([model], safe=True) + logger.info(f"初始化表: {model._meta.table_name}") + + def get_klines(self, step: int, start_time: int, end_time: int): + """ + 获取K线数据 + :param step: K线周期(分钟) + :param start_time: 开始时间戳(秒级) + :param end_time: 结束时间戳(秒级) + :return: K线数据列表 + """ + try: + # 确保是整数 + start_time = int(start_time) + end_time = int(end_time) + + logger.debug(f"API请求: step={step}, start={start_time}, end={end_time}") + + response = self.contractAPI.get_kline( + contract_symbol=self.contract_symbol, + step=step, + start_time=start_time, + end_time=end_time + )[0] + + if response['code'] != 1000: + logger.error(f"获取 {step}分钟 K线失败: {response}") + return [] + + klines = response.get('data', []) + formatted = [] + for k in klines: + timestamp_ms = int(k["timestamp"]) * 1000 + formatted.append({ + 'id': timestamp_ms, + 'open': float(k["open_price"]), + 'high': float(k["high_price"]), + 'low': float(k["low_price"]), + 'close': float(k["close_price"]) + }) + + formatted.sort(key=lambda x: x['id']) + return formatted + except Exception as e: + logger.error(f"获取 {step}分钟 K线异常: {e}") + return [] + + def save_klines(self, step: int, klines: list): + """ + 保存K线数据到数据库 + :param step: K线周期 + :param klines: K线数据列表 + :return: 保存的数量 + """ + model = self.models.get(step) + if not model: + logger.error(f"未找到 {step}分钟 的数据模型") + return 0 + + saved_count = 0 + for kline in klines: + try: + model.get_or_create( + id=kline['id'], + defaults={ + 'open': kline['open'], + 'high': kline['high'], + 'low': kline['low'], + 'close': kline['close'], + } + ) + saved_count += 1 + except Exception as e: + logger.error(f"保存 {step}分钟 K线数据失败 {kline['id']}: {e}") + + return saved_count + + def collect_single_period(self, step: int, start_date: str = None, days: int = None): + """ + 抓取单个周期的历史数据(从当前时间向前抓取,直到遇到API限制) + :param step: K线周期(分钟) + :param start_date: 起始日期 'YYYY-MM-DD'(目标,可能无法达到) + :param days: 抓取天数(目标,可能无法达到) + """ + suffix = KLINE_CONFIGS.get(step, f'{step}m') + now = int(time.time()) + + if start_date: + start_dt = datetime.datetime.strptime(start_date, '%Y-%m-%d') + target_start_time = int(start_dt.timestamp()) + logger.info(f"开始抓取 {suffix} K线数据: 目标从 {start_date} 开始(从现在向前抓取)") + elif days: + target_start_time = now - 3600 * 24 * days + logger.info(f"开始抓取 {suffix} K线数据: 目标最近 {days} 天") + else: + target_start_time = now - 3600 * 24 * 30 + logger.info(f"开始抓取 {suffix} K线数据: 目标最近 30 天") + + # 根据周期调整批次大小 + if step <= 5: + batch_seconds = 3600 * 6 # 小周期每次6小时 + elif step <= 30: + batch_seconds = 3600 * 24 # 中周期每次1天 + else: + batch_seconds = 3600 * 24 * 3 # 大周期每次3天 + + total_saved = 0 + fail_count = 0 + max_fail = 3 + + # 从当前时间向前抓取 + current_end = now + while current_end > target_start_time: + current_start = current_end - batch_seconds + + # 打印时间范围 + start_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(current_start)) + end_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(current_end)) + logger.info(f"[{suffix}] 抓取: {start_str} -> {end_str}") + + klines = self.get_klines(step, current_start, current_end) + if klines: + saved = self.save_klines(step, klines) + total_saved += saved + logger.info(f"[{suffix}] 保存 {saved} 条,累计 {total_saved} 条") + fail_count = 0 + else: + fail_count += 1 + logger.warning(f"[{suffix}] 未获取到数据 (连续失败 {fail_count} 次)") + if fail_count >= max_fail: + earliest = time.strftime('%Y-%m-%d', time.localtime(current_end)) + logger.warning(f"[{suffix}] 达到API历史数据限制,最早可用数据约 {earliest}") + break + + current_end = current_start + time.sleep(0.3) # API请求间隔 + + logger.success(f"[{suffix}] 抓取完成,共保存 {total_saved} 条数据") + return total_saved + + def collect_all_periods(self, start_date: str = None, days: int = None, + periods: list = None): + """ + 抓取所有周期的历史数据 + :param start_date: 起始日期 'YYYY-MM-DD' + :param days: 抓取天数 + :param periods: 要抓取的周期列表,如 [1, 5, 15],默认全部 + """ + if periods is None: + periods = list(KLINE_CONFIGS.keys()) + + logger.info(f"开始抓取多周期K线数据,周期: {[KLINE_CONFIGS[p] for p in periods]}") + + results = {} + for step in periods: + if step not in KLINE_CONFIGS: + logger.warning(f"不支持的周期: {step}分钟,跳过") + continue + + logger.info(f"\n{'='*50}") + logger.info(f"开始抓取 {KLINE_CONFIGS[step]} K线") + logger.info(f"{'='*50}") + + saved = self.collect_single_period(step, start_date, days) + results[KLINE_CONFIGS[step]] = saved + + time.sleep(1) # 不同周期之间间隔 + + logger.info(f"\n{'='*50}") + logger.info("所有周期抓取完成!统计:") + for period, count in results.items(): + logger.info(f" {period}: {count} 条") + logger.info(f"{'='*50}") + + return results + + def close(self): + """关闭数据库连接""" + if not db.is_closed(): + db.close() + + +if __name__ == '__main__': + collector = BitMartMultiKlineCollector() + + try: + # 抓取尽可能多的历史数据(从现在向前,直到遇到API限制自动停止) + # 目标:2025-01-01,但实际能抓取多少取决于 BitMart API 的历史数据限制 + collector.collect_all_periods( + start_date='2025-01-01', # 目标起始日期 + periods=[1, 3, 5, 15, 30, 60] # 所有周期 + ) + finally: + collector.close() diff --git a/models/bitmart_klines.py b/models/bitmart_klines.py new file mode 100644 index 0000000..d80f162 --- /dev/null +++ b/models/bitmart_klines.py @@ -0,0 +1,97 @@ +""" +BitMart 多周期K线数据模型 +包含 1分钟、3分钟、5分钟、15分钟、30分钟、1小时 K线数据表 +""" + +from peewee import * +from models import db + + +# ==================== 1分钟 K线 ==================== +class BitMartETH1M(Model): + id = BigIntegerField(primary_key=True) # 时间戳(毫秒级) + open = FloatField(null=True) + high = FloatField(null=True) + low = FloatField(null=True) + close = FloatField(null=True) + + class Meta: + database = db + table_name = 'bitmart_eth_1m' + + +# ==================== 3分钟 K线 ==================== +class BitMartETH3M(Model): + id = BigIntegerField(primary_key=True) + open = FloatField(null=True) + high = FloatField(null=True) + low = FloatField(null=True) + close = FloatField(null=True) + + class Meta: + database = db + table_name = 'bitmart_eth_3m' + + +# ==================== 5分钟 K线 ==================== +class BitMartETH5M(Model): + id = BigIntegerField(primary_key=True) + open = FloatField(null=True) + high = FloatField(null=True) + low = FloatField(null=True) + close = FloatField(null=True) + + class Meta: + database = db + table_name = 'bitmart_eth_5m' + + +# ==================== 15分钟 K线 ==================== +class BitMartETH15M(Model): + id = BigIntegerField(primary_key=True) + open = FloatField(null=True) + high = FloatField(null=True) + low = FloatField(null=True) + close = FloatField(null=True) + + class Meta: + database = db + table_name = 'bitmart_eth_15m' + + +# ==================== 30分钟 K线 ==================== +class BitMartETH30M(Model): + id = BigIntegerField(primary_key=True) + open = FloatField(null=True) + high = FloatField(null=True) + low = FloatField(null=True) + close = FloatField(null=True) + + class Meta: + database = db + table_name = 'bitmart_eth_30m' + + +# ==================== 1小时 K线 ==================== +class BitMartETH1H(Model): + id = BigIntegerField(primary_key=True) + open = FloatField(null=True) + high = FloatField(null=True) + low = FloatField(null=True) + close = FloatField(null=True) + + class Meta: + database = db + table_name = 'bitmart_eth_1h' + + +# 连接数据库并创建表 +db.connect(reuse_if_open=True) +db.create_tables([ + BitMartETH1M, + BitMartETH3M, + BitMartETH5M, + BitMartETH15M, + BitMartETH30M, + BitMartETH1H, +], safe=True) diff --git a/交易/bitmart-三分之一策略交易.py b/交易/bitmart-三分之一策略交易.py new file mode 100644 index 0000000..0bb5ec0 --- /dev/null +++ b/交易/bitmart-三分之一策略交易.py @@ -0,0 +1,557 @@ +""" +BitMart 三分之一回归策略交易 +使用5分钟K线周期 + +策略规则: +1. 开多条件: + - 找到实体>=0.1的前一根K线(如果前一根实体<0.1,继续往前找) + - 前一根是阴线(close < open) + - 当前K线的最高价(包括影线)涨到前一根阴线实体的 1/3 处 + - 即:当前high >= prev_close + (prev_open - prev_close) / 3 + +2. 平多/开空条件: + - 找到实体>=0.1的前一根K线 + - 前一根是阳线(close > open) + - 当前K线的最低价(包括影线)跌到前一根阳线实体的 1/3 处 + - 即:当前low <= prev_close - (prev_close - prev_open) / 3 + +3. 执行逻辑: + - 做多时遇到开空信号 -> 平多并反手开空 + - 做空时遇到开多信号 -> 平空并反手开多 +""" + +import time +import datetime + +from tqdm import tqdm +from loguru import logger +from bit_tools import openBrowser +from DrissionPage import ChromiumPage +from DrissionPage import ChromiumOptions + +from bitmart.api_contract import APIContract +from 交易.tools import send_dingtalk_message + + +class BitmartOneThirdStrategy: + def __init__(self, bit_id): + + self.page: ChromiumPage | None = None + + self.api_key = "a0fb7b98464fd9bcce67e7c519d58ec10d0c38a8" + self.secret_key = "4eaeba78e77aeaab1c2027f846a276d164f264a44c2c1bb1c5f3be50c8de1ca5" + self.memo = "合约交易" + + self.contract_symbol = "ETHUSDT" + + self.contractAPI = APIContract(self.api_key, self.secret_key, self.memo, timeout=(5, 15)) + + self.start = 0 # 持仓状态: -1 空, 0 无, 1 多 + self.direction = None + + self.pbar = tqdm(total=5, desc="等待K线", ncols=80) # 5分钟周期 + + self.last_kline_time = None + + self.leverage = "100" # 高杠杆(全仓模式下可开更大仓位) + self.open_type = "cross" # 全仓模式 + self.risk_percent = 0.01 # 每次开仓使用可用余额的 1% + + self.open_avg_price = None # 开仓价格 + self.current_amount = None # 持仓量 + + self.bit_id = bit_id + + # 三分之一策略参数 + self.min_body_size = 0.1 # 最小实体大小 + self.kline_step = 5 # K线周期(5分钟) + self.kline_count = 20 # 获取的K线数量,用于向前查找有效K线 + + # ========================= 三分之一策略核心函数 ========================= + + def is_bullish(self, c): + """判断阳线""" + return float(c['close']) > float(c['open']) + + def is_bearish(self, c): + """判断阴线""" + return float(c['close']) < float(c['open']) + + def get_body_size(self, candle): + """计算K线实体大小(绝对值)""" + return abs(float(candle['open']) - float(candle['close'])) + + def find_valid_prev_bar(self, all_data, current_idx, min_body_size=0.1): + """ + 从当前索引往前查找,直到找到实体>=min_body_size的K线 + 返回:(有效K线的索引, K线数据) 或 (None, None) + """ + if current_idx <= 0: + return None, None + + for i in range(current_idx - 1, -1, -1): + prev = all_data[i] + body_size = self.get_body_size(prev) + if body_size >= min_body_size: + return i, prev + + return None, None + + def get_one_third_level(self, prev): + """ + 计算前一根K线实体的 1/3 回归位置 + 返回:(触发价格, 方向) + - 如果前一根是阴线:返回向上1/3价格,方向为 'long' + - 如果前一根是阳线:返回向下1/3价格,方向为 'short' + """ + p_open = float(prev['open']) + p_close = float(prev['close']) + + if self.is_bearish(prev): # 阴线,向上回归 + # 阴线实体 = open - close + body = p_open - p_close + trigger_price = p_close + body / 3 # 从低点涨 1/3 + return trigger_price, 'long' + + elif self.is_bullish(prev): # 阳线,向下回归 + # 阳线实体 = close - open + body = p_close - p_open + trigger_price = p_close - body / 3 # 从高点跌 1/3 + return trigger_price, 'short' + + return None, None + + def check_trigger(self, all_data, current_idx): + """ + 检查当前K线是否触发了交易信号 + 返回:(方向, 触发价格, 有效前一根K线索引) 或 (None, None, None) + 规则:考虑影线部分(high/low),因为实际交易中价格会到达影线位置 + """ + if current_idx <= 0: + return None, None, None + + curr = all_data[current_idx] + + # 查找实体>=min_body_size的前一根K线 + valid_prev_idx, prev = self.find_valid_prev_bar(all_data, current_idx, self.min_body_size) + + if prev is None: + return None, None, None + + trigger_price, direction = self.get_one_third_level(prev) + + if trigger_price is None: + return None, None, None + + # 使用影线部分(high/low)来判断 + c_high = float(curr['high']) + c_low = float(curr['low']) + + # 做多:前一根阴线,当前K线的最高价(包括影线)达到触发价格 + if direction == 'long' and c_high >= trigger_price: + return 'long', trigger_price, valid_prev_idx + + # 做空:前一根阳线,当前K线的最低价(包括影线)达到触发价格 + if direction == 'short' and c_low <= trigger_price: + return 'short', trigger_price, valid_prev_idx + + return None, None, None + + # ========================= BitMart API 函数 ========================= + + def get_klines(self): + """获取最近N根5分钟K线""" + try: + end_time = int(time.time()) + # 获取足够多的K线用于向前查找有效K线 + response = self.contractAPI.get_kline( + contract_symbol=self.contract_symbol, + step=self.kline_step, # 5分钟 + start_time=end_time - 3600 * 3, # 取最近3小时 + end_time=end_time + )[0]["data"] + + # 每根: [timestamp, open, high, low, close, volume] + formatted = [] + for k in response: + formatted.append({ + 'id': int(k["timestamp"]), + 'open': float(k["open_price"]), + 'high': float(k["high_price"]), + 'low': float(k["low_price"]), + 'close': float(k["close_price"]) + }) + formatted.sort(key=lambda x: x['id']) + return formatted + except Exception as e: + error_msg = str(e) + # 检查是否是429限流错误 + if "429" in error_msg or "too many requests" in error_msg.lower(): + logger.warning(f"API限流,等待60秒后重试: {e}") + time.sleep(60) + else: + logger.error(f"获取K线异常: {e}") + self.ding(msg="获取K线异常", error=True) + return None + + def get_current_price(self): + """获取当前最新价格""" + try: + end_time = int(time.time()) + response = self.contractAPI.get_kline( + contract_symbol=self.contract_symbol, + step=1, # 1分钟 + start_time=end_time - 3600 * 3, + end_time=end_time + )[0] + if response['code'] == 1000: + return float(response['data'][-1]["close_price"]) + return None + except Exception as e: + logger.error(f"获取价格异常: {e}") + return None + + def get_available_balance(self): + """获取合约账户可用USDT余额""" + try: + response = self.contractAPI.get_assets_detail()[0] + if response['code'] == 1000: + data = response['data'] + if isinstance(data, dict): + return float(data.get('available_balance', 0)) + elif isinstance(data, list): + for asset in data: + if asset.get('currency') == 'USDT': + return float(asset.get('available_balance', 0)) + return None + except Exception as e: + logger.error(f"余额查询异常: {e}") + return None + + def get_position_status(self): + """获取当前持仓方向""" + try: + response = self.contractAPI.get_position(contract_symbol=self.contract_symbol)[0] + if response['code'] == 1000: + positions = response['data'] + if not positions: + self.start = 0 + self.open_avg_price = None + self.current_amount = None + self.position_cross = None + return True + self.start = 1 if positions[0]['position_type'] == 1 else -1 + self.open_avg_price = positions[0]['open_avg_price'] + self.current_amount = positions[0]['current_amount'] + self.position_cross = positions[0]["position_cross"] + return True + else: + return False + except Exception as e: + logger.error(f"持仓查询异常: {e}") + return False + + def set_leverage(self): + """程序启动时设置全仓 + 高杠杆""" + try: + response = self.contractAPI.post_submit_leverage( + contract_symbol=self.contract_symbol, + leverage=self.leverage, + open_type=self.open_type + )[0] + if response['code'] == 1000: + logger.success(f"全仓模式 + {self.leverage}x 杠杆设置成功") + return True + else: + logger.error(f"杠杆设置失败: {response}") + return False + except Exception as e: + logger.error(f"设置杠杆异常: {e}") + return False + + # ========================= 浏览器自动化函数 ========================= + + def openBrowser(self): + """打开 TGE 对应浏览器实例""" + try: + bit_port = openBrowser(id=self.bit_id) + co = ChromiumOptions() + co.set_local_port(port=bit_port) + self.page = ChromiumPage(addr_or_opts=co) + return True + except: + return False + + def close_extra_tabs_in_browser(self): + """关闭多余 tab""" + try: + for idx, tab in enumerate(self.page.get_tabs()): + if idx > 0: + tab.close() + return True + except: + return False + + def click_safe(self, xpath, sleep=0.5): + """安全点击""" + try: + ele = self.page.ele(xpath) + if not ele: + return False + ele.scroll.to_see(center=True) + time.sleep(sleep) + ele.click(by_js=True) + return True + except: + return False + + def 平仓(self): + """市价平仓""" + logger.info("执行平仓操作...") + self.click_safe('x://span[normalize-space(text()) ="市价"]') + time.sleep(0.5) + self.ding(msg="执行平仓操作") + + def 开单(self, marketPriceLongOrder=0, size=None): + """ + 市价开单 + marketPriceLongOrder: 1 做多, -1 做空 + """ + if size is None or size <= 0: + logger.warning("开单金额无效") + return False + + direction_str = "做多" if marketPriceLongOrder == 1 else "做空" + logger.info(f"执行{direction_str}操作,金额: {size}") + + try: + if marketPriceLongOrder == -1: + self.click_safe('x://button[normalize-space(text()) ="市价"]') + self.page.ele('x://*[@id="size_0"]').input(size) + self.click_safe('x://span[normalize-space(text()) ="卖出/做空"]') + elif marketPriceLongOrder == 1: + self.click_safe('x://button[normalize-space(text()) ="市价"]') + self.page.ele('x://*[@id="size_0"]').input(size) + self.click_safe('x://span[normalize-space(text()) ="买入/做多"]') + + self.ding(msg=f"执行{direction_str}操作,金额: {size}") + return True + except Exception as e: + logger.error(f"开单异常: {e}") + return False + + def ding(self, msg, error=False): + """统一消息格式""" + prefix = "❌三分之一策略:" if error else "🔔三分之一策略:" + if error: + logger.error(msg) + for i in range(10): + send_dingtalk_message(f"{prefix}{msg}") + else: + logger.info(msg) + send_dingtalk_message(f"{prefix}{msg}") + + # ========================= 时间计算函数 ========================= + + def get_now_time(self): + """获取当前5分钟整点时间戳""" + current_timestamp = time.time() + current_datetime = datetime.datetime.fromtimestamp(current_timestamp) + + # 计算距离当前时间最近的5分钟整点 + minute = current_datetime.minute + target_minute = (minute // 5) * 5 # 向下取整到5分钟 + target_datetime = current_datetime.replace(minute=target_minute, second=0, microsecond=0) + + return int(target_datetime.timestamp()) + + def get_time_to_next_5min(self): + """获取距离下一个5分钟的秒数""" + current_timestamp = time.time() + current_datetime = datetime.datetime.fromtimestamp(current_timestamp) + + minute = current_datetime.minute + next_5min = ((minute // 5) + 1) * 5 + if next_5min >= 60: + next_datetime = current_datetime.replace(minute=0, second=0, microsecond=0) + datetime.timedelta(hours=1) + else: + next_datetime = current_datetime.replace(minute=next_5min, second=0, microsecond=0) + + return (next_datetime - current_datetime).total_seconds() + + # ========================= 主运行函数 ========================= + + def action(self): + """主运行逻辑""" + # 启动时设置全仓高杠杆 + if not self.set_leverage(): + logger.error("杠杆设置失败,程序继续运行但可能下单失败") + return + + # 1. 打开浏览器 + if not self.openBrowser(): + self.ding("打开浏览器失败!", error=True) + return + logger.info("浏览器打开成功") + + if self.close_extra_tabs_in_browser(): + logger.info('关闭多余标签页成功') + else: + logger.info('关闭多余标签页失败') + + self.page.get("https://derivatives.bitmart.com/zh-CN/futures/ETHUSDT") + time.sleep(2) + + self.click_safe('x://button[normalize-space(text()) ="市价"]') + + self.pbar = tqdm(total=5, desc="等待5分钟K线", ncols=80) + + self.time_start = None # 时间状态,避免同一时段重复处理 + + while True: + # 更新进度条 + current_time = time.localtime() + current_minute = current_time.tm_min + self.pbar.n = current_minute % 5 + self.pbar.refresh() + + # 检查是否已处理过当前时间段 + if self.time_start == self.get_now_time(): + time.sleep(3) + continue + + # 获取K线数据 + kline_data = self.get_klines() + if not kline_data: + logger.warning("获取K线数据失败") + time.sleep(5) + continue + + # 检查数据是否是最新的 + if len(kline_data) < 3: + logger.warning("K线数据不足") + time.sleep(5) + continue + + # 判断最新K线时间 + latest_kline_time = kline_data[-1]['id'] + if self.get_now_time() != latest_kline_time: + time.sleep(3) + continue + + self.time_start = self.get_now_time() + + # 获取持仓状态 + if not self.get_position_status(): + logger.warning("获取仓位信息失败") + self.ding(msg="获取仓位信息失败!", error=True) + continue + + logger.info(f"当前持仓状态: {self.start} (1=多, -1=空, 0=无)") + + # ========== 三分之一策略信号检测 ========== + current_idx = len(kline_data) - 1 + direction, trigger_price, valid_prev_idx = self.check_trigger(kline_data, current_idx) + + if direction: + # 获取有效前一根K线用于日志 + valid_prev = kline_data[valid_prev_idx] if valid_prev_idx is not None else None + curr = kline_data[current_idx] + + if valid_prev: + prev_time = datetime.datetime.fromtimestamp(valid_prev['id']).strftime('%H:%M') + curr_time = datetime.datetime.fromtimestamp(curr['id']).strftime('%H:%M') + prev_type = "阳线" if self.is_bullish(valid_prev) else "阴线" + prev_body = self.get_body_size(valid_prev) + + logger.info(f"检测到{direction}信号,触发价格: {trigger_price:.2f}") + logger.info(f" 有效前一根[{prev_time}]: {prev_type} 实体={prev_body:.2f}") + logger.info(f" 当前根[{curr_time}]: H={curr['high']:.2f} L={curr['low']:.2f}") + + # ========== 执行交易逻辑 ========== + balance = self.get_available_balance() + if balance is None: + balance = 0 + trade_size = balance * self.risk_percent + + if direction == "long": + if self.start == -1: # 当前空仓,平空开多 + logger.info("平空仓,反手开多") + self.平仓() + time.sleep(1) + self.开单(marketPriceLongOrder=1, size=trade_size) + elif self.start == 0: # 当前无仓,直接开多 + logger.info("无仓位,开多") + self.开单(marketPriceLongOrder=1, size=trade_size) + # 已有多仓则不操作 + + elif direction == "short": + if self.start == 1: # 当前多仓,平多开空 + logger.info("平多仓,反手开空") + self.平仓() + time.sleep(1) + self.开单(marketPriceLongOrder=-1, size=trade_size) + elif self.start == 0: # 当前无仓,直接开空 + logger.info("无仓位,开空") + self.开单(marketPriceLongOrder=-1, size=trade_size) + # 已有空仓则不操作 + + # ========== 发送持仓信息 ========== + self._send_position_message(kline_data[-1]) + + self.pbar.reset() + + def _send_position_message(self, latest_kline): + """发送持仓信息到钉钉""" + current_price = float(latest_kline["close"]) + balance = self.get_available_balance() + self.balance = balance if balance is not None else 0.0 + + if self.start != 0: + open_avg_price = float(self.open_avg_price) if self.open_avg_price else 0.0 + current_amount = float(self.current_amount) if self.current_amount else 0.0 + position_cross = float(self.position_cross) if hasattr(self, 'position_cross') and self.position_cross else 0.0 + + # 计算浮动盈亏 + if self.start == 1: # 多头 + unrealized_pnl = current_amount * 0.001 * (current_price - open_avg_price) + else: # 空头 + unrealized_pnl = current_amount * 0.001 * (open_avg_price - current_price) + + # 计算收益率 + if open_avg_price > 0: + if self.start == 1: + pnl_rate = (current_price - open_avg_price) / open_avg_price * 10000 + else: + pnl_rate = (open_avg_price - current_price) / open_avg_price * 10000 + rate_str = f" ({pnl_rate:+.2f}%)" + else: + rate_str = "" + + direction_str = "空" if self.start == -1 else "多" + pnl_str = f"{unrealized_pnl:+.2f} USDT" + + msg = ( + f"【三分之一策略 {self.contract_symbol} 5分钟】\n" + f"当前方向:{direction_str}\n" + f"当前现价:{current_price:.2f} USDT\n" + f"开仓均价:{open_avg_price:.2f} USDT\n" + f"持仓量(eth):{float(current_amount) / 1000} eth\n" + f"持仓量(usdt):{position_cross} usdt\n" + f"浮动盈亏:{pnl_str}{rate_str}\n" + f"账户可用余额:{self.balance:.2f} usdt" + ) + else: + msg = ( + f"【三分之一策略 {self.contract_symbol} 5分钟】\n" + f"当前方向:无\n" + f"当前现价:{current_price:.2f} USDT\n" + f"账户可用余额:{self.balance:.2f} usdt" + ) + + self.ding(msg=msg) + + +if __name__ == '__main__': + # 启动三分之一策略交易 + BitmartOneThirdStrategy(bit_id="f2320f57e24c45529a009e1541e25961").action()