예제 #1
0
파일: widget.py 프로젝트: sdywcd/vnpy-1
    def __init__(self, start: datetime, end: datetime, parent=None):
        """"""
        super().__init__(parent)

        self.setWindowTitle("选择数据区间")

        self.start_edit = QtWidgets.QDateEdit(
            QtCore.QDate(
                start.year,
                start.month,
                start.day
            )
        )
        self.end_edit = QtWidgets.QDateEdit(
            QtCore.QDate(
                end.year,
                end.month,
                end.day
            )
        )

        button = QtWidgets.QPushButton("确定")
        button.clicked.connect(self.accept)

        form = QtWidgets.QFormLayout()
        form.addRow("开始时间", self.start_edit)
        form.addRow("结束时间", self.end_edit)
        form.addRow(button)

        self.setLayout(form)
예제 #2
0
    def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture:
        """"""
        # Create objects
        candle_picture = QtGui.QPicture()
        painter = QtGui.QPainter(candle_picture)

        # Set painter color
        if bar.close_price >= bar.open_price:
            painter.setPen(self._up_pen)
            painter.setBrush(self._up_brush)
        else:
            painter.setPen(self._down_pen)
            painter.setBrush(self._down_brush)

        # Draw candle shadow
        painter.drawLine(QtCore.QPointF(ix, bar.high_price),
                         QtCore.QPointF(ix, bar.low_price))

        # Draw candle body
        if bar.open_price == bar.close_price:
            painter.drawLine(
                QtCore.QPointF(ix - BAR_WIDTH, bar.open_price),
                QtCore.QPointF(ix + BAR_WIDTH, bar.open_price),
            )
        else:
            rect = QtCore.QRectF(ix - BAR_WIDTH, bar.open_price, BAR_WIDTH * 2,
                                 bar.close_price - bar.open_price)
            painter.drawRect(rect)

        # Finish
        painter.end()
        return candle_picture
예제 #3
0
파일: item.py 프로젝트: asciili/vnpy
    def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture:
        """"""
        value = self.values[ix]
        last_value = self.values[ix - 1]
        # Create objects
        picture = QtGui.QPicture()
        painter = QtGui.QPainter(picture)

        # Set painter color
        painter.setPen(self.yellow_pen)
        # painter.setBrush(self.yellow_brush)

        # Draw Line
        if np.isnan(last_value) or np.isnan(value):
            # print(ix - 1, last_value,ix, value,)
            pass
        else:
            start_point = QtCore.QPointF(ix - 1, last_value)
            end_point = QtCore.QPointF(ix, value)
            painter.drawLine(start_point, end_point)

        # Draw Circle
        # painter.drawEllipse(QtCore.QPointF(ix, self.values[ix]), 2, 2)

        # Finish
        painter.end()
        return picture
예제 #4
0
파일: widget.py 프로젝트: longfeiw07/jonpy
    def onIntervalActivated(self):

        current_symbol = self.symbol_combo.currentText()
        current_exchange = self.exchange_combo.currentText()
        current_interval = self.interval_combo.currentText()

        count_series = self.dbbardata_groupby_df[
            (self.dbbardata_groupby_df['symbol'] == current_symbol)
            & (self.dbbardata_groupby_df['exchange'] == current_exchange)
            & (self.dbbardata_groupby_df['interval']
               == current_interval)]['count(1)']

        if count_series.empty:
            self.data_counts_label.setText("0")
        else:
            self.data_counts_label.setText(f'''{count_series.values[0]}''')

        if current_exchange and current_symbol and current_interval:
            symbol_de_L8_str = current_symbol[:-2]
            if symbol_de_L8_str in self.pytdx_contracts_dict:
                self.symbol_label.setText(
                    f"{self.pytdx_contracts_dict[symbol_de_L8_str]['name']}")
                self.size_line.setText(
                    f"{self.pytdx_contracts_dict[symbol_de_L8_str]['size']}")
                self.pricetick_line.setText(
                    f"{self.pytdx_contracts_dict[symbol_de_L8_str]['pricetick']}"
                )
            elif current_exchange.lower(
            ) in self.pyccxt_exchange.exchange_list:
                self.symbol_label.setText(f"{current_symbol}")
                cur_exchange_market_info_dict = self.pyccxt_exchange.read_local_market_info_json_file(
                    current_exchange.lower())
                if cur_exchange_market_info_dict \
                        and (current_symbol.replace("_", "/").upper() in cur_exchange_market_info_dict):
                    market_info = cur_exchange_market_info_dict[
                        current_symbol.replace("_", "/").upper()]
                    self.pricetick_line.setText(
                        f"{market_info['limits']['price']['min']}")
                else:
                    self.pricetick_line.setText(f"999")
                self.size_line.setText(f"{1}")

            # TODO 增加重置日期后统计数据数目
            # 重置日期
            db_end_dt = self.db_instance.get_end_date_from_db(
                symbol=current_symbol,
                exchange=current_exchange,
                interval=current_interval)
            db_end_dt = datetime.strptime(db_end_dt, '%Y-%m-%d %H:%M:%S')
            db_start_dt = self.db_instance.get_start_date_from_db(
                symbol=current_symbol,
                exchange=current_exchange,
                interval=current_interval)
            db_start_dt = datetime.strptime(db_start_dt, '%Y-%m-%d %H:%M:%S')
            self.start_date_edit.setDate(
                QtCore.QDate(db_start_dt.year, db_start_dt.month,
                             db_start_dt.day))
            self.end_date_edit.setDate(
                QtCore.QDate(db_end_dt.year, db_end_dt.month, db_end_dt.day))
