量化交易之python篇 - remi_web - 内网前端(remi_web.py)

from remi.server import App, Server
import remi.gui as gui
import time
from position_operator.position_operator import PositionJsonOperator as TQZJsonOperator
from position_operator.position_operator import ContractModel
from remi_model import AdministratorModel


class MainWeb(App):
    def __init__(self, *args):
        super(MainWeb, self).__init__(*args)

    def idle(self):
        # 刷新一次 table控件、time控件
        if self._is_refresh_time(now_time_second=time.localtime().tm_sec, interval_second=15) is True:
            self._web_refresh(current_account_name=self.current_account_name)
            print(self._time_now())

    def main(self):
        self._window_load_data()

        return self._add_child_widgets(current_account_name=self.current_account_name)


    # private part
    # - window load data / add child widgets -
    def _window_load_data(self):
        self.administrator_name_list = AdministratorModel.administrator_name_list()
        self.current_administrator_name = ""
        self.current_account_name = ""

    def _add_child_widgets(self, current_account_name):
        self.layout_width = '90%'
        self.window = gui.VBox(width='100%')  # 全屏

        # administrator_textInput 控件: 输入账户名
        self.administrator_textInput = self._get_administrator_textInput()
        self.administrator_hint_label = gui.Label("", width=self.layout_width, height='10%')

        # account_textInput 控件: 输入账户名
        self.account_textInput = self._get_account_textInput()
        self.account_name_list_hint_label = gui.Label("", width=self.layout_width, height='10%')

        # time_label 控件: 当前时间
        self.time_label = self._get_time_label()

        # table控件: 账户对应的持仓数据
        self.table = self._get_table(account_name=current_account_name)

        return self._window_add_subviews(
            self.administrator_textInput,
            self.administrator_hint_label,

            self.account_textInput,
            self.account_name_list_hint_label,

            self.time_label,
            self.table,
            window=self.window
        )

    def _administrator_change(self, administrator_name):

        self.account_jsonfile_dictionary = AdministratorModel.account_jsonfile_dictionary(
            administrator_name=administrator_name
        )

        self.account_name_list = []
        [self.account_name_list.append(account_name) for account_name in self.account_jsonfile_dictionary.keys()]

        self.current_account_name = ""
        self._web_refresh(current_account_name=self.current_account_name)


    # -- administrator text input widget part --
    def _get_administrator_textInput(self):
        administrator_textInput = gui.TextInput(
            single_line=True,
            hint="认证 管理员 (按 Enter 确认)",
            width=self.layout_width,
            height="10%"
        )

        administrator_textInput.onkeyup.do(callback=self._administrator_textInput_onkeyup)

        return administrator_textInput

    def _administrator_textInput_onkeyup(self, widget, current_hint, last_presskey):
        self.current_administrator_name = current_hint
        self.current_account_name = ""
        self.administrator_hint_label.set_text(text="")
        self.account_textInput.set_text(text=self.current_account_name)
        self.account_name_list_hint_label.set_text(text="")

        self._administrator_change(administrator_name="")  # 清空 当前管理员的 所有数据
        self._web_refresh(current_account_name=self.current_account_name)

        if "13" == last_presskey:
            self.current_administrator_name = current_hint

            if self.current_administrator_name in self.administrator_name_list:
                self.administrator_hint_label.set_text(text="管理员 %s 认证成功;" % current_hint)
                self.current_administrator_name = current_hint
                self._administrator_change(administrator_name=self.current_administrator_name)
            else:
                self.administrator_hint_label.set_text(text="不存在 %s 管理员;" % current_hint)


    # -- account text input widget part --
    def _get_account_textInput(self):
        account_textInput = gui.TextInput(
            single_line=True,
            hint="查询 账户 (按 Enter 确认)",
            width=self.layout_width,
            height="10%"
        )

        account_textInput.onkeyup.do(callback=self._account_textInput_onkeyup)

        return account_textInput

    def _account_textInput_onkeyup(self, widget, current_hint, last_presskey):
        self.current_account_name = current_hint
        self._web_refresh(current_account_name=self.current_account_name)

        if AdministratorModel.administrator_is_exist(administrator_name=self.current_administrator_name) is False:
            # --- 管理员 认证失败, 刷新 administrator_hint_label 和 account_name_list_hint_label ---
            self.administrator_hint_label.set_text(text="不存在 %s 管理员;" % self.administrator_textInput.get_text())
            self.account_name_list_hint_label.set_text(text="管理员 %s 认证失败;" % self.administrator_textInput.get_text())
            self.current_account_name = current_hint
            return
        elif AdministratorModel.administrator_is_exist(administrator_name=self.current_administrator_name) and 0 == len(self.account_name_list):
            # --- 管理员存在, 但是因为还没认证, 所以模型端还没拿到数据 ---
            self.account_name_list_hint_label.set_text(text="管理员 %s 尚未认证;" % self.administrator_textInput.get_text())
            self.current_account_name = current_hint
            return

        empty_account_list = []
        for account_name in self.account_name_list:
            if (current_hint is not "") and account_name.lower().startswith(current_hint.lower()):
                empty_account_list.append(account_name)

        empty_account_list_string = ', '.join(empty_account_list)

        if len(empty_account_list) is not 0:
            self.account_name_list_hint_label.set_text("账户查询结果: " + empty_account_list_string + ";")
        elif (len(empty_account_list) is 0) and (current_hint is ""):
            self.account_name_list_hint_label.set_text("")
        elif (len(empty_account_list) is 0) and (current_hint is not ""):
            self.account_name_list_hint_label.set_text("不存在 %s 账户;" % current_hint)

        if len(empty_account_list) != 0:
            current_hint = empty_account_list[0]

        if (last_presskey == "13") and (current_hint in self.account_name_list):
            # --- 按下回车时, 确认账户(current_hint)存在 ---
            self.current_account_name = current_hint
            self.account_textInput.set_text(self.current_account_name)
            self.account_name_list_hint_label.set_text("账户查询结果: " + self.current_account_name)
            self._web_refresh(current_account_name=current_hint)
        elif (last_presskey == "13") and (current_hint not in self.account_name_list):
            # --- 按下回车时, 账户(current_hint)不存在 ---
            self.current_account_name = current_hint
            self.account_name_list_hint_label.set_text("不存在 %s 账户" % current_hint)
            self._web_refresh(current_account_name=current_hint)


    # -- time label widget part --
    def _get_time_label(self):
        label_test = '更新时间: ' + self._time_now()
        return gui.Label(label_test, width=self.layout_width, height='20%')

    @staticmethod
    def _time_now():
        return time.strftime("%Y/%m/%d  %H:%M:%S", time.localtime())


    # -- table widget part --
    def _get_table(self, account_name):
        content_data = self._load_table_data(account_name=account_name)
        return gui.Table.new_from_list(content=content_data, width=self.layout_width, fill_title=True)  # fill_title: True代表第一行是蓝色, False代表表格内容全部同色

    def _load_table_data(self, account_name):
        title_cell = ("合约", "当前持仓", "入场价", "目标持仓")
        table_data = [title_cell]

        if AdministratorModel.administrator_is_exist(administrator_name=self.current_administrator_name) is False:
            return table_data
        elif account_name not in self.account_jsonfile_dictionary.keys():
            return table_data

        jsonfile = self.account_jsonfile_dictionary[account_name]
        account_data_dic = TQZJsonOperator.tqz_load_jsonfile(filename=jsonfile)

        contract_models = ContractModel.dictionary_to_models(data_dictionary=account_data_dic)
        for contract_model in contract_models:
            empty_cell = [
                str(contract_model.name),
                str(contract_model.position_model.lots),
                str(contract_model.position_model.entry_price),
                # str(contract_model.position_model.target_position),
            ]

            target_position = contract_model.position_model.target_position
            if (target_position is None) or (0 == target_position):
                empty_cell.append("0")

            table_data.append(tuple(empty_cell))

        return table_data


    # -- web refresh part --
    @staticmethod
    def _is_refresh_time(now_time_second, interval_second):
        """
            判断当前时间, 是否应该刷新数据(table_data、table控件、time_label_控件)
        :param now_time_second: 当前时间的 秒数
        :param interval_second: 刷新一次所用时间
        :return: 当前秒数是否应该刷新
        """

        if now_time_second % interval_second is 0:
            should_refresh = True
        else:
            should_refresh = False

        return should_refresh

    def _web_refresh(self, current_account_name):
        self.administrator_textInput.set_text(text=self.current_administrator_name)
        self.account_textInput.set_text(text=current_account_name)
        self.time_label.set_text(text='更新时间: ' + self._time_now())

        self.window.remove_child(self.table)
        table_content = self._load_table_data(account_name=current_account_name)
        self.table = gui.Table.new_from_list(content=table_content, width=self.layout_width, fill_title=True)
        self._window_add_subviews(self.table, window=self.window)

    @staticmethod
    def _window_add_subviews(*subviews, window):
        [window.append(subview) for subview in subviews]
        return window


if __name__ == '__main__':
    # remi库文档资料: https://remi.readthedocs.io/en/latest/remi.html#remi.gui.Widget
    Server(gui_class=MainWeb, update_interval=1, port=8876)  # 参数 update_interval: 程序每1s调用一次 idel() 函数;

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值