admin
2024-02-29 b92dbb786833487fa343f3edea1b1b9885e86dc1
网页修改/自动加同花顺修改
9个文件已修改
1005 ■■■■ 已修改文件
constant.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
kp_html/kp/codes_list.html 664 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
kp_html/kp/css/banshuping.css 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
kp_html/kp/js/code_list.js 246 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
kp_html/kp/js/http.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
kp_html/kp/test.html 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main.py 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main.spec 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/ths_util.py 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
constant.py
@@ -1,4 +1,4 @@
SERVER_HOST = "43.138.167.68"
# SERVER_HOST = "192.168.3.122"
WEB_HOST = "192.168.3.252"
IS_TEST = False
IS_TEST = True
kp_html/kp/codes_list.html
@@ -21,336 +21,384 @@
        <div id="app">
            <div style="position: fixed;top: 0;width: 100%;">
                <div class="top">
                    <span>
                        <h2 style="margin-left: 18px; font-size: 20px;">
                        {{code_name}}
                        </h2>
                    </span>
                    <button class="btn" style="font-size: 15px;margin: 5px;" v-on:click="load_data">加载数据</button>
                </div>
                <div class="nav" style="background-color: white;">
                    <div :class="{'active': data_type==0 }" v-on:click="change_data_type(0)">交易数据</div>
                    <div :class="{'active': data_type==1 }" v-on:click="change_data_type(1)">L2数据</div>
                        <span>
                            <h2 style="margin-left: 18px; font-size: 20px;">
                            {{code_name}}
                            </h2>
                        </span>
                        <button class="btn" style="font-size: 15px;margin: 5px;" v-on:click="load_data">加载数据</button>
                </div>
            </div>
            <div style="margin-top: 70px;" class="scroll-y">
                <div id="trade_data"  :style="{'visibility':data_type==0?'visible':'hidden'}">
                    <div v-if="same_reason_codes">
                        <table class="half-width">
                            <caption class="table-name">昨日相同板块代码({{same_reason_codes.reason}})</caption>
                            <tbody>
                                <tr>
                                    <td style="padding: 0;border: none">
                                        <div class="code-table-container">
                                            <div v-for="(item,i) in same_reason_codes.data"
                                                :style="{'border-left-style': i%3==0?'solid':'none','border-top-style': i<3?'solid':'none'}">
                                                <span class="num-style">{{item[1]}}</span>
                                                <span class="num-style">{{item[0]}}</span>
                                            </div>
                                        </div>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                    </div>
                    <!-- 交易参数 -->
                    <table style="position: relative;" >
                        <caption class="table-name">
                            <span>
                            买入预期
                            </span>
                            <button style="position: absolute;right: 5px;top: 16px;font-size: 14px;" class="btn" v-on:click="get_delegated_buy_code_infos">刷新</button>
                        </caption>
                        <thead>
                            <tr v-if="delegated_buy_code_infos.length>0">
                                <td>
                                    <div class="delegated_codes_info">
                                        <div v-for="(item,index) in delegated_buy_code_infos">
                                            <div>
                                                <div>{{item.code_info[0]}}</div>
                                                <div>{{item.code_info[1]}}</div>
            <!-- 交易参数 -->
            <!-- 交易参数 -->
            <table style="position: relative;margin-top: 40px;" >
                <caption class="table-name">
                    <span>
                    买入预期(可用:¥{{account_available_money}})
                    </span>
                    <button style="position: absolute;right: 5px;top: 16px;font-size: 14px;" class="btn" v-on:click="get_delegated_buy_code_infos">刷新</button>
                </caption>
                <thead>
                    <tr v-if="delegated_buy_code_infos.length>0">
                        <td>
                            <div class="delegated_codes_info">
                                <div v-for="(item,index) in delegated_buy_code_infos" class="delegate_item">
                                    <div>
                                        <div>{{item.code_info[0]}}</div>
                                        <div>{{item.code_info[1]}}</div>
                                    </div>
                                    <div>
                                        <div style="display: flex;justify-content: space-between;align-items: center;">
                                            <div style="color: red;" :style="{'visibility': item.pay_attention?'visible':'hidden' }">***</div>
                                            <div class="layui-progress" style="background-color: #BBB; width: 75%; visibility: hidden;" :id="'progress_'+item.code_info[0]">
                                              <div class="layui-progress-bar" lay-percent="{{item.percent+'%'}}" ></div>
                                            </div>
                                            <div>
                                                <div style="display: flex;justify-content: space-between;align-items: center;">
                                                    <div style="color: red;" :style="{'visibility': item.pay_attention?'visible':'hidden' }">***</div>
                                                    <div class="layui-progress" style="background-color: #BBB; width: 75%;" :id="'progress_'+item.code_info[0]">
                                                      <div class="layui-progress-bar" lay-percent="{{item.percent+'%'}}" ></div>
                                                    </div>
                                                    <div>
                                                        <button class="layui-btn layui-btn-xs layui-btn-danger" v-on:click="cancel_order(item.code_info[0])">撤单</button>
                                                        <button class="layui-btn layui-btn-xs" v-on:click="view_details(item.code_info[0])">查看</button>
                                                    </div>
                                                </div>
                                                <div>
                                                    剩<span :class="{'red':item.left_count <=4}">{{item.left_count}}</span>笔<span>{{item.left_money}}/封单{{item.buy1_money}}</span>,已成大单
                                                     {{item.big_num_count}}笔{{item.big_num_money}}&nbsp; 待成大单{{item.not_deal_big_num_count}}笔{{item.not_deal_big_num_money}}
                                                </div>
                                                <button class="layui-btn layui-btn-xs layui-btn-danger" v-on:click="cancel_order(item.code_info[0])">撤单</button>
                                                <button class="layui-btn layui-btn-xs" v-on:click="view_details(item.code_info[0],true)">查看</button>
                                            </div>
                                            
                                        </div>
                                        <div>
                                            剩<span :class="{'red':item.left_count <=4}">{{item.left_count}}</span>笔<span>{{item.left_money}}/封单{{item.buy1_money}}【比例:{{item.trade_progress_percent+'%'}}】</span>,已成大单
                                             {{item.big_num_count}}笔{{item.big_num_money}}&nbsp; 待成前大单{{item.not_deal_big_num_count[0]}}笔{{item.not_deal_big_num_money[0]}}&nbsp; 待成后大单{{item.not_deal_big_num_count[1]}}笔{{item.not_deal_big_num_money[1]}}
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </td>
                    </tr>
                </thead>
            </table>
            <table style="position: relative;margin-top: 40px;" >
                <caption class="table-name">
                    <span>
                    最近撤单
                    </span>
                    <button style="position: absolute;right: 5px;top: 16px;font-size: 14px;" class="btn" v-on:click="get_latest_cancel_orders">刷新</button>
                </caption>
                <thead>
                    <tr style="padding: 2px 0px;">
                        <td>代码</td>
                        <td>撤单时间</td>
                        <td>下单时间</td>
                        <td>价格</td>
                        <td>委托量</td>
                        <td>操作</td>
                    </tr>
                </thead>
                <tbody style="max-height: 50px;" class="scroll-y">
                    <tr v-for="item in latest_cancel_orders">
                        <td>{{item.securityID}}({{item.securityName}})</td>
                        <td>{{item.cancelTime}}</td>
                        <td>{{item.acceptTime}}</td>
                        <td>{{item.limitPrice}}</td>
                        <td>{{item.volume}}</td>
                        <td><button class="layui-btn layui-btn-xs layui-btn-primary"  v-on:click="view_details(item.securityID,false)">查看</button></td>
                    </tr>
                </tbody>
            </table>
            <div class="layui-tab  layui-tab-card" lay-filter="test-handle">
              <ul class="layui-tab-title">
                <li class="layui-this" lay-id="0">交易数据</li>
                <li lay-id="1">L2数据</li>
              </ul>
              <div class="layui-tab-content">
                <div class="layui-tab-item layui-show">
                    <div id="trade_data" class="scroll-y" >
                        <div v-if="same_reason_codes">
                            <table class="half-width">
                                <caption class="table-name">昨日相同板块代码({{same_reason_codes.reason}})</caption>
                                <tbody>
                                    <tr>
                                        <td style="padding: 0;border: none">
                                            <div class="code-table-container">
                                                <div v-for="(item,i) in same_reason_codes.data"
                                                    :style="{'border-left-style': i%3==0?'solid':'none','border-top-style': i<3?'solid':'none'}">
                                                    <span class="num-style">{{item[1]}}</span>
                                                    <span class="num-style">{{item[0]}}</span>
                                                </div>
                                            </div>
                                        </td>
                                    </tr>
                                </tbody>
                            </table>
                        </div>
                        <table v-if="trade_data">
                            <caption class="table-name"><span>交易参数</span></caption>
                            <tr>
                                <td>是否可以买入</td>
                                <td v-if="trade_data.can_buy_info">
                                    <span class="bold" v-if="trade_data.can_buy_info[0]">可以买入</span>
                                    <span class="bold red" v-else>不可以买入:{{trade_data.can_buy_info[2]}}</span>
                                </td>
                                <td v-else>
                                    <span class="bold">未知</span>
                                </td>
                            </tr>
                            <tr v-if="trade_data.safe_count">
                                <td>安全笔数</td>
                                <td>固定安全笔数<span class="num-style ">{{trade_data.safe_count.base}}</span>笔,衰减后安全笔数<span
                                        class="num-style ">{{trade_data.safe_count.now}}</span>笔</td>
                            </tr>
                            <tr v-if="trade_data.m_val">
                                <td>动态M值</td>
                                <td>固定M值<span
                                        class="num-style ">{{trade_data.m_val.base}}万</span>&nbsp;&nbsp;&nbsp;动态M值<span
                                        class="num-style ">{{trade_data.m_val.now}}万</span></td>
                            </tr>
                            <tr v-if="trade_data.big_num">
                                <td>买前大单</td>
                                <td>固定买前大单<span class="num-style ">{{trade_data.big_num.base}}</span>笔,衰减后买前大单<span
                                        class="num-style ">{{trade_data.big_num.now}}</span>笔
                                </td>
                            </tr>
                            <tr>
                                <td>成交进度</td>
                                <td><span v-if="trade_data.trade_progress">
                                        <div v-for="trade_progress in trade_data.trade_progress">
                                            <span class="num-style ">{{trade_progress.time}}</span>&nbsp;
                                            <span class="num-style ">{{trade_progress.num}}手</span>&nbsp;
                                            <span class="num-style ">{{trade_progress.money}}</span>
                                            <br>
                                        </div>
                                    </span>
                                </td>
                            </tr>
                            <tr>
                                <td>量参考日期</td>
                                <td><span v-if="trade_data.volume_refer_date">
                                            <span class="num-style ">{{trade_data.volume_refer_date}}</span>
                                    </span>
                                </td>
                            </tr>
                            <tr>
                                <td>辨识度信息</td>
                                <td><span v-if="trade_data.special_info">
                                            <span class="num-style ">{{trade_data.special_info[1]}}</span>
                                    </span>
                                </td>
                            </tr>
                            <tr>
                                <td>真实下单位设置</td>
                                <td>
                                    <div style="padding: 3px 1px;">
                                        <button class="layui-btn layui-btn-xs layui-btn-normal" v-on:click="set_real_place_order_index">点击设置</button>
                                    </div>
                                </td>
                            </tr>
                        </thead>
                    </table>
                        </table>
                    
                    
                        <div class="layui-tab layui-tab-brief">
                          <ul class="layui-tab-title">
                            <li class="layui-this">今日挂撤记录</li>
                            <li>L2不下单原因</li>
                    
                    <table v-if="trade_data">
                        <caption class="table-name"><span>交易参数</span></caption>
                        <tr>
                            <td>是否可以买入</td>
                            <td v-if="trade_data.can_buy_info">
                                <span class="bold" v-if="trade_data.can_buy_info[0]">可以买入</span>
                                <span class="bold red" v-else>不可以买入:{{trade_data.can_buy_info[2]}}</span>
                            </td>
                            <td v-else>
                                <span class="bold">未知</span>
                            </td>
                        </tr>
                        <tr v-if="trade_data.safe_count">
                            <td>安全笔数</td>
                            <td>固定安全笔数<span class="num-style ">{{trade_data.safe_count.base}}</span>笔,衰减后安全笔数<span
                                    class="num-style ">{{trade_data.safe_count.now}}</span>笔</td>
                        </tr>
                        <tr v-if="trade_data.m_val">
                            <td>动态M值</td>
                            <td>固定M值<span
                                    class="num-style ">{{trade_data.m_val.base}}万</span>&nbsp;&nbsp;&nbsp;动态M值<span
                                    class="num-style ">{{trade_data.m_val.now}}万</span></td>
                        </tr>
                        <tr v-if="trade_data.big_num">
                            <td>买前大单</td>
                            <td>固定买前大单<span class="num-style ">{{trade_data.big_num.base}}</span>笔,衰减后买前大单<span
                                    class="num-style ">{{trade_data.big_num.now}}</span>笔
                            </td>
                        </tr>
                        <tr>
                            <td>成交进度</td>
                            <td><span v-if="trade_data.trade_progress">
                                    <div v-for="trade_progress in trade_data.trade_progress">
                                        <span class="num-style ">{{trade_progress.time}}</span>&nbsp;
                                        <span class="num-style ">{{trade_progress.num}}手</span>&nbsp;
                                        <span class="num-style ">{{trade_progress.money}}</span>
                                        <br>
                                    </div>
                                </span>
                            </td>
                        </tr>
                        <tr>
                            <td>量参考日期</td>
                            <td><span v-if="trade_data.volume_refer_date">
                                        <span class="num-style ">{{trade_data.volume_refer_date}}</span>
                          </ul>
                          <div class="layui-tab-content">
                            <div class="layui-tab-item layui-show">
                                
                                </span>
                            </td>
                        </tr>
                        <tr>
                            <td>辨识度信息</td>
                            <td><span v-if="trade_data.special_info">
                                        <span class="num-style ">{{trade_data.special_info[1]}}</span>
                                <!-- 今日挂撤记录 -->
                                <table v-if="trade_record">
                                
                                </span>
                            </td>
                        </tr>
                        <tr>
                            <td>真实下单位设置</td>
                            <td>
                                <div style="padding: 3px 1px;">
                                    <button class="layui-btn layui-btn-xs layui-btn-normal" v-on:click="set_real_place_order_index">点击设置</button>
                                </div>
                            </td>
                        </tr>
                    </table>
                    <div class="layui-tab layui-tab-brief">
                      <ul class="layui-tab-title">
                        <li class="layui-this">今日挂撤记录</li>
                        <li>L2不下单原因</li>
                      </ul>
                      <div class="layui-tab-content">
                        <div class="layui-tab-item layui-show">
                            <!-- 今日挂撤记录 -->
                            <table v-if="trade_record">
                                <thead>
                                    <thead>
                                        <tr>
                                            <td>是否炸板:<span v-if="trade_record.open_limit_up"> <span><img
                                                            src="./images/stop_up.png">&nbsp;</span>炸板&nbsp;&nbsp;
                                                    <span class="num-style ">{{trade_record.open_limit_up}}</span></span>
                                                <span v-else class="num-style ">未炸板</span>
                                            </td>
                                        </tr>
                                    </thead>
                                    <tr>
                                        <td>是否炸板:<span v-if="trade_record.open_limit_up"> <span><img
                                                        src="./images/stop_up.png">&nbsp;</span>炸板&nbsp;&nbsp;
                                                <span class="num-style ">{{trade_record.open_limit_up}}</span></span>
                                            <span v-else class="num-style ">未炸板</span>
                                        </td>
                                    </tr>
                                </thead>
                                <tr>
                                    <td>
                                        <div style="width: 100%;display: flex;justify-content: space-between;flex-wrap: wrap;"
                                            class="scroll-y">
                                            <div class="record-item" style="width: 520px; " v-for="(item,index) in trade_record.records">
                                                <div>{{item[0]}}</div> <div>【{{item[1]}}】{{item[2]}} <a href="javascript:void()"
                                                        style='color:red' v-if="item[3]&&item[3].length>0"
                                                        @click="show_more_records(item[3])">更多</a></div>
                                            </div>
                                        </div>
                                    </td>
                                </tr>
                            </table>
                        </div>
                        <div class="layui-tab-item">
                            <table>
                                <tr v-for="item in l2_cant_buy_reasons">
                                    <td>{{item[0]}}</td>
                                    <td>{{item[1]}}</td>
                                </tr>
                            </table>
                        </div>
                      </div>
                    </div>
                </div>
                <div id="l2" :style="{'visibility':data_type==1?'visible':'hidden'}">
                    <div class="l2-nav">
                        <div>
                            <ul class="ul-colors">
                                <li>
                                    <div class="color-single-start"></div><span>信号起始位置</span>
                                </li>
                                <li>
                                    <div class="color-single-exec"></div><span>信号执行位置</span>
                                </li>
                                <li>
                                    <div class="color-l-front"></div><span>L前</span>
                                </li>
                                <li>
                                    <div class="color-l-back"></div><span>L后</span>
                                </li>
                                <li>
                                    <div class="color-h"></div><span>H撤</span>
                                </li>
                                <li>
                                    <div class="color-real-order"></div><span>真实下单</span>
                                </li>
                                <li>
                                    <div class="color-cancel"></div><span>撤单</span>
                                </li>
                                <li>
                                    <div class="color-trade-progress"></div><span>成交进度</span>
                                </li>
                                <li>
                                    <div class="color-latest-real-order"></div><span>最新真实下单</span>
                                </li>
                                <li>
                                    <div class="color-selected"></div><span>选中行</span>
                                </li>
                            </ul>
                            <div class="l2-tool-container">
                                <div class="column-space"></div>
                                <span style="width: 120px;">{{l2_code_name}}</span>
                                <div class="column-space"></div>
                                <button class="btn" v-on:click="refresh_h_cancel_data">加载H撤</button>
                                <div class="column-space"></div>
                                <button class="btn" v-on:click="refresh_l_cancel_data(0)">加载L前撤</button>
                                <div class="column-space"></div>
                                <button class="btn" v-on:click="refresh_l_cancel_data(1)">加载L后撤</button>
                                <div class="column-space"></div>
                                <button class="btn" v-on:click="clear_cancel_mark">清除撤单标记</button>
                                <div class="column-space"></div>
                                <button class="btn" v-on:click="refresh_l2_data">刷新L2数据</button>
                                <div class="column-space"></div>
                                <button class="btn" v-on:click="refresh_trade_progress">成交进度</button>
                                <div class="column-space"></div>
                                <div style="line-height: 20px;margin-top: 5px;"><input type="checkbox" value="1" checked
                                        v-on:click="hidden_cancel_check($event)" /> <label>隐藏撤单</label> </div>
                                <div class="column-space"></div>
                                <div style="line-height: 20px;margin-top: 5px;"><input type="checkbox" value="1" checked
                                        v-on:click="hidden_sell_check($event)" /> <label>隐藏卖</label> </div>
                                <div class="column-space"></div>
                                <div style="line-height: 20px;margin-top: 5px;"><input type="checkbox" value="1" checked
                                        v-on:click="hidden_canceled_check($event)" /> <label>隐藏已撤</label> </div>
                                <div style="line-height: 20px;margin-top: 5px;margin-left: 5px;"><input type="checkbox" value="1" checked
                                        v-on:click="hidden_little_money_check($event)" /> <label>隐藏小金额</label> </div>
                            </div>
                        </div>
                    </div>
                    <div class="l2-content scroll-x">
                        <div style="width: 700px;">
                            <table style="width: 100%;">
                                <thead>
                                    <tr>
                                        <td style="width: 40px;">序号</td>
                                        <td style="width: 80px;">时间</td>
                                        <td style="width: 30px;">金额(万)</td>
                                        <td style="width: 30px;">价格</td>
                                        <td style="width: 45px;">手数</td>
                                        <td style="width: 40px;">类型</td>
                                        <td style="width: 80px;">撤单时间</td>
                                        <td>备注</td>
                                        <td>订单号</td>
                                    </tr>
                                </thead>
                                <tbody>
                                    <!-- !hidden_canceled||(hidden_canceled&&(item[2][8]==null&&item[2][6].indexOf('买撤')<0) -->
                                    <tr v-if="need_show(item)"
                                        v-for="item in l2_datas"
                                        :style="{'background-color': item[0]>0?'#FFFFCC':'white'}"
                                        :class="{'color-trade-progress':trade_progress_index==item[2][0],'order_canceled':item[2][8]!=null&&item[2][8].indexOf('-')>=0,'color-latest-real-order':item[2][0]==latest_real_order_index,'color-l-front':l_up_cancel_indexes.includes(item[2][0]),'color-l-back':l_down_cancel_indexes.includes(item[2][0]),'color-h':h_cancel_indexes.includes(item[2][0]),'color-selected':operate_index==item[2][0]}"
                                        v-on:click="select_row(item[2][0])" >
                                        <td :class="[item[1]]">{{item[2][0]}}</td>
                                        <td>{{item[2][1]}}</td>
                                        <td :class="{'big_num':parseFloat(item[2][3])>=299}">{{item[2][3]}}</td>
                                        <td>{{item[2][4]}}</td>
                                        <td>{{item[2][5]}}</td>
                                        <td>{{item[2][6]}}</td>
                                        <td>
                                            {{item[2][8]}}
                                            <div style="width: 100%;display: flex;justify-content: space-between;flex-wrap: wrap;"
                                                class="scroll-y">
                                                <div class="record-item" style="width: 520px; " v-for="(item,index) in trade_record.records">
                                                    <div>{{item[0]}}</div> <div>【{{item[1]}}】{{item[2]}} <a href="javascript:void()"
                                                            style='color:red' v-if="item[3]&&item[3].length>0"
                                                            @click="show_more_records(item[3])">更多</a></div>
                                                </div>
                                            </div>
                                        </td>
                                        <td>{{item[2][9]}}</td>
                                        <td>{{item[2][10]}}</td>
                                    </tr>
                                </tbody>
                            </table>
                                </table>
                            </div>
                            <div class="layui-tab-item">
                                <table>
                                    <tr v-for="item in l2_cant_buy_reasons">
                                        <td>{{item[0]}}</td>
                                        <td>{{item[1]}}</td>
                                    </tr>
                                </table>
                            </div>
                          </div>
                        </div>
                    </div>
                </div>
                <div class="layui-tab-item">
                    <div style="position: relative;">
                        <div class="l2-nav">
                            <div>
                                <ul class="ul-colors">
                                    <li>
                                        <div class="color-single-start"></div><span>信号起始位置</span>
                                    </li>
                                    <li>
                                        <div class="color-single-exec"></div><span>信号执行位置</span>
                                    </li>
                                    <li>
                                        <div class="color-l-front"></div><span>L前</span>
                                    </li>
                                    <li>
                                        <div class="color-l-back"></div><span>L后</span>
                                    </li>
                                    <li>
                                        <div class="color-h"></div><span>H撤</span>
                                    </li>
                                    <li>
                                        <div class="color-real-order"></div><span>真实下单</span>
                                    </li>
                                    <li>
                                        <div class="color-cancel"></div><span>撤单</span>
                                    </li>
                                    <li>
                                        <div class="color-trade-progress"></div><span>成交进度</span>
                                    </li>
                                    <li>
                                        <div class="color-latest-real-order"></div><span>最新真实下单</span>
                                    </li>
                                    <li>
                                        <div class="color-selected"></div><span>选中行</span>
                                    </li>
                                </ul>
                                <div class="l2-tool-container">
                                    <div class="column-space"></div>
                                    <span style="width: 120px;">{{l2_code_name}}</span>
                                    <div class="column-space"></div>
                                    <button class="btn" v-on:click="refresh_h_cancel_data">加载H撤</button>
                                    <div class="column-space"></div>
                                    <button class="btn" v-on:click="refresh_l_cancel_data(0)">加载L前撤</button>
                                    <div class="column-space"></div>
                                    <button class="btn" v-on:click="refresh_l_cancel_data(1)">加载L后撤</button>
                                    <div class="column-space"></div>
                                    <button class="btn" v-on:click="clear_cancel_mark">清除撤单标记</button>
                                    <div class="column-space"></div>
                                    <button class="btn" v-on:click="refresh_l2_data">刷新L2数据</button>
                                    <div class="column-space"></div>
                                    <button class="btn" v-on:click="refresh_trade_progress">成交进度</button>
                                    <div class="column-space"></div>
                                    <div style="line-height: 20px;margin-top: 5px;"><input type="checkbox" value="1" checked
                                            v-on:click="hidden_cancel_check($event)" /> <label>隐藏撤单</label> </div>
                                    <div class="column-space"></div>
                                    <div style="line-height: 20px;margin-top: 5px;"><input type="checkbox" value="1" checked
                                            v-on:click="hidden_sell_check($event)" /> <label>隐藏卖</label> </div>
                                    <div class="column-space"></div>
                                    <div style="line-height: 20px;margin-top: 5px;"><input type="checkbox" value="1" checked
                                            v-on:click="hidden_canceled_check($event)" /> <label>隐藏已撤</label> </div>
                                    <div style="line-height: 20px;margin-top: 5px;margin-left: 5px;"><input type="checkbox" value="1" checked
                                            v-on:click="hidden_little_money_check($event)" /> <label>隐藏小金额</label> </div>
                                </div>
                            </div>
                        </div>
                        <div class="l2-content scroll-x scroll-y" style="width: 100%;">
                            <div style="width: 700px;">
                                <table >
                                    <thead>
                                        <tr>
                                            <td style="width: 40px;">序号</td>
                                            <td style="width: 80px;">时间</td>
                                            <td style="width: 30px;">金额(万)</td>
                                            <td style="width: 30px;">价格</td>
                                            <td style="width: 45px;">手数</td>
                                            <td style="width: 40px;">类型</td>
                                            <td style="width: 80px;">撤单时间</td>
                                            <td>备注</td>
                                            <td>订单号</td>
                                        </tr>
                                    </thead>
                                    <tbody>
                                        <!-- !hidden_canceled||(hidden_canceled&&(item[2][8]==null&&item[2][6].indexOf('买撤')<0) -->
                                        <tr v-if="need_show(item)"
                                            v-for="item in l2_datas"
                                            :style="{'background-color': item[0]>0?'#FFFFCC':'white'}"
                                            :class="{'color-trade-progress':trade_progress_index==item[2][0],'order_canceled':item[2][8]!=null&&item[2][8].indexOf('-')>=0,'color-latest-real-order':item[2][0]==latest_real_order_index,'color-l-front':l_up_cancel_indexes.includes(item[2][0]),'color-l-back':l_down_cancel_indexes.includes(item[2][0]),'color-h':h_cancel_indexes.includes(item[2][0]),'color-selected':operate_index==item[2][0]}"
                                            v-on:click="select_row(item[2][0])" >
                                            <td :class="[item[1]]">{{item[2][0]}}</td>
                                            <td>{{item[2][1]}}</td>
                                            <td :class="{'big_num':parseFloat(item[2][3])>=299}">{{item[2][3]}}</td>
                                            <td>{{item[2][4]}}</td>
                                            <td>{{item[2][5]}}</td>
                                            <td>{{item[2][6]}}</td>
                                            <td>
                                                {{item[2][8]}}
                                            </td>
                                            <td>{{item[2][9]}}</td>
                                            <td>{{item[2][10]}}</td>
                                        </tr>
                                    </tbody>
                                </table>
                            </div>
                        </div>
                    </div>
                </div>
              </div>
            </div>
        </div>
        <script>
kp_html/kp/css/banshuping.css
@@ -472,18 +472,24 @@
    height: 12px;
}
#l2{
    position: relative;
    top: 0;
}
.l2-nav{
    display: flex;
    align-items: center;
    position: fixed;
    top: 67px;
    position: absolute;
    top: 0;
    background-color: white;
    height: 120px;
    z-index: 100;
}
.l2-content{
    position: absolute;
    top: 190px;
    top: 120px;
    height: 1000px;
    z-index: -1;
}
@@ -573,4 +579,9 @@
.delegated_codes_info .layui-progress{
    margin-bottom: 5px;
}
.delegate_item{
    border-top: solid 2px gray;
    padding: 2px 2px;
}
kp_html/kp/js/code_list.js
@@ -28,9 +28,11 @@
    app = new Vue({
        el: "#app",
        data: {
            element: null,
            code: "000000",
            code_name: "测试代码",
            origin_code:null,
            account_available_money: 0,
            origin_code: null,
            trade_data: {},
            trade_record: {
                open_limit_up: "",
@@ -44,9 +46,9 @@
            latest_real_order_index: -1,
            hidden_canceled: true,
            //隐藏撤单
            hidden_cancel:true,
            hidden_little_money:true,
            hidden_sell:true,
            hidden_cancel: true,
            hidden_little_money: true,
            hidden_sell: true,
            l2_datas: [],
            l2_colors_class: ["color-single-start", "color-single-exec", "color-cancel",
                "color-real-order"
@@ -59,38 +61,46 @@
            l2_code_name: '',
            operate_index: -1,
            // 已经委托的买代码信息
            delegated_buy_code_infos:[],
            layui_element:null,
            l2_cant_buy_reasons:[],
            delegated_buy_code_infos: [],
            layui_element: null,
            l2_cant_buy_reasons: [],
            latest_cancel_orders: []
        },
        watch:{
            delegated_buy_code_infos:function(){
                if(app.layui_element){
                    setTimeout(()=>{
        watch: {
            delegated_buy_code_infos: function() {
                if (app.layui_element) {
                    setTimeout(() => {
                        app.layui_element.render();
                    })
                }
            }
        },
        mounted:function(){
             layui.use('element', function(){
                var element = layui.element;
                app.layui_element=element;
              });
            setInterval(function(){
                if(is_trade_time()){
        mounted: function() {
            layui.use('element', function() {
                var element = layui.element;
                app.layui_element = element;
            });
            setInterval(function() {
                if (is_trade_time()) {
                    app.get_delegated_buy_code_infos();
                    app.get_latest_cancel_orders();
                }
            },1000*3);
            }, 1000 * 3);
            layui.use(function() {
                app.element = layui.element;
            });
        },
        methods: {
            change_data_type: function(type) {
                if (app.data_type == type) {
                    return;
                }
                app.data_type = type;
                window.scrollTo(0,0);
                // if (app.data_type == type) {
                //     return;
                // }
                // app.data_type = type;
                // window.scrollTo(0,0);
                app.element.tabChange('test-handle', type);
            },
            refresh_trade_progress: function() {
                if (app.code == "000000") {
@@ -114,7 +124,7 @@
                    return;
                }
                http_util.get_l2_l_cancel_datas(app.code, app.operate_index, function(res) {
                    console.log("L撤结果",res);
                    console.log("L撤结果", res);
                    res = JSON.parse(res);
                    if (res.code == 0) {
                        if (type_ == 0) {
@@ -143,14 +153,14 @@
                    alert("没有获取到代码")
                    return;
                }
                var index = layer.load(1, {
                  shade: [0.1,'#fff'] //0.1透明度的白色背景
                    shade: [0.1, '#fff'] //0.1透明度的白色背景
                });
                http_util.get_l2_datas(app.code, function(res) {
                    layer.close(index);
                    console.log("获取到L2数据:",res)
                    console.log("获取到L2数据:", res)
                    res = JSON.parse(res);
                    if (res.code == 0) {
                        var real_order_index = -1;
@@ -173,7 +183,7 @@
                        console.log("最近真实下单位置:", real_order_index);
                        app.latest_real_order_index = real_order_index;
                        app.l2_datas = res.data.data;
                        console.log("L2数据:",app.l2_datas);
                        console.log("L2数据:", app.l2_datas);
                        var code_name = res.data.code_name;
                        var code_ = res.data.code;
                        app.l2_code_name = code_ + " " + code_name;
@@ -183,33 +193,54 @@
                        app.l_down_cancel_indexes = [];
                        app.h_cancel_indexes = [];
                        app.buy_single_indexes = buy_singles;
                    }else{
                    } else {
                        alert(res.msg);
                    }
                });
            },
            get_delegated_buy_code_infos:function(){
            get_delegated_buy_code_infos: function() {
                // 获取数据
                http_util.get_delegated_buy_code_infos(function(result){
                http_util.get_delegated_buy_code_infos(function(result) {
                    if (result.code == 0) {
                        console.log("已挂买单数据:",result.data);
                        result.data.forEach(function(e){
                            if(e.total_num>0){
                                e.percent = e.finish_num*100/e.total_num;
                            }else{
                        console.log("已挂买单数据:", result.data);
                        result.data.delegates.forEach(function(e) {
                            if (e.total_num > 0) {
                                e.percent = e.finish_num * 100 / e.total_num;
                            } else {
                                e.percent = 0;
                            }
                        });
                        app.delegated_buy_code_infos = result.data
                    }else{
                        console.log("已挂买单错误:",result.msg);
                        app.delegated_buy_code_infos=[];
                        app.delegated_buy_code_infos = result.data.delegates;
                        app.account_available_money = result.data.account_available_money;
                        app.reset_l2_height();
                    } else {
                        console.log("已挂买单错误:", result.msg);
                        app.delegated_buy_code_infos = [];
                    }
                });
            },
            get_latest_cancel_orders: function() {
                http_util.get_latest_cancel_orders(function(res) {
                    res = JSON.parse(res);
                    console.log("最近的撤单", res);
                    if (res.code == 0) {
                        app.latest_cancel_orders = res.data;
                        app.reset_l2_height();
                    }
                });
            },
            reset_l2_height: function() {
                var height = document.documentElement.clientHeight;
                console.log("屏幕:", height);
                $(".l2-content").eq(0).css("height", (height - 370 - 66 * app
                        .delegated_buy_code_infos.length - 24 * app.latest_cancel_orders.length
                        ) + "px");
            },
            clear_cancel_mark: function() {
                //清除撤单标记
                app.l_up_cancel_indexes = [];
@@ -232,17 +263,17 @@
                app.hidden_canceled = e.currentTarget.checked;
            },
            hidden_cancel_check: function(e) {
                app.hidden_cancel = e.currentTarget.checked;
            },
            hidden_sell_check: function(e) {
                app.hidden_sell = e.currentTarget.checked;
            },
            hidden_little_money_check:function(e){
            hidden_little_money_check: function(e) {
                app.hidden_little_money = e.currentTarget.checked;
            },
@@ -315,7 +346,7 @@
                    console.log("处理出错")
                    console.log(e)
                }
                 app.get_l2_cant_buy_reasons(code);
                app.get_l2_cant_buy_reasons(code);
            },
            show_more_records: function(items) {
                var str_ = ""
@@ -327,56 +358,62 @@
            },
            set_real_place_order_index: function() {
                // 设置真实下单位
                if(app.code){
                if (app.code) {
                    layer.prompt({
                      formType: 0,
                      value: '',
                      title: '设置真实下单位-'+app.code,
                      area: ['800px', '350px'] //自定义文本域宽高
                    }, function(value, index, elem){
                        try{
                            if(isNaN(value)){
                        formType: 0,
                        value: '',
                        title: '设置真实下单位-' + app.code,
                        area: ['800px', '350px'] //自定义文本域宽高
                    }, function(value, index, elem) {
                        try {
                            if (isNaN(value)) {
                                layer.msg("请输入数字");
                                return;
                            }else{
                                http_util.set_real_place_order_index(app.code,parseInt(value),function(res){
                            } else {
                                http_util.set_real_place_order_index(app.code, parseInt(
                                    value), function(res) {
                                    // 获取到结果
                                    console.log(res);
                                    if(res.code!=0){
                                        layer.msg(res.msg,{icon: 5});
                                    }else{
                                        layer.msg("设置成功",{icon: 1});
                                    if (res.code != 0) {
                                        layer.msg(res.msg, {
                                            icon: 5
                                        });
                                    } else {
                                        layer.msg("设置成功", {
                                            icon: 1
                                        });
                                    }
                                })
                            }
                        }catch(e){
                        }
                        } catch (e) {}
                        layer.close(index);
                    });
                    //set_real_place_order_index
                }else{
                    layer.msg("请先加载数据");
                } else {
                    layer.msg("请先加载数据");
                }
            },
            need_show:function(item){
                if(app.hidden_canceled&&(item[2][6].indexOf('买撤')>=0||(item[2][8]!=null&&item[2][8].indexOf("-")>0))){
            need_show: function(item) {
                if (app.hidden_canceled && (item[2][6].indexOf('买撤') >= 0 || (item[2][8] != null &&
                        item[2][8].indexOf("-") > 0))) {
                    return false;
                }
                if(app.hidden_sell&&item[2][6].indexOf('卖')>=0){
                if (app.hidden_sell && item[2][6].indexOf('卖') >= 0) {
                    return false;
                }
                if(app.hidden_cancel&&(item[2][6].indexOf('买撤')>=0)){
                if (app.hidden_cancel && (item[2][6].indexOf('买撤') >= 0)) {
                    return false;
                }
                if(app.hidden_little_money&&parseFloat(item[2][3])<50&&item[2][0]!=app.latest_real_order_index){
                if (app.hidden_little_money && parseFloat(item[2][3]) < 50 && item[2][0] != app
                    .latest_real_order_index) {
                    return false;
                }
                return true;
            },
            get_score_data: function(code, name, callback) {
@@ -398,7 +435,7 @@
                                order: res.data.trade_data.trade_state.order
                            }
                        } else {
                            res.data.trade_data= {
                            res.data.trade_data = {
                                order: false
                            };
                            app.trade_data = res.data.trade_data
@@ -406,11 +443,11 @@
                        app.kpl_code_info = res.data.kpl_code_info;
                        //通知副屏改变内容
                        app.set_trade_info(app.code, app.code_name,
                            res.data.trade_data,
                            res.data.trade_record,
                            res.data.trade_data,
                            res.data.trade_record,
                            res.data.initiative_buy_codes,
                            res.data.passive_buy_codes);
                        if (callback) {
                            callback()
                        }
@@ -422,40 +459,45 @@
                app.origin_code = code;
                app.code_name = code;
            },
            load_data:function(refresh_l2){
                if(app.origin_code){
                    app.get_score_data(app.origin_code,null,function(e){
                        if(refresh_l2){
            load_data: function(refresh_l2) {
                if (app.origin_code) {
                    app.get_score_data(app.origin_code, null, function(e) {
                        if (refresh_l2) {
                            app.refresh_l2_data();
                        }
                    });
                    app.get_l2_cant_buy_reasons(app.origin_code);
                    app.get_l2_cant_buy_reasons(app.origin_code);
                }
            },
            cancel_order:function(code){
                http_util.cancel_order(code,function(res){
            cancel_order: function(code) {
                http_util.cancel_order(code, function(res) {
                    layer.msg("撤单成功");
                });
            },
            view_details:function(code){
            view_details: function(code, need_l2) {
                pyjs.add_code_to_ths(code);
                // 设置目标代码
                app.set_target_code(code);
                // 点击选择L2选项
                app.change_data_type(1);
                // 将目标票传递到首页
                pyjs.set_target_code(code);
                app.load_data(true);
                if (need_l2) {
                    // 点击选择L2选项
                    app.change_data_type(1);
                    app.load_data(true);
                } else {
                    app.change_data_type(0);
                    app.load_data(false);
                }
            },
            get_l2_cant_buy_reasons:function(code){
                http_util.get_l2_cant_buy_reasons(code,function(res){
            get_l2_cant_buy_reasons: function(code) {
                http_util.get_l2_cant_buy_reasons(code, function(res) {
                    res = JSON.parse(res);
                    if(res.code==0){
                    if (res.code == 0) {
                        app.l2_cant_buy_reasons = res.data;
                    }else{
                        app.l2_cant_buy_reasons =[]
                    } else {
                        app.l2_cant_buy_reasons = []
                    }
                });
            }
kp_html/kp/js/http.js
@@ -266,6 +266,13 @@
        var params={code:code}
        console.log("参数",params)
        http_util.http_request("/get_l2_cant_buy_reasons", params, callback);
    },
    get_latest_cancel_orders:function(callback){
        var params={type:"get_latest_cancel_orders",data:{},sign:''}
        http_util.socket_request(JSON.stringify(params), function(result) {
            result = JSON.parse(result);
            callback(result);
        });
    }
    
    
kp_html/kp/test.html
@@ -1,17 +0,0 @@
<!DOCTYPE html>
<html>
    <script src="js/http.js"></script>
    <body>
        <video src="http://www.test.cn"></video>
        <script>
        var sign = http_util.get_sign({type:"123123"});
        console.log(sign);
        </script>
    </body>
</html>
main.py
@@ -6,9 +6,8 @@
import queue
import threading
import time
from multiprocessing import freeze_support
import sys
from urllib.parse import urlparse, parse_qs
from multiprocessing import Pipe, Process, freeze_support
import torch
import win32gui
@@ -16,8 +15,7 @@
from PyQt5.QtWebChannel import QWebChannel
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEngineSettings
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, QMessageBox, QLabel, QDialog, QVBoxLayout, QPushButton, \
    QWidget, QMenu
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, QMessageBox, QLabel
from PyQt5.QtCore import Qt, pyqtSlot, QObject, pyqtSignal, QTimer, QUrl, QPoint
@@ -28,11 +26,7 @@
import setting
from utils import tool
import win32_util
from juejin_core import JueJinApi
from kpl import kpl_util, kpl_api
from kpl.kpl_data_manager import KPLLimitUpDataManager
freeze_support()
URL_MSG_LIST = f"http://{constant.WEB_HOST}/kp/msg_list.html"
@@ -120,7 +114,7 @@
    @pyqtSlot(str)
    def add_code_to_ths(self, code):
        # 添加到同花顺
        threading.Thread(target=lambda: ths_util.add_code_to_zixuan(code),daemon=True).start()
        threading.Thread(target=lambda: ths_util.add_code_to_zixuan(code), daemon=True).start()
class SecondWindowBridgeClass(BaseBridgeClass):
@@ -527,11 +521,6 @@
            time.sleep(0.5)
# 打包命令
# cd D:\workspace\GP\trade_desk
# D:\workspace\GP\trade_desk\dist\env\pk_env\Scripts\pyinstaller.exe main.spec
def recieve_code(pipe, mainWindow):
    latest_code = ''
    while True:
@@ -546,10 +535,15 @@
        except Exception as e:
            logging.exception(e)
# 打包命令
# cd D:\workspace\GP\trade_desk
# D:\workspace\GP\trade_desk\dist\env\pk_env\Scripts\pyinstaller.exe main.spec
# 为了不出现意外的bug,运行时请将目录放在英文路径
if __name__ == "__main__":
    freeze_support()
    p1, p2 = multiprocessing.Pipe()
    wxGuiProcess = multiprocessing.Process(target=gui_wx.run, args=(p1,))
    wxGuiProcess = Process(target=gui_wx.run, args=(p1,))
    wxGuiProcess.start()
    app = QApplication(sys.argv)
main.spec
@@ -9,7 +9,18 @@
    pathex=[],
    binaries=[],
    datas=[('res','res'),('datas','datas'),('logs','logs'),('venv/Lib/site-packages/dateutil','dateutil')],
    hiddenimports=[],
    hiddenimports=[
    'multiprocessing',
    'multiprocessing.context',
    'multiprocessing.process',
    'multiprocessing.reduction',
    'multiprocessing.shared_memory',
    'multiprocessing.spawn',
    'multiprocessing.spawn',
    'multiprocessing.connection',
    'multiprocessing.synchronize',
    'multiprocessing.managers',
    'multiprocessing.util'],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
@@ -17,7 +28,7 @@
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
    noarchive=False
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
@@ -30,7 +41,7 @@
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx=False,
    console=False,
    disable_windowed_traceback=False,
    argv_emulation=False,
utils/ths_util.py
@@ -133,13 +133,12 @@
            while True:
                if temp and win32gui.IsWindowVisible(temp):
                    classname = win32gui.GetClassName(temp)
                    if classname == 'Afx:00400000:0':
                    if classname and classname.find("Afx:") == 0 and classname.endswith(":0"):
                        hwnds.append(temp)
                temp = win32gui.FindWindowEx(hwnd, temp, None, None)
                if not temp:
                    break
        except:
            pass
        hwnd = win32gui.FindWindowEx(hwnds[0], None, "Edit", "")
        print(hwnd)
@@ -147,10 +146,10 @@
        time.sleep(0.5)
        win32gui.SendMessage(hwnds[0], win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
        win32gui.PostMessage(hwnds[0], win32con.WM_KEYUP, win32con.VK_RETURN, 0)
        time.sleep(0.2)
        win32gui.SetForegroundWindow(origin_hwnd)
        win32api.keybd_event(win32con.VK_INSERT, 0, 0, 0)  # 按下键
        win32api.keybd_event(win32con.VK_INSERT, 0, win32con.KEYEVENTF_KEYUP, 0)
        # time.sleep(0.5)
        # win32gui.SetForegroundWindow(origin_hwnd)
        # win32api.keybd_event(win32con.VK_INSERT, 0, 0, 0)  # 按下键
        # win32api.keybd_event(win32con.VK_INSERT, 0, win32con.KEYEVENTF_KEYUP, 0)
if __name__ == "__main__":