예제 #5
0
class QA_GUI_Selected_TaskQueue(QtCore.QThread):
    # QThread 继承的不执行__init__
    # def __int__(self, logDisplay):
    # 奇怪的问题, 不执行 __init__
    # 初始化函数,默认
    #    super().__init__()
    # sfassda
    #print("run here")
    # exit(0)
    #self.logDisplay = logDisplay
    # sys.stderr.textWritten.connect(self.outputWrittenStderr)

    # 下面将print 系统输出重定向到textEdit中
    #sys.stdout = EmittingStream()
    #sys.stderr = EmittingStream()

    # 接收信号str的信号槽
    '''
      def outputWrittenStdout(self, text):
        cursor = self.logDisplay.textCursor()
        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertText(text)
        self.logDisplay.setTextCursor(cursor)
        self.logDisplay.ensureCursorVisible()

    def outputWrittenStderr(self, text):
        cursor = self.logDisplay.textCursor()
        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertText(text)
        self.logDisplay.setTextCursor(cursor)
        self.logDisplay.ensureCursorVisible()
    '''

    # 定义一个信号,
    trigger_all_task_start = QtCore.pyqtSignal(str)
    trigger_all_task_done = QtCore.pyqtSignal(str)
    # 定义任务(每个是一个线程)
    QA_GUI_Task_List = []

    def run(self):

        self.trigger_all_task_start.emit('all_task_start')

        for iSubTask in self.QA_GUI_Task_List:
            iSubTask.start()
            # wait finish iSubTask
            while (iSubTask.isRunning()):
                time.sleep(1)

        self.trigger_all_task_done.emit('all_task_done')

    def putTask(self, subTask):
        self.QA_GUI_Task_List.append(subTask)

    def clearTask(self):
        self.QA_GUI_Task_List.clear()
예제 #6
0
class SpreadStrategyMonitor(QtWidgets.QWidget):
    """"""

    signal_strategy = QtCore.pyqtSignal(Event)

    def __init__(self, spread_engine: SpreadEngine):
        super().__init__()

        self.strategy_engine = spread_engine.strategy_engine
        self.main_engine = spread_engine.main_engine
        self.event_engine = spread_engine.event_engine

        self.managers = {}

        self.init_ui()
        self.register_event()

    def init_ui(self):
        """"""
        self.scroll_layout = QtWidgets.QVBoxLayout()
        self.scroll_layout.addStretch()

        scroll_widget = QtWidgets.QWidget()
        scroll_widget.setLayout(self.scroll_layout)

        scroll_area = QtWidgets.QScrollArea()
        scroll_area.setWidgetResizable(True)
        scroll_area.setWidget(scroll_widget)

        vbox = QtWidgets.QVBoxLayout()
        vbox.addWidget(scroll_area)
        self.setLayout(vbox)

    def register_event(self):
        """"""
        self.signal_strategy.connect(self.process_strategy_event)

        self.event_engine.register(
            EVENT_SPREAD_STRATEGY, self.signal_strategy.emit
        )

    def process_strategy_event(self, event):
        """
        Update strategy status onto its monitor.
        """
        data = event.data
        strategy_name = data["strategy_name"]

        if strategy_name in self.managers:
            manager = self.managers[strategy_name]
            manager.update_data(data)
        else:
            manager = SpreadStrategyWidget(self, self.strategy_engine, data)
            self.scroll_layout.insertWidget(0, manager)
            self.managers[strategy_name] = manager

    def remove_strategy(self, strategy_name):
        """"""
        manager = self.managers.pop(strategy_name)
        manager.deleteLater()
예제 #7
0
class LogMonitorBox(QtWidgets.QVBoxLayout):
    signal_log = QtCore.pyqtSignal(Event)

    def __init__(self, editor_manager):
        super().__init__()
        self.event_engine = editor_manager.event_engine
        self.log_monitor = None

        self.register_event()
        self.init_ui()

    def init_ui(self):

        self.log_monitor = QtWidgets.QTextEdit()
        self.log_monitor.setReadOnly(True)
        clear_button = QtWidgets.QPushButton("清空日志")
        clear_button.clicked.connect(self.log_monitor.clear)

        self.addWidget(self.log_monitor)
        self.addWidget(clear_button)

    def register_event(self):
        """"""
        self.signal_log.connect(self.process_log_event)
        self.event_engine.register(EVENT_EDITOR_LOG, self.signal_log.emit)

    def process_log_event(self, event: Event):
        """"""
        log = event.data
        msg = f"{log.time}\t{log.msg}"
        self.log_monitor.append(msg)
예제 #8
0
    def resizeEvent(self, event):
        super().resizeEvent(event)

        cr = self.contentsRect()
        self.lineNumberArea.setGeometry(
            QtCore.QRect(cr.left(), cr.top(), self.lineNumberAreaWidth(),
                         cr.height()))
예제 #9
0
파일: item.py 프로젝트: finology/vnpy
 def boundingRect(self) -> QtCore.QRectF:
     """"""
     min_volume, max_volume = self._manager.get_volume_range()
     rect: QtCore.QRectF = QtCore.QRectF(0, min_volume,
                                         len(self._bar_picutures),
                                         max_volume - min_volume)
     return rect
예제 #10
0
    def _update_label(self) -> None:
        """"""
        bottom_plot = list(self._plots.values())[-1]
        axis_width = bottom_plot.getAxis("right").width()
        axis_height = bottom_plot.getAxis("bottom").height()
        axis_offset = QtCore.QPointF(axis_width, axis_height)

        bottom_view = list(self._views.values())[-1]
        bottom_right = bottom_view.mapSceneToView(
            bottom_view.sceneBoundingRect().bottomRight() - axis_offset
        )
        # LWH 2019-10-30
        bottom_left = bottom_view.mapSceneToView(
            bottom_view.sceneBoundingRect().bottomLeft() + 3 * axis_offset
        )
        for plot_name, label in self._y_labels.items():
            if plot_name == self._plot_name:
                label.setText(str(self._y))
                label.show()
                label.setPos(bottom_right.x(), self._y)
            else:
                label.hide()

        dt = self._manager.get_datetime(self._x)
        if dt:
            self._x_label.setText(dt.strftime("%Y-%m-%d %H:%M:%S"))
            self._x_label.show()
            #self._x_label.setPos(self._x, bottom_right.y())
            self._x_label.setPos(bottom_left.x(), bottom_right.y())
            self._x_label.setAnchor((0, 0))
예제 #11
0
class SpreadLogMonitor(QtWidgets.QTextEdit):
    """
    Monitor for log data.
    """
    signal = QtCore.pyqtSignal(Event)

    def __init__(self, main_engine: MainEngine, event_engine: EventEngine):
        """"""
        super().__init__()

        self.main_engine = main_engine
        self.event_engine = event_engine

        self.init_ui()
        self.register_event()

    def init_ui(self):
        """"""
        self.setReadOnly(True)

    def register_event(self):
        """"""
        self.signal.connect(self.process_log_event)

        self.event_engine.register(EVENT_SPREAD_LOG, self.signal.emit)

    def process_log_event(self, event: Event):
        """"""
        log = event.data
        msg = f"{log.time.strftime('%H:%M:%S')}\t{log.msg}"
        self.append(msg)
예제 #12
0
파일: widget.py 프로젝트: longfeiw07/jonpy
    def _update_label(self) -> None:
        """"""
        bottom_plot = list(self._plots.values())[-1]
        axis_width = bottom_plot.getAxis("right").width()
        axis_height = bottom_plot.getAxis("bottom").height()
        axis_offset = QtCore.QPointF(axis_width + 150, axis_height + 100)

        bottom_view = list(self._views.values())[-1]
        bottom_right = bottom_view.mapSceneToView(
            bottom_view.sceneBoundingRect().bottomRight() - axis_offset
        )

        if self._x < self._manager.get_count():
            current_data_series = self._manager.get_df().iloc[self._x]
            label_text = "".join([f'{key} : {value}\n\n' for key, value in current_data_series.items()])
            for plot_name, label in self._y_labels.items():
                if plot_name == self._plot_name:
                    # label.setText(str(self._y))
                    label.setText(label_text)
                    label.show()
                    label.setPos(bottom_right.x(), self._y)
                else:
                    label.hide()

            dt = self._manager.get_datetime(self._x)
            if dt:
                self._x_label.setText(dt.strftime("%Y-%m-%d %H:%M:%S"))
                self._x_label.show()
                self._x_label.setPos(self._x, bottom_right.y())
                self._x_label.setAnchor((0, 0))
예제 #13
0
    def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture:
        """"""
        # Create objects
        volume_picture = QtGui.QPicture()
        painter = QtGui.QPainter(volume_picture)

        # Set painter color
        if bar.close_price >= bar.open_price:
            painter.setPen(self._up_pen)
            painter.setBrush(self._up_brush)
        else:
            painter.setPen(self._down_pen)
            painter.setBrush(self._down_brush)

        # Draw volume body
        rect = QtCore.QRectF(
            ix - BAR_WIDTH,
            0,
            BAR_WIDTH * 2,
            bar.volume
        )
        painter.drawRect(rect)

        # Finish
        painter.end()
        return volume_picture
예제 #14
0
    def init_ui(self):
        # 函数加载器
        loader = FunctionLoader()
        # 得到并拼凑 function.xlsx 文件路径
        running_path = Path(sys.argv[0]).parent
        function_file = running_path.joinpath("function.xlsx")
        # 加载函数描述文件
        loader.load_excel(function_file)
        # 得到实际内容
        self.function_dict = loader.contents
        self.function_names = loader.names

        # 实例化列表视图
        # 头部标题
        title = QtWidgets.QTextEdit()
        title.setPlainText("函数列表")
        title.setAlignment(QtCore.Qt.AlignCenter)
        title.setReadOnly(True)
        title_box = QtWidgets.QVBoxLayout()
        title_box.addWidget(title)

        # 初始化列表视图
        list_view = QtWidgets.QListView()
        # 修改双击触发器为空
        list_view.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
        # 实例化列表模型,添加数据
        list_model = QtCore.QStringListModel()
        # 设置模型列表视图,加载数据列表
        list_model.setStringList(self.function_names)
        # 设置列表视图的模型
        list_view.setModel(list_model)
        # 连接鼠标单击信号到 set_function_textarea 函数
        list_view.clicked.connect(self.set_function_textarea)
        # 连接鼠标双击信号到具体事件
        list_view.doubleClicked.connect(self.doubleClickedEvent)

        # 设置函数列表和函数内容窗口
        func_content = QtWidgets.QHBoxLayout()
        func_list_box = QtWidgets.QHBoxLayout()
        func_list_box.addWidget(list_view)
        self.function_textarea = QtWidgets.QTextEdit()
        self.function_textarea.setReadOnly(True)

        # 设置启动的初始值
        detail_text = self.get_function_detail(0)
        self.function_textarea.setPlainText(detail_text)

        detail_box = QtWidgets.QHBoxLayout()
        detail_box.addWidget(self.function_textarea)
        func_content.addLayout(func_list_box)
        func_content.addLayout(detail_box)
        func_content.setStretch(0, 2)
        func_content.setStretch(1, 5)

        self.addLayout(title_box)
        self.addLayout(func_content)
        self.setStretch(0, 1)
        self.setStretch(1, 19)
예제 #15
0
 def boundingRect(self) -> QtCore.QRectF:
     """"""
     min_price, max_price = self._manager.get_price_range()
     rect = QtCore.QRectF(
         0,
         min_price,
         len(self._bar_picutures),
         max_price - min_price
     )
     return rect
예제 #16
0
 def boundingRect(self) -> QtCore.QRectF:
     """"""
     min_y, max_y = self.get_y_range()
     rect = QtCore.QRectF(
         0,
         min_y,
         len(self._bar_picutures),
         max_y
     )
     return rect
예제 #17
0
파일: item.py 프로젝트: asciili/vnpy
    def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture:
        """"""
        macd_value = self.get_macd_value(ix)
        last_macd_value = self.get_macd_value(ix - 1)

        # # Create objects
        picture = QtGui.QPicture()
        painter = QtGui.QPainter(picture)

        # # Draw macd lines
        if np.isnan(macd_value[0]) or np.isnan(last_macd_value[0]):
            # print("略过macd lines0")
            pass
        else:
            end_point0 = QtCore.QPointF(ix, macd_value[0])
            start_point0 = QtCore.QPointF(ix - 1, last_macd_value[0])
            painter.setPen(self.white_pen)
            painter.drawLine(start_point0, end_point0)

        if np.isnan(macd_value[1]) or np.isnan(last_macd_value[1]):
            # print("略过macd lines1")
            pass
        else:
            end_point1 = QtCore.QPointF(ix, macd_value[1])
            start_point1 = QtCore.QPointF(ix - 1, last_macd_value[1])
            painter.setPen(self.yellow_pen)
            painter.drawLine(start_point1, end_point1)

        if not np.isnan(macd_value[2]):
            if (macd_value[2] > 0):
                painter.setPen(self.red_pen)
                painter.setBrush(pg.mkBrush(255, 0, 0))
            else:
                painter.setPen(self.green_pen)
                painter.setBrush(pg.mkBrush(0, 255, 0))
            painter.drawRect(QtCore.QRectF(ix - 0.3, 0, 0.6, macd_value[2]))
        else:
            # print("略过macd lines2")
            pass

        painter.end()
        return picture
예제 #18
0
    def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture:
        """"""
        sma_value = self.get_sma_value(ix)
        last_sma_value = self.get_sma_value(ix - 1)

        # Create objects
        picture = QtGui.QPicture()
        painter = QtGui.QPainter(picture)

        # Set painter color
        painter.setPen(self.blue_pen)

        # Draw Line
        start_point = QtCore.QPointF(ix-1, last_sma_value)
        end_point = QtCore.QPointF(ix, sma_value)
        painter.drawLine(start_point, end_point)

        # Finish
        painter.end()
        return picture
예제 #19
0
    def generatePicture(self):

        self.picture = QtGui.QPicture()
        p = QtGui.QPainter(self.picture)
        # 白色
        p.setPen(pg.mkPen('w'))
        prema5 = 0
        prema10 = 0
        prema20 = 0

        for m in self.data:

            if prema5 != 0 and self.period == 5:
                # 白色
                p.setPen(pg.mkPen('w'))
                p.setBrush(pg.mkBrush('w'))
                p.drawLine(QtCore.QPointF(m.t - 1, prema5), QtCore.QPointF(m.t, m.ma))
            prema5 = m.ma
            if prema10 != 0 and self.period == 10:
                # 青色
                p.setPen(pg.mkPen('c'))
                p.setBrush(pg.mkBrush('c'))
                p.drawLine(QtCore.QPointF(m.t - 1, prema10), QtCore.QPointF(m.t, m.ma))
            prema10 = m.ma
            if prema20 != 0 and self.period == 20:
                # 品色
                p.setPen(pg.mkPen('m'))
                p.setBrush(pg.mkBrush('m'))
                p.drawLine(QtCore.QPointF(m.t - 1, prema20), QtCore.QPointF(m.t, m.ma))
            prema20 = m.ma
        p.end()
예제 #20
0
파일: run.py 프로젝트: hun1982qhu/CTA
    def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture:
        """"""
        rsi_value = self.get_rsi_value(ix)
        last_rsi_value = self.get_rsi_value(ix - 1)

        # Create objects
        picture = QtGui.QPicture()
        painter = QtGui.QPainter(picture)

        # Draw RSI line
        painter.setPen(self.yellow_pen)

        end_point = QtCore.QPointF(ix, rsi_value)
        start_point = QtCore.QPointF(ix - 1, last_rsi_value)
        painter.drawLine(start_point, end_point)

        # Draw oversold/overbought line
        painter.setPen(self.white_pen)

        painter.drawLine(
            QtCore.QPointF(ix, 70),
            QtCore.QPointF(ix - 1, 70),
        )

        painter.drawLine(
            QtCore.QPointF(ix, 30),
            QtCore.QPointF(ix - 1, 30),
        )

        # Finish
        painter.end()
        return picture
예제 #21
0
class LogMonitor(QtWidgets.QTableWidget):
    """"""
    signal = QtCore.pyqtSignal(Event)

    def __init__(self, event_engine: EventEngine):
        """"""
        super().__init__()

        self.event_engine = event_engine

        self.init_ui()
        self.register_event()

    def init_ui(self):
        """"""
        labels = [
            "时间",
            "信息"
        ]
        self.setColumnCount(len(labels))
        self.setHorizontalHeaderLabels(labels)
        self.verticalHeader().setVisible(False)
        self.setEditTriggers(self.NoEditTriggers)

        self.verticalHeader().setSectionResizeMode(
            QtWidgets.QHeaderView.ResizeToContents
        )

        self.horizontalHeader().setSectionResizeMode(
            1,
            QtWidgets.QHeaderView.Stretch
        )
        self.setWordWrap(True)

    def register_event(self):
        """"""
        self.signal.connect(self.process_log_event)

        self.event_engine.register(EVENT_ALGO_LOG, self.signal.emit)

    def process_log_event(self, event):
        """"""
        msg = event.data
        timestamp = datetime.now().strftime("%H:%M:%S")

        timestamp_cell = QtWidgets.QTableWidgetItem(timestamp)
        msg_cell = QtWidgets.QTableWidgetItem(msg)

        self.insertRow(0)
        self.setItem(0, 0, timestamp_cell)
        self.setItem(0, 1, msg_cell)
예제 #22
0
    def init_ui(self):
        # 实例化列表视图
        title = QtWidgets.QTextEdit()
        title.setPlainText("已存策略")
        title.setAlignment(QtCore.Qt.AlignCenter)
        title.setReadOnly(True)
        title_box = QtWidgets.QVBoxLayout()
        title_box.addWidget(title)

        self.strategy_list_view = ListView()
        # 实例化列表模型,添加数据
        self.strategy_list_model = QtCore.QStringListModel()
        # item 单击事件
        self.strategy_list_view.clicked.connect(self.set_script_textarea)
        # item 双击事件
        self.strategy_list_view.doubleClicked.connect(
            self.double_clicked_event)
        # 取消双击触发器
        self.strategy_list_view.setEditTriggers(
            QtWidgets.QAbstractItemView.NoEditTriggers)
        # 连接删除动作
        self.strategy_list_view.connect_delete_action(self.delete_action)
        # 连接重命名动作
        self.strategy_list_view.connect_rename_action(self.rename_action)

        # 初始化策略列表
        self.update_list()

        # 设置列表和内容窗口
        file_content = QtWidgets.QHBoxLayout()
        file_list_box = QtWidgets.QHBoxLayout()
        file_list_box.addWidget(self.strategy_list_view)
        self.script_textarea = QtWidgets.QTextEdit()
        self.script_textarea.setReadOnly(True)

        # 设置启动的初始值
        script_content = self.get_script_content(0)
        self.script_textarea.setPlainText(script_content)

        detail_box = QtWidgets.QHBoxLayout()
        detail_box.addWidget(self.script_textarea)

        file_content.addLayout(file_list_box)
        file_content.addLayout(detail_box)
        file_content.setStretch(0, 2)
        file_content.setStretch(1, 5)

        self.addLayout(title_box)
        self.addLayout(file_content)
        self.setStretch(0, 1)
        self.setStretch(1, 19)
예제 #23
0
    def _mouse_moved(self, evt: tuple) -> None:
        """
        Callback function when mouse is moved.
        """
        if not self._manager.get_count():
            return

        # First get current mouse point
        pos = evt

        for plot_name, view in self._views.items():
            rect = view.sceneBoundingRect()

            if rect.contains(pos):
                mouse_point = view.mapSceneToView(pos)
                self._x = to_int(mouse_point.x())
                self._y = mouse_point.y()
                self._plot_name = plot_name
                break

        # Then update cursor component
        self._update_line()
        self._update_label()
        self.update_info()

        if self.dt_ix:
            #print(self.dt_ix)
            for plot_name, plot in self._plots.items():
                #info = self._infos[plot_name]
                # print(plot_info_text)
                try:
                    text = ""
                    for k,v in self.dt_ix.items():
                        text += k+":"+str(v[int(self._x)])+"\n"
                    self.inf.setText(text)
                    #self.inf.setText("bkhigh:"+self.dt_ix[int(self._x)])
                    self.inf.show()
                    #print(plot_name)
                    view = self._views[plot_name]
                    coodinate = QtCore.QPointF(100,0)
                #view = self._views["candle"]
                    top_left = view.mapSceneToView(view.sceneBoundingRect().topLeft()+coodinate)
                    # print(view.sceneBoundingRect())
                    # print(view.sceneBoundingRect().topLeft())
                    # print(top_left)
                    #print(self._x)

                    self.inf.setPos(top_left)
                except:
                    print("该K线无数据")
예제 #24
0
    def interval_combo_changed(self):
        interval = InvestmentInterval(self.interval_combo.currentText())
        today = QtCore.QDate.currentDate()
        yesterday = today.addDays(-1)
        current_month_first_day = QtCore.QDate(today.year(), today.month(), 1)
        last_month_day = today.addMonths(-1)
        last_month_first_day = QtCore.QDate(last_month_day.year(),
                                            last_month_day.month(), 1)
        last_month_last_day = current_month_first_day.addDays(-1)

        interval_date = {
            InvestmentInterval.NearlyMonth: (today.addMonths(-1), today),
            InvestmentInterval.NearlyWeek: (today.addDays(-7), today),
            InvestmentInterval.CurrentMonth: (current_month_first_day, today),
            InvestmentInterval.PreMonth:
            (last_month_first_day, last_month_last_day),
            InvestmentInterval.Today: (today, today),
            InvestmentInterval.Yesterday: (yesterday, yesterday)
        }

        start_date, end_date = interval_date.get(interval)
        self.start_date_edit.setDate(start_date)
        self.end_date_edit.setDate(end_date)
예제 #25
0
파일: item.py 프로젝트: asciili/vnpy
    def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture:
        """"""
        last_bar = self._manager.get_bar(ix - 1)

        # Create objects
        picture = QtGui.QPicture()
        painter = QtGui.QPainter(picture)

        # Set painter color
        painter.setPen(self.white_pen)

        # Draw Line
        end_point = QtCore.QPointF(ix, bar.close_price)

        if last_bar:
            start_point = QtCore.QPointF(ix - 1, last_bar.close_price)
        else:
            start_point = end_point

        painter.drawLine(start_point, end_point)

        # Finish
        painter.end()
        return picture
예제 #26
0
파일: widget.py 프로젝트: sdywcd/vnpy-1
    def __init__(self, engine: ManagerEngine, parent=None):
        """"""
        super().__init__()

        self.engine = engine

        self.setWindowTitle("下载历史数据")
        self.setFixedWidth(300)

        self.setWindowFlags(
            (self.windowFlags() | QtCore.Qt.CustomizeWindowHint)
            & ~QtCore.Qt.WindowMaximizeButtonHint)

        self.symbol_edit = QtWidgets.QLineEdit()

        self.exchange_combo = QtWidgets.QComboBox()
        for i in Exchange:
            self.exchange_combo.addItem(str(i.name), i)

        self.interval_combo = QtWidgets.QComboBox()
        for i in Interval:
            self.interval_combo.addItem(str(i.name), i)

        end_dt = datetime.now()
        start_dt = end_dt - timedelta(days=3 * 365)

        self.start_date_edit = QtWidgets.QDateEdit(
            QtCore.QDate(
                start_dt.year,
                start_dt.month,
                start_dt.day
            )
        )

        button = QtWidgets.QPushButton("下载")
        button.clicked.connect(self.download)

        form = QtWidgets.QFormLayout()
        form.addRow("代码", self.symbol_edit)
        form.addRow("交易所", self.exchange_combo)
        form.addRow("周期", self.interval_combo)
        form.addRow("开始日期", self.start_date_edit)
        form.addRow(button)

        self.setLayout(form)
예제 #27
0
    def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture:
        """"""
        boll_value = self.get_boll_value(ix)
        last_boll_value = self.get_boll_value(ix - 1)


        # Create objects
        picture = QtGui.QPicture()
        painter = QtGui.QPainter(picture)

        # Set painter color
        painter.setPen(self.blue_pen)

        if last_boll_value==0:
            # Draw Line
            start_point = QtCore.QPointF(0, 0)
            end_point = QtCore.QPointF(0, 0)
            painter.drawLine(start_point, end_point)
        else:
            # Draw Line
            start_point = QtCore.QPointF(ix-1, last_boll_value["upper"])
            end_point = QtCore.QPointF(ix, boll_value["upper"])
            painter.drawLine(start_point, end_point)
            
            start_point = QtCore.QPointF(ix-1, last_boll_value["lower"])
            end_point = QtCore.QPointF(ix, boll_value["lower"])
            painter.drawLine(start_point, end_point)

            start_point = QtCore.QPointF(ix-1, last_boll_value["middle"])
            end_point = QtCore.QPointF(ix, boll_value["middle"])
            painter.setPen(self.white_pen)
            painter.drawLine(start_point, end_point)
            

        
        # Finish
        painter.end()
        return picture
예제 #28
0
파일: item.py 프로젝트: asciili/vnpy
    def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture:
        """"""
        rsi_value = self.values[ix]
        last_rsi_value = self.values[ix - 1]

        # Create objects
        picture = QtGui.QPicture()
        painter = QtGui.QPainter(picture)

        # Draw RSI line
        painter.setPen(self.yellow_pen)

        if np.isnan(last_rsi_value) or np.isnan(rsi_value):
            # print(ix - 1, last_rsi_value,ix, rsi_value,)
            pass
        else:
            end_point = QtCore.QPointF(ix, rsi_value)
            start_point = QtCore.QPointF(ix - 1, last_rsi_value)
            painter.drawLine(start_point, end_point)

        # Draw oversold/overbought line
        painter.setPen(self.white_pen)

        painter.drawLine(
            QtCore.QPointF(ix, 70),
            QtCore.QPointF(ix - 1, 70),
        )

        painter.drawLine(
            QtCore.QPointF(ix, 30),
            QtCore.QPointF(ix - 1, 30),
        )

        # Finish
        painter.end()
        return picture
예제 #29
0
        k.open_interest = 0
        k.open_price = data.open[i]
        k.close_price = data.close[i]
        k.high_price = data.high[i]
        k.low_price = data.low[i]
        bars.append(k)
    print('Over')
    widget = ChartWidget()
    widget.add_plot("candle", hide_x_axis=True)
    widget.add_plot("volume", maximum_height=200)
    widget.add_item(CandleItem, "candle", "candle")
    widget.add_item(VolumeItem, "volume", "volume")
    widget.add_cursor()

    n = 1000
    history = bars[:n]
    new_data = bars[n:]

    widget.update_history(history)

    def update_bar():
        bar = new_data.pop(0)
        widget.update_bar(bar)

    timer = QtCore.QTimer()
    timer.timeout.connect(update_bar)
    timer.start(100)

    widget.show()
    app.exec_()
예제 #30
0
파일: widget.py 프로젝트: ajmal017/jonpy
class OptionManualTrader(QtWidgets.QWidget):
    """"""
    signal_tick = QtCore.pyqtSignal(TickData)

    def __init__(self, option_engine: OptionEngine, portfolio_name: str):
        """"""
        super().__init__()

        self.option_engine = option_engine
        self.main_engine: MainEngine = option_engine.main_engine
        self.event_engine: EventEngine = option_engine.event_engine

        self.contracts: Dict[str, ContractData] = {}
        self.vt_symbol = ""

        self.init_ui()
        self.init_contracts()

    def init_ui(self) -> None:
        """"""
        self.setWindowTitle("期权交易")

        # Trading Area
        self.symbol_line = QtWidgets.QLineEdit()
        self.symbol_line.returnPressed.connect(self._update_symbol)

        float_validator = QtGui.QDoubleValidator()
        float_validator.setBottom(0)

        self.price_line = QtWidgets.QLineEdit()
        self.price_line.setValidator(float_validator)

        int_validator = QtGui.QIntValidator()
        int_validator.setBottom(0)

        self.volume_line = QtWidgets.QLineEdit()
        self.volume_line.setValidator(int_validator)

        self.direction_combo = QtWidgets.QComboBox()
        self.direction_combo.addItems(
            [Direction.LONG.value, Direction.SHORT.value])

        self.offset_combo = QtWidgets.QComboBox()
        self.offset_combo.addItems([Offset.OPEN.value, Offset.CLOSE.value])

        order_button = QtWidgets.QPushButton("委托")
        order_button.clicked.connect(self.send_order)

        cancel_button = QtWidgets.QPushButton("全撤")
        cancel_button.clicked.connect(self.cancel_all)

        form1 = QtWidgets.QFormLayout()
        form1.addRow("代码", self.symbol_line)
        form1.addRow("方向", self.direction_combo)
        form1.addRow("开平", self.offset_combo)
        form1.addRow("价格", self.price_line)
        form1.addRow("数量", self.volume_line)
        form1.addRow(order_button)
        form1.addRow(cancel_button)

        # Depth Area
        bid_color = "rgb(255,174,201)"
        ask_color = "rgb(160,255,160)"

        self.bp1_label = self.create_label(bid_color)
        self.bp2_label = self.create_label(bid_color)
        self.bp3_label = self.create_label(bid_color)
        self.bp4_label = self.create_label(bid_color)
        self.bp5_label = self.create_label(bid_color)

        self.bv1_label = self.create_label(bid_color,
                                           alignment=QtCore.Qt.AlignRight)
        self.bv2_label = self.create_label(bid_color,
                                           alignment=QtCore.Qt.AlignRight)
        self.bv3_label = self.create_label(bid_color,
                                           alignment=QtCore.Qt.AlignRight)
        self.bv4_label = self.create_label(bid_color,
                                           alignment=QtCore.Qt.AlignRight)
        self.bv5_label = self.create_label(bid_color,
                                           alignment=QtCore.Qt.AlignRight)

        self.ap1_label = self.create_label(ask_color)
        self.ap2_label = self.create_label(ask_color)
        self.ap3_label = self.create_label(ask_color)
        self.ap4_label = self.create_label(ask_color)
        self.ap5_label = self.create_label(ask_color)

        self.av1_label = self.create_label(ask_color,
                                           alignment=QtCore.Qt.AlignRight)
        self.av2_label = self.create_label(ask_color,
                                           alignment=QtCore.Qt.AlignRight)
        self.av3_label = self.create_label(ask_color,
                                           alignment=QtCore.Qt.AlignRight)
        self.av4_label = self.create_label(ask_color,
                                           alignment=QtCore.Qt.AlignRight)
        self.av5_label = self.create_label(ask_color,
                                           alignment=QtCore.Qt.AlignRight)

        self.lp_label = self.create_label()
        self.return_label = self.create_label(alignment=QtCore.Qt.AlignRight)

        min_width = 70
        self.lp_label.setMinimumWidth(min_width)
        self.return_label.setMinimumWidth(min_width)

        form2 = QtWidgets.QFormLayout()
        form2.addRow(self.ap5_label, self.av5_label)
        form2.addRow(self.ap4_label, self.av4_label)
        form2.addRow(self.ap3_label, self.av3_label)
        form2.addRow(self.ap2_label, self.av2_label)
        form2.addRow(self.ap1_label, self.av1_label)
        form2.addRow(self.lp_label, self.return_label)
        form2.addRow(self.bp1_label, self.bv1_label)
        form2.addRow(self.bp2_label, self.bv2_label)
        form2.addRow(self.bp3_label, self.bv3_label)
        form2.addRow(self.bp4_label, self.bv4_label)
        form2.addRow(self.bp5_label, self.bv5_label)

        # Set layout
        hbox = QtWidgets.QHBoxLayout()
        hbox.addLayout(form1)
        hbox.addLayout(form2)
        self.setLayout(hbox)

    def init_contracts(self) -> None:
        """"""
        contracts = self.main_engine.get_all_contracts()
        for contract in contracts:
            self.contracts[contract.symbol] = contract

    def connect_signal(self) -> None:
        """"""
        self.signal_tick.connect(self.update_tick)

    def send_order(self) -> None:
        """"""
        symbol = self.symbol_line.text()
        contract = self.contracts.get(symbol, None)
        if not contract:
            return

        price_text = self.price_line.text()
        volume_text = self.volume_line.text()

        if not price_text or not volume_text:
            return

        price = float(price_text)
        volume = int(volume_text)
        direction = Direction(self.direction_combo.currentText())
        offset = Offset(self.offset_combo.currentText())

        req = OrderRequest(symbol=contract.symbol,
                           exchange=contract.exchange,
                           direction=direction,
                           type=OrderType.LIMIT,
                           offset=offset,
                           volume=volume,
                           price=price)
        self.main_engine.send_order(req, contract.gateway_name)

    def cancel_all(self) -> None:
        """"""
        for order in self.main_engine.get_all_active_orders():
            req = order.create_cancel_request()
            self.main_engine.cancel_order(req, order.gateway_name)

    def update_symbol(self, cell: MonitorCell) -> None:
        """"""
        if not cell.vt_symbol:
            return

        symbol = cell.vt_symbol.split(".")[0]
        self.symbol_line.setText(symbol)
        self._update_symbol()

    def _update_symbol(self) -> None:
        """"""
        symbol = self.symbol_line.text()
        contract = self.contracts.get(symbol, None)

        if contract and contract.vt_symbol == self.vt_symbol:
            return

        if self.vt_symbol:
            self.event_engine.unregister(EVENT_TICK + self.vt_symbol,
                                         self.process_tick_event)
            self.clear_data()
            self.vt_symbol = ""

        if not contract:
            return

        vt_symbol = contract.vt_symbol
        self.vt_symbol = vt_symbol

        tick = self.main_engine.get_tick(vt_symbol)
        if tick:
            self.update_tick(tick)

        self.event_engine.unregister(EVENT_TICK + vt_symbol,
                                     self.process_tick_event)

    def create_label(self,
                     color: str = "",
                     alignment: int = QtCore.Qt.AlignLeft) -> QtWidgets.QLabel:
        """
        Create label with certain font color.
        """
        label = QtWidgets.QLabel("-")
        if color:
            label.setStyleSheet(f"color:{color}")
        label.setAlignment(alignment)
        return label

    def process_tick_event(self, event: Event) -> None:
        """"""
        tick = event.data

        if tick.vt_symbol != self.vt_symbol:
            return

        self.signal_tick.emit(tick)

    def update_tick(self, tick: TickData) -> None:
        """"""
        self.lp_label.setText(str(tick.last_price))
        self.bp1_label.setText(str(tick.bid_price_1))
        self.bv1_label.setText(str(tick.bid_volume_1))
        self.ap1_label.setText(str(tick.ask_price_1))
        self.av1_label.setText(str(tick.ask_volume_1))

        if tick.pre_close:
            r = (tick.last_price / tick.pre_close - 1) * 100
            self.return_label.setText(f"{r:.2f}%")

        if tick.bid_price_2:
            self.bp2_label.setText(str(tick.bid_price_2))
            self.bv2_label.setText(str(tick.bid_volume_2))
            self.ap2_label.setText(str(tick.ask_price_2))
            self.av2_label.setText(str(tick.ask_volume_2))

            self.bp3_label.setText(str(tick.bid_price_3))
            self.bv3_label.setText(str(tick.bid_volume_3))
            self.ap3_label.setText(str(tick.ask_price_3))
            self.av3_label.setText(str(tick.ask_volume_3))

            self.bp4_label.setText(str(tick.bid_price_4))
            self.bv4_label.setText(str(tick.bid_volume_4))
            self.ap4_label.setText(str(tick.ask_price_4))
            self.av4_label.setText(str(tick.ask_volume_4))

            self.bp5_label.setText(str(tick.bid_price_5))
            self.bv5_label.setText(str(tick.bid_volume_5))
            self.ap5_label.setText(str(tick.ask_price_5))
            self.av5_label.setText(str(tick.ask_volume_5))

    def clear_data(self) -> None:
        """"""
        self.lp_label.setText("-")
        self.return_label.setText("-")
        self.bp1_label.setText("-")
        self.bv1_label.setText("-")
        self.ap1_label.setText("-")
        self.av1_label.setText("-")

        self.bp2_label.setText("-")
        self.bv2_label.setText("-")
        self.ap2_label.setText("-")
        self.av2_label.setText("-")

        self.bp3_label.setText("-")
        self.bv3_label.setText("-")
        self.ap3_label.setText("-")
        self.av3_label.setText("-")

        self.bp4_label.setText("-")
        self.bv4_label.setText("-")
        self.ap4_label.setText("-")
        self.av4_label.setText("-")

        self.bp5_label.setText("-")
        self.bv5_label.setText("-")
        self.ap5_label.setText("-")
        self.av5_label.setText("-")