Created
July 29, 2021 23:28
-
-
Save callTx/1b9982ba064430d37cd50735c43a3142 to your computer and use it in GitHub Desktop.
A Copy Trading solution which allows a Trader offers their trades position through a ZeroMQ Publisher - Subscriber architecture
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
# Form implementation generated from reading ui file 'vizion_layout.ui' | |
# | |
# Created by: PyQt5 UI code generator 5.13.0 | |
# | |
# WARNING! All changes made in this file will be lost! | |
from PyQt5 import QtCore, QtGui, QtWidgets,QtTest | |
#========= importa login_diag | |
from login_diagV026 import Ui_Dialog | |
#===== Log ====== | |
import logging | |
import io | |
#==== import zeromq ======== | |
import zmq | |
_CONTEXT = None | |
_SOCKET_REQ = None | |
_SOCKET_SUB = None | |
#======== Variáveis globais de credenciais | |
_client_id = None | |
_session_id = None | |
_token_uid = None | |
_tipo_cliente = None | |
_TIPO_CONTA_DEMO = "Conta Demo " | |
_TIPO_CONTA_REAL = "Conta Real " | |
_valor_entrada = None | |
_stop_gain = None | |
_stop_loss = None | |
_stop_gain_atingido = False | |
_stop_loss_atingido = False | |
_isLocal = False | |
_isConnected = False | |
_client = None | |
_trader_id = [] | |
_trader_idV2 = None | |
_email_broker = None | |
_senha_broker = None | |
_closed_ws_connection = False | |
_click_btn_action = False | |
class Ui_MainWindow(object): | |
def setupUi(self, MainWindow): | |
MainWindow.setObjectName("MainWindow") | |
MainWindow.setWindowModality(QtCore.Qt.WindowModal) | |
MainWindow.resize(1162, 769) | |
icon = QtGui.QIcon() | |
icon.addPixmap(QtGui.QPixmap(":/logo_gains/cjf_logo.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | |
MainWindow.setWindowIcon(icon) | |
MainWindow.setStyleSheet("gridline-color: rgb(173, 36, 166);\n" | |
"\n" | |
"") | |
MainWindow.setDocumentMode(False) | |
MainWindow.setTabShape(QtWidgets.QTabWidget.Rounded) | |
self.centralwidget = QtWidgets.QWidget(MainWindow) | |
self.centralwidget.setObjectName("centralwidget") | |
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget) | |
self.verticalLayout_2.setObjectName("verticalLayout_2") | |
self.verticalLayout = QtWidgets.QVBoxLayout() | |
self.verticalLayout.setObjectName("verticalLayout") | |
self.h_layout_balanco = QtWidgets.QHBoxLayout() | |
self.h_layout_balanco.setObjectName("h_layout_balanco") | |
self.nome_perfil = QtWidgets.QLabel(self.centralwidget) | |
self.nome_perfil.setObjectName("nome_perfil") | |
self.h_layout_balanco.addWidget(self.nome_perfil) | |
self.nome_perfil_valor = QtWidgets.QLabel(self.centralwidget) | |
self.nome_perfil_valor.setObjectName("nome_perfil_valor") | |
self.h_layout_balanco.addWidget(self.nome_perfil_valor) | |
spacerItem = QtWidgets.QSpacerItem(630, 0, QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Minimum) | |
self.h_layout_balanco.addItem(spacerItem) | |
self.balanco = QtWidgets.QLabel(self.centralwidget) | |
self.balanco.setObjectName("balanco") | |
self.h_layout_balanco.addWidget(self.balanco, 0, QtCore.Qt.AlignRight|QtCore.Qt.AlignTop) | |
self.balanco_valor = QtWidgets.QLabel(self.centralwidget) | |
self.balanco_valor.setObjectName("balanco_valor") | |
self.h_layout_balanco.addWidget(self.balanco_valor, 0, QtCore.Qt.AlignRight|QtCore.Qt.AlignTop) | |
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) | |
self.h_layout_balanco.addItem(spacerItem1) | |
self.verticalLayout.addLayout(self.h_layout_balanco) | |
self.line = QtWidgets.QFrame(self.centralwidget) | |
self.line.setFrameShape(QtWidgets.QFrame.HLine) | |
self.line.setFrameShadow(QtWidgets.QFrame.Sunken) | |
self.line.setObjectName("line") | |
self.verticalLayout.addWidget(self.line) | |
self.h_layout_tipo_conta = QtWidgets.QHBoxLayout() | |
self.h_layout_tipo_conta.setObjectName("h_layout_tipo_conta") | |
self.id_perfil_corretora = QtWidgets.QLabel(self.centralwidget) | |
self.id_perfil_corretora.setObjectName("id_perfil_corretora") | |
self.h_layout_tipo_conta.addWidget(self.id_perfil_corretora) | |
self.id_perfil_corretora_valor = QtWidgets.QLabel(self.centralwidget) | |
self.id_perfil_corretora_valor.setObjectName("id_perfil_corretora_valor") | |
self.h_layout_tipo_conta.addWidget(self.id_perfil_corretora_valor) | |
spacerItem2 = QtWidgets.QSpacerItem(600, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) | |
self.h_layout_tipo_conta.addItem(spacerItem2) | |
self.cb_tipo_conta = QtWidgets.QComboBox(self.centralwidget) | |
self.cb_tipo_conta.setEnabled(False) | |
self.cb_tipo_conta.setObjectName("cb_tipo_conta") | |
self.cb_tipo_conta.addItem("") | |
self.cb_tipo_conta.addItem("") | |
self.cb_tipo_conta.addItem("") | |
self.h_layout_tipo_conta.addWidget(self.cb_tipo_conta) | |
self.verticalLayout.addLayout(self.h_layout_tipo_conta) | |
self.v_layout_centro = QtWidgets.QVBoxLayout() | |
self.v_layout_centro.setObjectName("v_layout_centro") | |
self.line_7 = QtWidgets.QFrame(self.centralwidget) | |
self.line_7.setFrameShape(QtWidgets.QFrame.HLine) | |
self.line_7.setFrameShadow(QtWidgets.QFrame.Sunken) | |
self.line_7.setObjectName("line_7") | |
self.v_layout_centro.addWidget(self.line_7) | |
self.horizontalLayout_4 = QtWidgets.QHBoxLayout() | |
self.horizontalLayout_4.setObjectName("horizontalLayout_4") | |
self.v_layout_centro.addLayout(self.horizontalLayout_4) | |
self.h_layout_tabs = QtWidgets.QHBoxLayout() | |
self.h_layout_tabs.setObjectName("h_layout_tabs") | |
self.tabs = QtWidgets.QTabWidget(self.centralwidget) | |
self.tabs.setEnabled(True) | |
self.tabs.setMouseTracking(False) | |
self.tabs.setAutoFillBackground(False) | |
self.tabs.setStyleSheet("") | |
self.tabs.setObjectName("tabs") | |
self.iqoption_login_tab = QtWidgets.QWidget() | |
self.iqoption_login_tab.setEnabled(False) | |
self.iqoption_login_tab.setStyleSheet("") | |
self.iqoption_login_tab.setObjectName("iqoption_login_tab") | |
self.gridLayout = QtWidgets.QGridLayout(self.iqoption_login_tab) | |
self.gridLayout.setObjectName("gridLayout") | |
self.grid_login_2 = QtWidgets.QGridLayout() | |
self.grid_login_2.setObjectName("grid_login_2") | |
self.frame_2 = QtWidgets.QFrame(self.iqoption_login_tab) | |
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) | |
sizePolicy.setHorizontalStretch(0) | |
sizePolicy.setVerticalStretch(0) | |
sizePolicy.setHeightForWidth(self.frame_2.sizePolicy().hasHeightForWidth()) | |
self.frame_2.setSizePolicy(sizePolicy) | |
self.frame_2.setMaximumSize(QtCore.QSize(427, 147)) | |
self.frame_2.setStyleSheet("") | |
self.frame_2.setFrameShape(QtWidgets.QFrame.Box) | |
self.frame_2.setFrameShadow(QtWidgets.QFrame.Sunken) | |
self.frame_2.setObjectName("frame_2") | |
self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.frame_2) | |
self.verticalLayout_5.setObjectName("verticalLayout_5") | |
self.verticalLayout_6 = QtWidgets.QVBoxLayout() | |
self.verticalLayout_6.setObjectName("verticalLayout_6") | |
self.horizontalLayout_11 = QtWidgets.QHBoxLayout() | |
self.horizontalLayout_11.setObjectName("horizontalLayout_11") | |
self.lb_entrar_2 = QtWidgets.QLabel(self.frame_2) | |
self.lb_entrar_2.setObjectName("lb_entrar_2") | |
self.horizontalLayout_11.addWidget(self.lb_entrar_2) | |
self.fld_login_2 = QtWidgets.QLineEdit(self.frame_2) | |
self.fld_login_2.setMaxLength(32767) | |
self.fld_login_2.setFrame(True) | |
self.fld_login_2.setDragEnabled(False) | |
self.fld_login_2.setReadOnly(False) | |
self.fld_login_2.setClearButtonEnabled(True) | |
self.fld_login_2.setObjectName("fld_login_2") | |
self.horizontalLayout_11.addWidget(self.fld_login_2) | |
spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) | |
self.horizontalLayout_11.addItem(spacerItem3) | |
self.verticalLayout_6.addLayout(self.horizontalLayout_11) | |
self.horizontalLayout_12 = QtWidgets.QHBoxLayout() | |
self.horizontalLayout_12.setObjectName("horizontalLayout_12") | |
self.lb_senha_2 = QtWidgets.QLabel(self.frame_2) | |
self.lb_senha_2.setObjectName("lb_senha_2") | |
self.horizontalLayout_12.addWidget(self.lb_senha_2, 0, QtCore.Qt.AlignVCenter) | |
self.fld_senha_2 = QtWidgets.QLineEdit(self.frame_2) | |
self.fld_senha_2.setEchoMode(QtWidgets.QLineEdit.Password) | |
self.fld_senha_2.setClearButtonEnabled(True) | |
self.fld_senha_2.setObjectName("fld_senha_2") | |
self.horizontalLayout_12.addWidget(self.fld_senha_2, 0, QtCore.Qt.AlignVCenter) | |
spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) | |
self.horizontalLayout_12.addItem(spacerItem4) | |
self.verticalLayout_6.addLayout(self.horizontalLayout_12) | |
self.horizontalLayout_13 = QtWidgets.QHBoxLayout() | |
self.horizontalLayout_13.setObjectName("horizontalLayout_13") | |
self.lb_nao_tem_conta_2 = QtWidgets.QLabel(self.frame_2) | |
self.lb_nao_tem_conta_2.setObjectName("lb_nao_tem_conta_2") | |
self.horizontalLayout_13.addWidget(self.lb_nao_tem_conta_2, 0, QtCore.Qt.AlignRight) | |
self.lb_criar_uma_agora_2 = QtWidgets.QLabel(self.frame_2) | |
self.lb_criar_uma_agora_2.setObjectName("lb_criar_uma_agora_2") | |
self.horizontalLayout_13.addWidget(self.lb_criar_uma_agora_2) | |
self.verticalLayout_6.addLayout(self.horizontalLayout_13) | |
self.btn_entrar_2 = QtWidgets.QPushButton(self.frame_2) | |
self.btn_entrar_2.setObjectName("btn_entrar_2") | |
self.verticalLayout_6.addWidget(self.btn_entrar_2, 0, QtCore.Qt.AlignRight) | |
self.verticalLayout_5.addLayout(self.verticalLayout_6) | |
self.grid_login_2.addWidget(self.frame_2, 5, 1, 1, 1) | |
self.aviso_login = QtWidgets.QLabel(self.iqoption_login_tab) | |
self.aviso_login.setObjectName("aviso_login") | |
self.grid_login_2.addWidget(self.aviso_login, 6, 1, 1, 1, QtCore.Qt.AlignHCenter) | |
spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) | |
self.grid_login_2.addItem(spacerItem5, 0, 2, 1, 1) | |
self.lb_vizion_software_terceiros_2 = QtWidgets.QLabel(self.iqoption_login_tab) | |
self.lb_vizion_software_terceiros_2.setObjectName("lb_vizion_software_terceiros_2") | |
self.grid_login_2.addWidget(self.lb_vizion_software_terceiros_2, 8, 1, 1, 1, QtCore.Qt.AlignHCenter) | |
self.lb_entre_informacoes_2 = QtWidgets.QLabel(self.iqoption_login_tab) | |
self.lb_entre_informacoes_2.setObjectName("lb_entre_informacoes_2") | |
self.grid_login_2.addWidget(self.lb_entre_informacoes_2, 4, 1, 1, 1) | |
spacerItem6 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) | |
self.grid_login_2.addItem(spacerItem6, 0, 0, 1, 1) | |
self.gridLayout_3 = QtWidgets.QGridLayout() | |
self.gridLayout_3.setObjectName("gridLayout_3") | |
self.grid_login_2.addLayout(self.gridLayout_3, 1, 1, 1, 1) | |
self.iqoption_logo = QtWidgets.QLabel(self.iqoption_login_tab) | |
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding) | |
sizePolicy.setHorizontalStretch(0) | |
sizePolicy.setVerticalStretch(0) | |
sizePolicy.setHeightForWidth(self.iqoption_logo.sizePolicy().hasHeightForWidth()) | |
self.iqoption_logo.setSizePolicy(sizePolicy) | |
self.iqoption_logo.setMinimumSize(QtCore.QSize(427, 124)) | |
self.iqoption_logo.setMaximumSize(QtCore.QSize(427, 124)) | |
self.iqoption_logo.setStyleSheet("image: url(:/logo/iqoption_logo_3.png);") | |
self.iqoption_logo.setText("") | |
self.iqoption_logo.setObjectName("iqoption_logo") | |
self.grid_login_2.addWidget(self.iqoption_logo, 3, 1, 1, 1) | |
spacerItem7 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) | |
self.grid_login_2.addItem(spacerItem7, 7, 1, 1, 1) | |
spacerItem8 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) | |
self.grid_login_2.addItem(spacerItem8, 2, 1, 1, 1) | |
spacerItem9 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) | |
self.grid_login_2.addItem(spacerItem9, 9, 1, 1, 1) | |
self.gridLayout.addLayout(self.grid_login_2, 0, 0, 1, 1) | |
self.progressBar = QtWidgets.QProgressBar(self.iqoption_login_tab) | |
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) | |
sizePolicy.setHorizontalStretch(0) | |
sizePolicy.setVerticalStretch(0) | |
sizePolicy.setHeightForWidth(self.progressBar.sizePolicy().hasHeightForWidth()) | |
self.progressBar.setSizePolicy(sizePolicy) | |
self.progressBar.setAutoFillBackground(False) | |
self.progressBar.setProperty("value", 99) | |
self.progressBar.setTextVisible(False) | |
self.progressBar.setObjectName("progressBar") | |
self.gridLayout.addWidget(self.progressBar, 1, 0, 1, 1, QtCore.Qt.AlignRight) | |
self.tabs.addTab(self.iqoption_login_tab, "") | |
self.configuracoes_tab = QtWidgets.QWidget() | |
self.configuracoes_tab.setEnabled(False) | |
self.configuracoes_tab.setObjectName("configuracoes_tab") | |
self.gridLayout_6 = QtWidgets.QGridLayout(self.configuracoes_tab) | |
self.gridLayout_6.setObjectName("gridLayout_6") | |
self.txt_browser_log_configuracoes = QtWidgets.QTextBrowser(self.configuracoes_tab) | |
self.txt_browser_log_configuracoes.setObjectName("txt_browser_log_configuracoes") | |
self.gridLayout_6.addWidget(self.txt_browser_log_configuracoes, 1, 1, 1, 1) | |
self.grid_configuracoes = QtWidgets.QGridLayout() | |
self.grid_configuracoes.setObjectName("grid_configuracoes") | |
self.verticalLayout_9 = QtWidgets.QVBoxLayout() | |
self.verticalLayout_9.setObjectName("verticalLayout_9") | |
spacerItem10 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) | |
self.verticalLayout_9.addItem(spacerItem10) | |
self.gerenciamento = QtWidgets.QLabel(self.configuracoes_tab) | |
self.gerenciamento.setObjectName("gerenciamento") | |
self.verticalLayout_9.addWidget(self.gerenciamento) | |
self.h_layout_valor_entrada = QtWidgets.QHBoxLayout() | |
self.h_layout_valor_entrada.setObjectName("h_layout_valor_entrada") | |
spacerItem11 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) | |
self.h_layout_valor_entrada.addItem(spacerItem11) | |
self.valor_entrada = QtWidgets.QLabel(self.configuracoes_tab) | |
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) | |
sizePolicy.setHorizontalStretch(0) | |
sizePolicy.setVerticalStretch(0) | |
sizePolicy.setHeightForWidth(self.valor_entrada.sizePolicy().hasHeightForWidth()) | |
self.valor_entrada.setSizePolicy(sizePolicy) | |
self.valor_entrada.setObjectName("valor_entrada") | |
self.h_layout_valor_entrada.addWidget(self.valor_entrada) | |
self.fld_valor_entrada = QtWidgets.QLineEdit(self.configuracoes_tab) | |
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) | |
sizePolicy.setHorizontalStretch(0) | |
sizePolicy.setVerticalStretch(0) | |
sizePolicy.setHeightForWidth(self.fld_valor_entrada.sizePolicy().hasHeightForWidth()) | |
self.fld_valor_entrada.setSizePolicy(sizePolicy) | |
self.fld_valor_entrada.setObjectName("fld_valor_entrada") | |
self.h_layout_valor_entrada.addWidget(self.fld_valor_entrada) | |
self.combo_box_valor_entrada = QtWidgets.QComboBox(self.configuracoes_tab) | |
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) | |
sizePolicy.setHorizontalStretch(0) | |
sizePolicy.setVerticalStretch(0) | |
sizePolicy.setHeightForWidth(self.combo_box_valor_entrada.sizePolicy().hasHeightForWidth()) | |
self.combo_box_valor_entrada.setSizePolicy(sizePolicy) | |
self.combo_box_valor_entrada.setObjectName("combo_box_valor_entrada") | |
self.combo_box_valor_entrada.addItem("") | |
self.combo_box_valor_entrada.addItem("") | |
self.h_layout_valor_entrada.addWidget(self.combo_box_valor_entrada) | |
spacerItem12 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) | |
self.h_layout_valor_entrada.addItem(spacerItem12) | |
spacerItem13 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) | |
self.h_layout_valor_entrada.addItem(spacerItem13) | |
self.verticalLayout_9.addLayout(self.h_layout_valor_entrada) | |
spacerItem14 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) | |
self.verticalLayout_9.addItem(spacerItem14) | |
self.meta_diaria = QtWidgets.QLabel(self.configuracoes_tab) | |
self.meta_diaria.setObjectName("meta_diaria") | |
self.verticalLayout_9.addWidget(self.meta_diaria) | |
self.h_layout_meta_diaria_stop_gain = QtWidgets.QHBoxLayout() | |
self.h_layout_meta_diaria_stop_gain.setObjectName("h_layout_meta_diaria_stop_gain") | |
spacerItem15 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) | |
self.h_layout_meta_diaria_stop_gain.addItem(spacerItem15) | |
self.stop_gain_lb = QtWidgets.QLabel(self.configuracoes_tab) | |
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) | |
sizePolicy.setHorizontalStretch(0) | |
sizePolicy.setVerticalStretch(0) | |
sizePolicy.setHeightForWidth(self.stop_gain_lb.sizePolicy().hasHeightForWidth()) | |
self.stop_gain_lb.setSizePolicy(sizePolicy) | |
self.stop_gain_lb.setObjectName("stop_gain_lb") | |
self.h_layout_meta_diaria_stop_gain.addWidget(self.stop_gain_lb) | |
self.fld_stop_gain = QtWidgets.QLineEdit(self.configuracoes_tab) | |
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) | |
sizePolicy.setHorizontalStretch(0) | |
sizePolicy.setVerticalStretch(0) | |
sizePolicy.setHeightForWidth(self.fld_stop_gain.sizePolicy().hasHeightForWidth()) | |
self.fld_stop_gain.setSizePolicy(sizePolicy) | |
self.fld_stop_gain.setObjectName("fld_stop_gain") | |
self.h_layout_meta_diaria_stop_gain.addWidget(self.fld_stop_gain) | |
self.combo_box_stop_gain = QtWidgets.QComboBox(self.configuracoes_tab) | |
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) | |
sizePolicy.setHorizontalStretch(0) | |
sizePolicy.setVerticalStretch(0) | |
sizePolicy.setHeightForWidth(self.combo_box_stop_gain.sizePolicy().hasHeightForWidth()) | |
self.combo_box_stop_gain.setSizePolicy(sizePolicy) | |
self.combo_box_stop_gain.setObjectName("combo_box_stop_gain") | |
self.combo_box_stop_gain.addItem("") | |
self.combo_box_stop_gain.addItem("") | |
self.h_layout_meta_diaria_stop_gain.addWidget(self.combo_box_stop_gain) | |
spacerItem16 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) | |
self.h_layout_meta_diaria_stop_gain.addItem(spacerItem16) | |
spacerItem17 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) | |
self.h_layout_meta_diaria_stop_gain.addItem(spacerItem17) | |
self.verticalLayout_9.addLayout(self.h_layout_meta_diaria_stop_gain) | |
self.horizontalLayout_5 = QtWidgets.QHBoxLayout() | |
self.horizontalLayout_5.setObjectName("horizontalLayout_5") | |
spacerItem18 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) | |
self.horizontalLayout_5.addItem(spacerItem18) | |
self.stop_loss_label = QtWidgets.QLabel(self.configuracoes_tab) | |
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) | |
sizePolicy.setHorizontalStretch(0) | |
sizePolicy.setVerticalStretch(0) | |
sizePolicy.setHeightForWidth(self.stop_loss_label.sizePolicy().hasHeightForWidth()) | |
self.stop_loss_label.setSizePolicy(sizePolicy) | |
self.stop_loss_label.setObjectName("stop_loss_label") | |
self.horizontalLayout_5.addWidget(self.stop_loss_label) | |
self.fld_stop_loss = QtWidgets.QLineEdit(self.configuracoes_tab) | |
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) | |
sizePolicy.setHorizontalStretch(0) | |
sizePolicy.setVerticalStretch(0) | |
sizePolicy.setHeightForWidth(self.fld_stop_loss.sizePolicy().hasHeightForWidth()) | |
self.fld_stop_loss.setSizePolicy(sizePolicy) | |
self.fld_stop_loss.setObjectName("fld_stop_loss") | |
self.horizontalLayout_5.addWidget(self.fld_stop_loss) | |
self.combo_box_stop_loss = QtWidgets.QComboBox(self.configuracoes_tab) | |
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) | |
sizePolicy.setHorizontalStretch(0) | |
sizePolicy.setVerticalStretch(0) | |
sizePolicy.setHeightForWidth(self.combo_box_stop_loss.sizePolicy().hasHeightForWidth()) | |
self.combo_box_stop_loss.setSizePolicy(sizePolicy) | |
self.combo_box_stop_loss.setObjectName("combo_box_stop_loss") | |
self.combo_box_stop_loss.addItem("") | |
self.combo_box_stop_loss.addItem("") | |
self.horizontalLayout_5.addWidget(self.combo_box_stop_loss) | |
spacerItem19 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) | |
self.horizontalLayout_5.addItem(spacerItem19) | |
spacerItem20 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) | |
self.horizontalLayout_5.addItem(spacerItem20) | |
self.verticalLayout_9.addLayout(self.horizontalLayout_5) | |
self.grid_configuracoes.addLayout(self.verticalLayout_9, 0, 0, 1, 1) | |
spacerItem21 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) | |
self.grid_configuracoes.addItem(spacerItem21, 1, 0, 1, 1) | |
self.horizontalLayout_7 = QtWidgets.QHBoxLayout() | |
self.horizontalLayout_7.setObjectName("horizontalLayout_7") | |
spacerItem22 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) | |
self.horizontalLayout_7.addItem(spacerItem22) | |
self.btn_salvar_configuracoes = QtWidgets.QPushButton(self.configuracoes_tab) | |
self.btn_salvar_configuracoes.setObjectName("btn_salvar_configuracoes") | |
self.horizontalLayout_7.addWidget(self.btn_salvar_configuracoes) | |
spacerItem23 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) | |
self.horizontalLayout_7.addItem(spacerItem23) | |
self.grid_configuracoes.addLayout(self.horizontalLayout_7, 2, 0, 1, 1) | |
spacerItem24 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) | |
self.grid_configuracoes.addItem(spacerItem24, 3, 0, 1, 1) | |
self.gridLayout_6.addLayout(self.grid_configuracoes, 1, 0, 1, 1) | |
self.lb_perfil_configuracoes = QtWidgets.QLabel(self.configuracoes_tab) | |
self.lb_perfil_configuracoes.setObjectName("lb_perfil_configuracoes") | |
self.gridLayout_6.addWidget(self.lb_perfil_configuracoes, 0, 1, 1, 1) | |
self.tabs.addTab(self.configuracoes_tab, "") | |
self.copy_trading_tab = QtWidgets.QWidget() | |
self.copy_trading_tab.setEnabled(True) | |
self.copy_trading_tab.setObjectName("copy_trading_tab") | |
self.gridLayout_4 = QtWidgets.QGridLayout(self.copy_trading_tab) | |
self.gridLayout_4.setObjectName("gridLayout_4") | |
self.grid_copy_trading = QtWidgets.QGridLayout() | |
self.grid_copy_trading.setObjectName("grid_copy_trading") | |
self.horizontalLayout = QtWidgets.QHBoxLayout() | |
self.horizontalLayout.setObjectName("horizontalLayout") | |
self.verticalLayout_7 = QtWidgets.QVBoxLayout() | |
self.verticalLayout_7.setObjectName("verticalLayout_7") | |
self.h_layout_painel_action = QtWidgets.QHBoxLayout() | |
self.h_layout_painel_action.setObjectName("h_layout_painel_action") | |
self.btn_iniciar_copy = QtWidgets.QPushButton(self.copy_trading_tab) | |
self.btn_iniciar_copy.setObjectName("btn_iniciar_copy") | |
self.h_layout_painel_action.addWidget(self.btn_iniciar_copy) | |
self.btn_parar_copy = QtWidgets.QPushButton(self.copy_trading_tab) | |
self.btn_parar_copy.setObjectName("btn_parar_copy") | |
self.h_layout_painel_action.addWidget(self.btn_parar_copy) | |
self.verticalLayout_7.addLayout(self.h_layout_painel_action) | |
self.horizontalLayout.addLayout(self.verticalLayout_7) | |
self.group_box_trader_painel = QtWidgets.QGroupBox(self.copy_trading_tab) | |
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) | |
sizePolicy.setHorizontalStretch(0) | |
sizePolicy.setVerticalStretch(0) | |
sizePolicy.setHeightForWidth(self.group_box_trader_painel.sizePolicy().hasHeightForWidth()) | |
self.group_box_trader_painel.setSizePolicy(sizePolicy) | |
self.group_box_trader_painel.setObjectName("group_box_trader_painel") | |
self.gridLayout_2 = QtWidgets.QGridLayout(self.group_box_trader_painel) | |
self.gridLayout_2.setObjectName("gridLayout_2") | |
self.horizontalLayout_2 = QtWidgets.QHBoxLayout() | |
self.horizontalLayout_2.setObjectName("horizontalLayout_2") | |
self.verticalLayout_8 = QtWidgets.QVBoxLayout() | |
self.verticalLayout_8.setObjectName("verticalLayout_8") | |
self.label = QtWidgets.QLabel(self.group_box_trader_painel) | |
self.label.setObjectName("label") | |
self.verticalLayout_8.addWidget(self.label) | |
self.line_4 = QtWidgets.QFrame(self.group_box_trader_painel) | |
self.line_4.setFrameShape(QtWidgets.QFrame.HLine) | |
self.line_4.setFrameShadow(QtWidgets.QFrame.Sunken) | |
self.line_4.setObjectName("line_4") | |
self.verticalLayout_8.addWidget(self.line_4) | |
spacerItem25 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) | |
self.verticalLayout_8.addItem(spacerItem25) | |
self.btn_iniciar_servidor = QtWidgets.QPushButton(self.group_box_trader_painel) | |
self.btn_iniciar_servidor.setObjectName("btn_iniciar_servidor") | |
self.verticalLayout_8.addWidget(self.btn_iniciar_servidor) | |
self.btn_parar_servidor = QtWidgets.QPushButton(self.group_box_trader_painel) | |
self.btn_parar_servidor.setObjectName("btn_parar_servidor") | |
self.verticalLayout_8.addWidget(self.btn_parar_servidor) | |
spacerItem26 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) | |
self.verticalLayout_8.addItem(spacerItem26) | |
self.horizontalLayout_2.addLayout(self.verticalLayout_8) | |
self.gridLayout_2.addLayout(self.horizontalLayout_2, 0, 0, 1, 1) | |
self.verticalLayout_10 = QtWidgets.QVBoxLayout() | |
self.verticalLayout_10.setObjectName("verticalLayout_10") | |
self.label_2 = QtWidgets.QLabel(self.group_box_trader_painel) | |
self.label_2.setObjectName("label_2") | |
self.verticalLayout_10.addWidget(self.label_2) | |
self.line_8 = QtWidgets.QFrame(self.group_box_trader_painel) | |
self.line_8.setFrameShape(QtWidgets.QFrame.HLine) | |
self.line_8.setFrameShadow(QtWidgets.QFrame.Sunken) | |
self.line_8.setObjectName("line_8") | |
self.verticalLayout_10.addWidget(self.line_8) | |
spacerItem27 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) | |
self.verticalLayout_10.addItem(spacerItem27) | |
self.label_4 = QtWidgets.QLabel(self.group_box_trader_painel) | |
self.label_4.setObjectName("label_4") | |
self.verticalLayout_10.addWidget(self.label_4) | |
self.fld_expiracao = QtWidgets.QLineEdit(self.group_box_trader_painel) | |
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) | |
sizePolicy.setHorizontalStretch(0) | |
sizePolicy.setVerticalStretch(0) | |
sizePolicy.setHeightForWidth(self.fld_expiracao.sizePolicy().hasHeightForWidth()) | |
self.fld_expiracao.setSizePolicy(sizePolicy) | |
self.fld_expiracao.setObjectName("fld_expiracao") | |
self.verticalLayout_10.addWidget(self.fld_expiracao) | |
self.cb_expiracao = QtWidgets.QComboBox(self.group_box_trader_painel) | |
self.cb_expiracao.setEnabled(False) | |
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) | |
sizePolicy.setHorizontalStretch(0) | |
sizePolicy.setVerticalStretch(0) | |
sizePolicy.setHeightForWidth(self.cb_expiracao.sizePolicy().hasHeightForWidth()) | |
self.cb_expiracao.setSizePolicy(sizePolicy) | |
self.cb_expiracao.setObjectName("cb_expiracao") | |
self.cb_expiracao.addItem("") | |
self.cb_expiracao.addItem("") | |
self.cb_expiracao.addItem("") | |
self.verticalLayout_10.addWidget(self.cb_expiracao) | |
spacerItem28 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) | |
self.verticalLayout_10.addItem(spacerItem28) | |
self.gridLayout_2.addLayout(self.verticalLayout_10, 0, 2, 1, 1) | |
self.line_9 = QtWidgets.QFrame(self.group_box_trader_painel) | |
self.line_9.setFrameShape(QtWidgets.QFrame.VLine) | |
self.line_9.setFrameShadow(QtWidgets.QFrame.Sunken) | |
self.line_9.setObjectName("line_9") | |
self.gridLayout_2.addWidget(self.line_9, 0, 3, 1, 1) | |
self.verticalLayout_12 = QtWidgets.QVBoxLayout() | |
self.verticalLayout_12.setObjectName("verticalLayout_12") | |
self.label_6 = QtWidgets.QLabel(self.group_box_trader_painel) | |
self.label_6.setObjectName("label_6") | |
self.verticalLayout_12.addWidget(self.label_6) | |
self.line_12 = QtWidgets.QFrame(self.group_box_trader_painel) | |
self.line_12.setFrameShape(QtWidgets.QFrame.HLine) | |
self.line_12.setFrameShadow(QtWidgets.QFrame.Sunken) | |
self.line_12.setObjectName("line_12") | |
self.verticalLayout_12.addWidget(self.line_12) | |
spacerItem29 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) | |
self.verticalLayout_12.addItem(spacerItem29) | |
self.cb_digital = QtWidgets.QCheckBox(self.group_box_trader_painel) | |
self.cb_digital.setObjectName("cb_digital") | |
self.verticalLayout_12.addWidget(self.cb_digital) | |
self.cb_otc = QtWidgets.QCheckBox(self.group_box_trader_painel) | |
self.cb_otc.setObjectName("cb_otc") | |
self.verticalLayout_12.addWidget(self.cb_otc) | |
self.btn_call = QtWidgets.QPushButton(self.group_box_trader_painel) | |
self.btn_call.setObjectName("btn_call") | |
self.verticalLayout_12.addWidget(self.btn_call) | |
self.btn_put = QtWidgets.QPushButton(self.group_box_trader_painel) | |
self.btn_put.setObjectName("btn_put") | |
self.verticalLayout_12.addWidget(self.btn_put) | |
spacerItem30 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) | |
self.verticalLayout_12.addItem(spacerItem30) | |
self.gridLayout_2.addLayout(self.verticalLayout_12, 0, 7, 1, 1) | |
self.verticalLayout_11 = QtWidgets.QVBoxLayout() | |
self.verticalLayout_11.setObjectName("verticalLayout_11") | |
self.label_5 = QtWidgets.QLabel(self.group_box_trader_painel) | |
self.label_5.setObjectName("label_5") | |
self.verticalLayout_11.addWidget(self.label_5) | |
self.line_10 = QtWidgets.QFrame(self.group_box_trader_painel) | |
self.line_10.setFrameShape(QtWidgets.QFrame.HLine) | |
self.line_10.setFrameShadow(QtWidgets.QFrame.Sunken) | |
self.line_10.setObjectName("line_10") | |
self.verticalLayout_11.addWidget(self.line_10) | |
self.horizontalLayout_8 = QtWidgets.QHBoxLayout() | |
self.horizontalLayout_8.setObjectName("horizontalLayout_8") | |
self.verticalLayout_3 = QtWidgets.QVBoxLayout() | |
self.verticalLayout_3.setObjectName("verticalLayout_3") | |
self.rb_AUDJPY = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_AUDJPY.setObjectName("rb_AUDJPY") | |
self.verticalLayout_3.addWidget(self.rb_AUDJPY) | |
self.rb_AUDCAD = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_AUDCAD.setObjectName("rb_AUDCAD") | |
self.verticalLayout_3.addWidget(self.rb_AUDCAD) | |
self.rb_AUDUSD = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_AUDUSD.setObjectName("rb_AUDUSD") | |
self.verticalLayout_3.addWidget(self.rb_AUDUSD) | |
self.rb_AUDCHF = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_AUDCHF.setObjectName("rb_AUDCHF") | |
self.verticalLayout_3.addWidget(self.rb_AUDCHF) | |
self.rb_AUDNZD = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_AUDNZD.setObjectName("rb_AUDNZD") | |
self.verticalLayout_3.addWidget(self.rb_AUDNZD) | |
self.horizontalLayout_8.addLayout(self.verticalLayout_3) | |
self.line_13 = QtWidgets.QFrame(self.group_box_trader_painel) | |
self.line_13.setFrameShape(QtWidgets.QFrame.VLine) | |
self.line_13.setFrameShadow(QtWidgets.QFrame.Sunken) | |
self.line_13.setObjectName("line_13") | |
self.horizontalLayout_8.addWidget(self.line_13) | |
self.verticalLayout_14 = QtWidgets.QVBoxLayout() | |
self.verticalLayout_14.setObjectName("verticalLayout_14") | |
self.rb_CADJPY = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_CADJPY.setObjectName("rb_CADJPY") | |
self.verticalLayout_14.addWidget(self.rb_CADJPY) | |
self.rb_CADCHF = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_CADCHF.setObjectName("rb_CADCHF") | |
self.verticalLayout_14.addWidget(self.rb_CADCHF) | |
self.rb_CHFJPY = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_CHFJPY.setObjectName("rb_CHFJPY") | |
self.verticalLayout_14.addWidget(self.rb_CHFJPY) | |
self.horizontalLayout_8.addLayout(self.verticalLayout_14) | |
self.line_14 = QtWidgets.QFrame(self.group_box_trader_painel) | |
self.line_14.setFrameShape(QtWidgets.QFrame.VLine) | |
self.line_14.setFrameShadow(QtWidgets.QFrame.Sunken) | |
self.line_14.setObjectName("line_14") | |
self.horizontalLayout_8.addWidget(self.line_14) | |
self.verticalLayout_4 = QtWidgets.QVBoxLayout() | |
self.verticalLayout_4.setObjectName("verticalLayout_4") | |
self.rb_EURCAD = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_EURCAD.setObjectName("rb_EURCAD") | |
self.verticalLayout_4.addWidget(self.rb_EURCAD) | |
self.rb_EURNZD = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_EURNZD.setObjectName("rb_EURNZD") | |
self.verticalLayout_4.addWidget(self.rb_EURNZD) | |
self.rb_EURGBP = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_EURGBP.setObjectName("rb_EURGBP") | |
self.verticalLayout_4.addWidget(self.rb_EURGBP) | |
self.rb_EURAUD = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_EURAUD.setObjectName("rb_EURAUD") | |
self.verticalLayout_4.addWidget(self.rb_EURAUD) | |
self.rb_EURJPY = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_EURJPY.setObjectName("rb_EURJPY") | |
self.verticalLayout_4.addWidget(self.rb_EURJPY) | |
self.rb_EURUSD = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_EURUSD.setObjectName("rb_EURUSD") | |
self.verticalLayout_4.addWidget(self.rb_EURUSD) | |
self.horizontalLayout_8.addLayout(self.verticalLayout_4) | |
self.line_15 = QtWidgets.QFrame(self.group_box_trader_painel) | |
self.line_15.setFrameShape(QtWidgets.QFrame.VLine) | |
self.line_15.setFrameShadow(QtWidgets.QFrame.Sunken) | |
self.line_15.setObjectName("line_15") | |
self.horizontalLayout_8.addWidget(self.line_15) | |
self.verticalLayout_13 = QtWidgets.QVBoxLayout() | |
self.verticalLayout_13.setObjectName("verticalLayout_13") | |
self.rb_GBPNZD = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_GBPNZD.setObjectName("rb_GBPNZD") | |
self.verticalLayout_13.addWidget(self.rb_GBPNZD) | |
self.rb_GBPAUD = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_GBPAUD.setObjectName("rb_GBPAUD") | |
self.verticalLayout_13.addWidget(self.rb_GBPAUD) | |
self.rb_GBPUSD = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_GBPUSD.setObjectName("rb_GBPUSD") | |
self.verticalLayout_13.addWidget(self.rb_GBPUSD) | |
self.rb_GBPCAD = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_GBPCAD.setObjectName("rb_GBPCAD") | |
self.verticalLayout_13.addWidget(self.rb_GBPCAD) | |
self.rb_GBPJPY = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_GBPJPY.setObjectName("rb_GBPJPY") | |
self.verticalLayout_13.addWidget(self.rb_GBPJPY) | |
self.rb_GBPCHF = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_GBPCHF.setObjectName("rb_GBPCHF") | |
self.verticalLayout_13.addWidget(self.rb_GBPCHF) | |
self.horizontalLayout_8.addLayout(self.verticalLayout_13) | |
self.line_16 = QtWidgets.QFrame(self.group_box_trader_painel) | |
self.line_16.setFrameShape(QtWidgets.QFrame.VLine) | |
self.line_16.setFrameShadow(QtWidgets.QFrame.Sunken) | |
self.line_16.setObjectName("line_16") | |
self.horizontalLayout_8.addWidget(self.line_16) | |
self.verticalLayout_16 = QtWidgets.QVBoxLayout() | |
self.verticalLayout_16.setObjectName("verticalLayout_16") | |
self.rb_USDCAD = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_USDCAD.setObjectName("rb_USDCAD") | |
self.verticalLayout_16.addWidget(self.rb_USDCAD) | |
self.rb_USDJPY = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_USDJPY.setObjectName("rb_USDJPY") | |
self.verticalLayout_16.addWidget(self.rb_USDJPY) | |
self.rb_USDCHF = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_USDCHF.setObjectName("rb_USDCHF") | |
self.verticalLayout_16.addWidget(self.rb_USDCHF) | |
self.rb_USDNOK = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_USDNOK.setObjectName("rb_USDNOK") | |
self.verticalLayout_16.addWidget(self.rb_USDNOK) | |
self.horizontalLayout_8.addLayout(self.verticalLayout_16) | |
self.line_17 = QtWidgets.QFrame(self.group_box_trader_painel) | |
self.line_17.setFrameShape(QtWidgets.QFrame.VLine) | |
self.line_17.setFrameShadow(QtWidgets.QFrame.Sunken) | |
self.line_17.setObjectName("line_17") | |
self.horizontalLayout_8.addWidget(self.line_17) | |
self.verticalLayout_17 = QtWidgets.QVBoxLayout() | |
self.verticalLayout_17.setObjectName("verticalLayout_17") | |
self.rb_NZDUSD = QtWidgets.QRadioButton(self.group_box_trader_painel) | |
self.rb_NZDUSD.setObjectName("rb_NZDUSD") | |
self.verticalLayout_17.addWidget(self.rb_NZDUSD) | |
self.horizontalLayout_8.addLayout(self.verticalLayout_17) | |
self.verticalLayout_11.addLayout(self.horizontalLayout_8) | |
spacerItem31 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) | |
self.verticalLayout_11.addItem(spacerItem31) | |
self.gridLayout_2.addLayout(self.verticalLayout_11, 0, 4, 1, 1) | |
self.line_11 = QtWidgets.QFrame(self.group_box_trader_painel) | |
self.line_11.setFrameShape(QtWidgets.QFrame.VLine) | |
self.line_11.setFrameShadow(QtWidgets.QFrame.Sunken) | |
self.line_11.setObjectName("line_11") | |
self.gridLayout_2.addWidget(self.line_11, 0, 6, 1, 1) | |
self.line_5 = QtWidgets.QFrame(self.group_box_trader_painel) | |
self.line_5.setFrameShape(QtWidgets.QFrame.VLine) | |
self.line_5.setFrameShadow(QtWidgets.QFrame.Sunken) | |
self.line_5.setObjectName("line_5") | |
self.gridLayout_2.addWidget(self.line_5, 0, 1, 1, 1) | |
self.horizontalLayout.addWidget(self.group_box_trader_painel) | |
self.v_layout_ultimas_entradas = QtWidgets.QVBoxLayout() | |
self.v_layout_ultimas_entradas.setObjectName("v_layout_ultimas_entradas") | |
spacerItem32 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) | |
self.v_layout_ultimas_entradas.addItem(spacerItem32) | |
self.ultimas_entradas = QtWidgets.QLabel(self.copy_trading_tab) | |
self.ultimas_entradas.setObjectName("ultimas_entradas") | |
self.v_layout_ultimas_entradas.addWidget(self.ultimas_entradas) | |
self.h_layout_ultimas_entradas = QtWidgets.QHBoxLayout() | |
self.h_layout_ultimas_entradas.setObjectName("h_layout_ultimas_entradas") | |
self.txt_browser_log = QtWidgets.QTextBrowser(self.copy_trading_tab) | |
self.txt_browser_log.setObjectName("txt_browser_log") | |
self.h_layout_ultimas_entradas.addWidget(self.txt_browser_log) | |
self.v_layout_ultimas_entradas.addLayout(self.h_layout_ultimas_entradas) | |
self.horizontalLayout.addLayout(self.v_layout_ultimas_entradas) | |
self.grid_copy_trading.addLayout(self.horizontalLayout, 0, 0, 1, 1) | |
self.gridLayout_4.addLayout(self.grid_copy_trading, 0, 0, 1, 1) | |
self.tabs.addTab(self.copy_trading_tab, "") | |
self.h_layout_tabs.addWidget(self.tabs) | |
self.v_layout_centro.addLayout(self.h_layout_tabs) | |
self.horizontalLayout_6 = QtWidgets.QHBoxLayout() | |
self.horizontalLayout_6.setObjectName("horizontalLayout_6") | |
self.line_2 = QtWidgets.QFrame(self.centralwidget) | |
self.line_2.setFrameShape(QtWidgets.QFrame.VLine) | |
self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken) | |
self.line_2.setObjectName("line_2") | |
self.horizontalLayout_6.addWidget(self.line_2) | |
self.line_3 = QtWidgets.QFrame(self.centralwidget) | |
self.line_3.setFrameShape(QtWidgets.QFrame.VLine) | |
self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken) | |
self.line_3.setObjectName("line_3") | |
self.horizontalLayout_6.addWidget(self.line_3) | |
self.v_layout_centro.addLayout(self.horizontalLayout_6) | |
self.verticalLayout.addLayout(self.v_layout_centro) | |
self.line_6 = QtWidgets.QFrame(self.centralwidget) | |
self.line_6.setFrameShape(QtWidgets.QFrame.HLine) | |
self.line_6.setFrameShadow(QtWidgets.QFrame.Sunken) | |
self.line_6.setObjectName("line_6") | |
self.verticalLayout.addWidget(self.line_6) | |
self.h_layout_direitos_reservados = QtWidgets.QHBoxLayout() | |
self.h_layout_direitos_reservados.setObjectName("h_layout_direitos_reservados") | |
self.label_3 = QtWidgets.QLabel(self.centralwidget) | |
self.label_3.setObjectName("label_3") | |
self.h_layout_direitos_reservados.addWidget(self.label_3, 0, QtCore.Qt.AlignHCenter|QtCore.Qt.AlignBottom) | |
self.verticalLayout.addLayout(self.h_layout_direitos_reservados) | |
self.verticalLayout_2.addLayout(self.verticalLayout) | |
MainWindow.setCentralWidget(self.centralwidget) | |
self.menubar = QtWidgets.QMenuBar(MainWindow) | |
self.menubar.setGeometry(QtCore.QRect(0, 0, 1162, 21)) | |
self.menubar.setObjectName("menubar") | |
self.menuVizion = QtWidgets.QMenu(self.menubar) | |
self.menuVizion.setObjectName("menuVizion") | |
MainWindow.setMenuBar(self.menubar) | |
self.actionSair = QtWidgets.QAction(MainWindow) | |
self.actionSair.setObjectName("actionSair") | |
self.actionConte_do = QtWidgets.QAction(MainWindow) | |
self.actionConte_do.setEnabled(True) | |
self.actionConte_do.setObjectName("actionConte_do") | |
self.actionSuporte_no_Telegram = QtWidgets.QAction(MainWindow) | |
self.actionSuporte_no_Telegram.setObjectName("actionSuporte_no_Telegram") | |
self.actionTermos_e_Condi_es = QtWidgets.QAction(MainWindow) | |
self.actionTermos_e_Condi_es.setObjectName("actionTermos_e_Condi_es") | |
self.actionSobre = QtWidgets.QAction(MainWindow) | |
self.actionSobre.setObjectName("actionSobre") | |
self.actionVizion_Login = QtWidgets.QAction(MainWindow) | |
self.actionVizion_Login.setObjectName("actionVizion_Login") | |
self.actionPol_tica_de_Privacidade = QtWidgets.QAction(MainWindow) | |
self.actionPol_tica_de_Privacidade.setObjectName("actionPol_tica_de_Privacidade") | |
self.actionPainel = QtWidgets.QAction(MainWindow) | |
self.actionPainel.setObjectName("actionPainel") | |
self.menuVizion.addAction(self.actionVizion_Login) | |
self.menuVizion.addSeparator() | |
self.menuVizion.addAction(self.actionSair) | |
self.menubar.addAction(self.menuVizion.menuAction()) | |
self.retranslateUi(MainWindow) | |
self.tabs.setCurrentIndex(0) | |
QtCore.QMetaObject.connectSlotsByName(MainWindow) | |
MainWindow.setTabOrder(self.fld_login_2, self.fld_senha_2) | |
MainWindow.setTabOrder(self.fld_senha_2, self.btn_entrar_2) | |
MainWindow.setTabOrder(self.btn_entrar_2, self.btn_parar_copy) | |
MainWindow.setTabOrder(self.btn_parar_copy, self.fld_valor_entrada) | |
MainWindow.setTabOrder(self.fld_valor_entrada, self.combo_box_valor_entrada) | |
MainWindow.setTabOrder(self.combo_box_valor_entrada, self.fld_stop_gain) | |
MainWindow.setTabOrder(self.fld_stop_gain, self.tabs) | |
MainWindow.setTabOrder(self.tabs, self.cb_tipo_conta) | |
MainWindow.setTabOrder(self.cb_tipo_conta, self.combo_box_stop_loss) | |
MainWindow.setTabOrder(self.combo_box_stop_loss, self.combo_box_stop_gain) | |
MainWindow.setTabOrder(self.combo_box_stop_gain, self.fld_stop_loss) | |
#=========BOTÕES======================= | |
#====== Palette botão ================ | |
palette = self.btn_iniciar_copy.palette() | |
role = self.btn_iniciar_copy.backgroundRole() | |
palette.setColor(role,QtGui.QColor(44,171,64)) #verde | |
self.btn_iniciar_copy.setPalette(palette) | |
palette = self.btn_parar_copy.palette() | |
role = self.btn_parar_copy.backgroundRole() | |
palette.setColor(role,QtGui.QColor(218,73,49)) #laranja | |
self.btn_parar_copy.setPalette(palette) | |
palette = self.btn_salvar_configuracoes.palette() | |
role = self.btn_salvar_configuracoes.backgroundRole() | |
palette.setColor(role,QtGui.QColor(51,204,204)) #verde | |
self.btn_salvar_configuracoes.setPalette(palette) | |
#====== Cor do botão | |
self.btn_salvar_configuracoes.setStyleSheet('QPushButton {color:black;}') | |
palette = self.btn_iniciar_servidor.palette() | |
role = self.btn_iniciar_servidor.backgroundRole() | |
palette.setColor(role,QtGui.QColor(51,204,204)) | |
self.btn_iniciar_servidor.setPalette(palette) | |
#====== Cor do botão | |
self.btn_iniciar_servidor.setStyleSheet('QPushButton {color:black;}') | |
palette = self.btn_parar_servidor.palette() | |
role = self.btn_parar_servidor.backgroundRole() | |
palette.setColor(role,QtGui.QColor(51,204,204)) | |
self.btn_parar_servidor.setPalette(palette) | |
#====== Cor do botão | |
self.btn_parar_servidor.setStyleSheet('QPushButton {color:black;}') | |
palette = self.btn_call.palette() | |
role = self.btn_call.backgroundRole() | |
palette.setColor(role,QtGui.QColor(44,171,64)) #verde | |
self.btn_call.setPalette(palette) | |
palette = self.btn_put.palette() | |
role = self.btn_put.backgroundRole() | |
palette.setColor(role,QtGui.QColor(218,73,49)) #laranja | |
self.btn_put.setPalette(palette) | |
''' | |
#====== Cor do botão | |
self.btn_entrar_2.setStyleSheet('QPushButton {color:black;}') | |
''' | |
#self.aviso_login.setText(_translate("Dialog", "<html><head/><body><p><span style=\" font-weight:600; text-decoration: underline; color:#00aa00;\">Aviso</span></p></body></html>")) | |
self.aviso_login.hide() | |
#======== Importa NOVO SDK firebase authentication======================== | |
from firebase_admin_sdk import FirebaseAdminSDKRealTime | |
from firebase_admin_sdk import FirebaseAdminSDKAuth | |
from firebase_client_wrapper import FirebaseClientWrapper | |
self.fb_admin_sdk_auth = FirebaseAdminSDKAuth() | |
self.fb_admin_sdk_rt = FirebaseAdminSDKRealTime() | |
self.fb_client_w = FirebaseClientWrapper() | |
#==================================================================== | |
""" | |
#======= Import firebase database | |
from firebase import firebase as fbdatabase | |
#====== Inicializa Firebase DataBase | |
self.fb_database = fbdatabase.FirebaseApplication("https://vizion-a0cda.firebaseio.com/",None) | |
""" | |
#====== Adiciona trigger ao action Login_vizion do menubar | |
self.actionVizion_Login.triggered.connect(self.vizionLoginDiag) | |
#===== Adiciona trigger ao action Sair do menubar | |
self.actionSair.triggered.connect(self.sairMenu) | |
self.actionSair.triggered.connect(MainWindow.close) | |
#===== Adiciona trigger ao action Sobre do menubar | |
self.actionSobre.triggered.connect(self.connnectMenuAjudaActionSobre) | |
#===== Adiciona trigger ao action Politica de Privacidade do menubar | |
self.actionPol_tica_de_Privacidade.triggered.connect(self.connectMenuAjudaActionPoliticaPrivacidade) | |
#===== Adiciona trigger ao action Termos e Condições do menubar | |
self.actionTermos_e_Condi_es.triggered.connect(self.connectMenuAjudaActionTermosCondicoes) | |
#===== Adiciona trigger ao action Telegram URL e do menubar | |
self.actionSuporte_no_Telegram.triggered.connect(self.connectMenuAjudaActionTelegramURL) | |
#===== Adiciona trigger ao action Conteúdo e do menubar | |
self.actionConte_do.triggered.connect(self.connectMenuAjudaActionConteudo) | |
#===== Adiciona trigger ao botão entrar IQoption | |
self.btn_entrar_2.clicked.connect(self.startLoading) | |
self.cb_tipo_conta.currentTextChanged.connect(self.setIQoptionTipoConta) | |
#===== Adiciona trigger ao botão Inicar Copy caso Cliente comum | |
self.btn_iniciar_copy.clicked.connect(self.BtnStartZeroMQSubscribeClient) | |
self.btn_parar_copy.clicked.connect(self.BtnStopZeroMQSubscribeClient) | |
#===== Adiciona trigger ao botão Inicar Copy caso Cliente Trader | |
self.btn_iniciar_servidor.clicked.connect(self.BtnStartZeroMQRequestClientV2) | |
self.btn_parar_servidor.clicked.connect(self.BtnStopZeroMQRequestClientV2) | |
#===== Adiciona trigger ao botão Configurações | |
self.btn_salvar_configuracoes.clicked.connect(self.SalvaConfigTrade) | |
#====== Inicializa user json | |
self.client_json_ = None | |
self.session_id_ = None | |
self.client_id_ = None | |
#==== Inicializa iqoption objeto | |
self.iqoption_api = None | |
#===== Chama a interface de login | |
#self.vizionLoginDiag() | |
#===== Inicia btn Para Cliente disable | |
self.btn_parar_copy.setEnabled(False) | |
self.btn_parar_servidor.setEnabled(False) | |
self.btn_call.clicked.connect(self.buildCallOrderV2) | |
self.btn_put.clicked.connect(self.buildPutOrderV2) | |
def retranslateUi(self, MainWindow): | |
_translate = QtCore.QCoreApplication.translate | |
MainWindow.setWindowTitle(_translate("MainWindow", "CJF Copy (versão do Trader)")) | |
self.nome_perfil.setText(_translate("MainWindow", "Nome de Perfil:")) | |
self.nome_perfil_valor.setText(_translate("MainWindow", " - ")) | |
self.balanco.setText(_translate("MainWindow", "Balanço:")) | |
self.balanco_valor.setText(_translate("MainWindow", " - ")) | |
self.id_perfil_corretora.setText(_translate("MainWindow", "ID Perfil (corretora):")) | |
self.id_perfil_corretora_valor.setText(_translate("MainWindow", " - ")) | |
self.cb_tipo_conta.setItemText(0, _translate("MainWindow", "Selecione tipo de conta: ")) | |
self.cb_tipo_conta.setItemText(1, _translate("MainWindow", "Conta Demo ")) | |
self.cb_tipo_conta.setItemText(2, _translate("MainWindow", "Conta Real ")) | |
self.lb_entrar_2.setText(_translate("MainWindow", "Conta:")) | |
self.lb_senha_2.setText(_translate("MainWindow", "Senha:")) | |
self.lb_nao_tem_conta_2.setText(_translate("MainWindow", "Ainda não tem conta?")) | |
self.lb_criar_uma_agora_2.setText(_translate("MainWindow", "<html><head/><body><p><a href=\"https://affiliate.iqbroker.com/redir/?aff=206775\"><span style=\" font-weight:600; text-decoration: underline; color:#00ad0e;\">Criar uma agora</span></a></p></body></html>")) | |
self.btn_entrar_2.setText(_translate("MainWindow", "Entrar")) | |
self.aviso_login.setText(_translate("MainWindow", "TextLabel")) | |
self.lb_vizion_software_terceiros_2.setText(_translate("MainWindow", "<html><head/><body><p><span style=\" font-size:7pt;\">CJF Copy Trade é um software de terceiros e suas tecnologias empregadas não pertencem a nenhuma corretora. </span></p></body></html>")) | |
self.lb_entre_informacoes_2.setText(_translate("MainWindow", "Entre com sua conta de login da corretora IQOPTION.")) | |
self.tabs.setTabText(self.tabs.indexOf(self.iqoption_login_tab), _translate("MainWindow", "IQOPTION Login")) | |
self.gerenciamento.setText(_translate("MainWindow", "Gerenciamento:")) | |
self.valor_entrada.setText(_translate("MainWindow", "Valor de Entrada:")) | |
self.combo_box_valor_entrada.setItemText(0, _translate("MainWindow", "%")) | |
self.combo_box_valor_entrada.setItemText(1, _translate("MainWindow", "R$")) | |
self.meta_diaria.setText(_translate("MainWindow", "Meta Diária:")) | |
self.stop_gain_lb.setText(_translate("MainWindow", "Stop Gain: ")) | |
self.combo_box_stop_gain.setItemText(0, _translate("MainWindow", "%")) | |
self.combo_box_stop_gain.setItemText(1, _translate("MainWindow", "R$")) | |
self.stop_loss_label.setText(_translate("MainWindow", "Stop Loss: ")) | |
self.combo_box_stop_loss.setItemText(0, _translate("MainWindow", "%")) | |
self.combo_box_stop_loss.setItemText(1, _translate("MainWindow", "R$")) | |
self.btn_salvar_configuracoes.setText(_translate("MainWindow", "SALVAR")) | |
self.lb_perfil_configuracoes.setText(_translate("MainWindow", "Perfil de Configurações:")) | |
self.tabs.setTabText(self.tabs.indexOf(self.configuracoes_tab), _translate("MainWindow", "Configurações")) | |
self.btn_iniciar_copy.setText(_translate("MainWindow", "INICIAR")) | |
self.btn_parar_copy.setText(_translate("MainWindow", "PARAR")) | |
self.group_box_trader_painel.setTitle(_translate("MainWindow", "Painel do Trader")) | |
self.label.setText(_translate("MainWindow", "1. Conectar")) | |
self.btn_iniciar_servidor.setText(_translate("MainWindow", "INICIAR")) | |
self.btn_parar_servidor.setText(_translate("MainWindow", "PARAR")) | |
self.label_2.setText(_translate("MainWindow", "2. Expiração")) | |
self.label_4.setText(_translate("MainWindow", "Tempo (min)")) | |
self.cb_expiracao.setItemText(0, _translate("MainWindow", "1")) | |
self.cb_expiracao.setItemText(1, _translate("MainWindow", "5")) | |
self.cb_expiracao.setItemText(2, _translate("MainWindow", "15")) | |
self.label_6.setText(_translate("MainWindow", "4.Direção")) | |
self.cb_digital.setText(_translate("MainWindow", "DIGITAL")) | |
self.cb_otc.setText(_translate("MainWindow", "OTC")) | |
self.btn_call.setText(_translate("MainWindow", "CALL")) | |
self.btn_put.setText(_translate("MainWindow", "PUT")) | |
self.label_5.setText(_translate("MainWindow", "3. Par")) | |
self.rb_AUDJPY.setText(_translate("MainWindow", "AUDJPY")) | |
self.rb_AUDCAD.setText(_translate("MainWindow", "AUDCAD")) | |
self.rb_AUDUSD.setText(_translate("MainWindow", "AUDUSD")) | |
self.rb_AUDCHF.setText(_translate("MainWindow", "AUDCHF")) | |
self.rb_AUDNZD.setText(_translate("MainWindow", "AUDNZD")) | |
self.rb_CADJPY.setText(_translate("MainWindow", "CADJPY")) | |
self.rb_CADCHF.setText(_translate("MainWindow", "CADCHF")) | |
self.rb_CHFJPY.setText(_translate("MainWindow", "CHFJPY")) | |
self.rb_EURCAD.setText(_translate("MainWindow", "EURCAD")) | |
self.rb_EURNZD.setText(_translate("MainWindow", "EURNZD")) | |
self.rb_EURGBP.setText(_translate("MainWindow", "EURGBP")) | |
self.rb_EURAUD.setText(_translate("MainWindow", "EURAUD")) | |
self.rb_EURJPY.setText(_translate("MainWindow", "EURJPY")) | |
self.rb_EURUSD.setText(_translate("MainWindow", "EURUSD")) | |
self.rb_GBPNZD.setText(_translate("MainWindow", "GBPNZD")) | |
self.rb_GBPAUD.setText(_translate("MainWindow", "GBPAUD")) | |
self.rb_GBPUSD.setText(_translate("MainWindow", "GBPUSD")) | |
self.rb_GBPCAD.setText(_translate("MainWindow", "GBPCAD")) | |
self.rb_GBPJPY.setText(_translate("MainWindow", "GBPJPY")) | |
self.rb_GBPCHF.setText(_translate("MainWindow", "GBPCHF")) | |
self.rb_USDCAD.setText(_translate("MainWindow", "USDCAD")) | |
self.rb_USDJPY.setText(_translate("MainWindow", "USDJPY")) | |
self.rb_USDCHF.setText(_translate("MainWindow", "USDCHF")) | |
self.rb_USDNOK.setText(_translate("MainWindow", "USDNOK")) | |
self.rb_NZDUSD.setText(_translate("MainWindow", "NZDUSD")) | |
self.ultimas_entradas.setText(_translate("MainWindow", "Últimas entradas:")) | |
self.tabs.setTabText(self.tabs.indexOf(self.copy_trading_tab), _translate("MainWindow", "Copy Trading")) | |
self.label_3.setText(_translate("MainWindow", "2021 - CJF Copy (versão do Trader) v0.26 - Todos os direitos reservados.")) | |
self.menuVizion.setTitle(_translate("MainWindow", "Perfil")) | |
self.actionSair.setText(_translate("MainWindow", "Sair")) | |
self.actionConte_do.setText(_translate("MainWindow", "Conteúdo")) | |
self.actionSuporte_no_Telegram.setText(_translate("MainWindow", "Suporte no Telegram")) | |
self.actionTermos_e_Condi_es.setText(_translate("MainWindow", "Termos e Condições")) | |
self.actionSobre.setText(_translate("MainWindow", "Sobre")) | |
self.actionVizion_Login.setText(_translate("MainWindow", "Login")) | |
self.actionPol_tica_de_Privacidade.setText(_translate("MainWindow", "Política de Privacidade")) | |
self.actionPainel.setText(_translate("MainWindow", "Painel")) | |
#========= Se cliente for Trader esconder os botões iniciar e para copy | |
''' | |
self.btn_iniciar_copy.hide() | |
self.btn_parar_copy.hide() | |
''' | |
#========= Se for cliente normal esconder group of box painel_trader | |
self.group_box_trader_painel.hide() | |
#========== Esconde barra de progresso | |
self.progressBar.hide() | |
#================== Salva as configurações do Trading | |
def SalvaConfigTradeFirebaseV2(self): | |
global _stop_loss,_stop_gain | |
global _client_id | |
self.fb_admin_sdk_rt.atualiza_stop_gain_loss(self.ui.client_email,_stop_gain,_stop_loss) | |
def SalvaConfigTradeFirebase(self): | |
global _stop_loss,_stop_gain | |
global _client_id | |
data_hoje = (datetime.now()).strftime("%d_%m_%Y") | |
record = self.fb_database.get('Cliente',_client_id + '/' + 'n_trades' +'/'+ data_hoje) | |
if record == None: | |
self.fb_database.post('Cliente' + '/' + _client_id + '/' + 'n_trades' + '/'+data_hoje + '/' + 'stop_gain_diario',_stop_gain) | |
self.fb_database.post('Cliente' + '/' + _client_id + '/' + 'n_trades' + '/'+data_hoje + '/' + 'stop_loss_diario',_stop_loss) | |
else: | |
sg_record = self.fb_database.get('Cliente',_client_id + '/' + 'n_trades' +'/'+ data_hoje + '/'+ 'stop_gain_diario') | |
sl_record = self.fb_database.get('Cliente',_client_id + '/' + 'n_trades' +'/'+ data_hoje + '/'+ 'stop_loss_diario') | |
if sg_record == None and sl_record == None: | |
self.fb_database.post('Cliente' + '/' + _client_id + '/' + 'n_trades' + '/'+data_hoje + '/' + 'stop_gain_diario',_stop_gain) | |
self.fb_database.post('Cliente' + '/' + _client_id + '/' + 'n_trades' + '/'+data_hoje + '/' + 'stop_loss_diario',_stop_loss) | |
else: | |
stop_gain_diario_id = None | |
stop_loss_diario_id = None | |
for rec in record: | |
if rec == 'stop_gain_diario': | |
_json = record[rec] | |
for key in _json: | |
stop_gain_diario_id = key | |
if rec == 'stop_loss_diario': | |
_json = record[rec] | |
for key in _json: | |
stop_loss_diario_id = key | |
self.fb_database.put('Cliente' + '/' + _client_id + '/' + 'n_trades' + '/' + data_hoje + '/' + 'stop_gain_diario', stop_gain_diario_id,_stop_gain) | |
self.fb_database.put('Cliente' + '/' + _client_id + '/' + 'n_trades' + '/' + data_hoje + '/' + 'stop_loss_diario', stop_loss_diario_id,_stop_loss) | |
def CorrigePontuacaoValores(self,old,new,valor): | |
if valor.find(old): | |
valor = valor.replace(old,new) | |
return valor | |
else: | |
return valor | |
def SalvaConfigTrade(self): | |
if self.is_internet(): | |
global _valor_entrada,_stop_gain,_stop_loss | |
valor_entrada = self.fld_valor_entrada.text() | |
cb_valor_entrada = str(self.combo_box_valor_entrada.currentText()) | |
valor_entrada = self.CorrigePontuacaoValores(',','.',valor_entrada) | |
stop_gain = self.fld_stop_gain.text() | |
cb_stop_gain = str(self.combo_box_stop_gain.currentText()) | |
stop_gain = self.CorrigePontuacaoValores(',','.',stop_gain) | |
stop_loss = self.fld_stop_loss.text() | |
cb_stop_loss = str(self.combo_box_stop_loss.currentText()) | |
stop_loss = self.CorrigePontuacaoValores(',','.',stop_loss) | |
if valor_entrada == "" or stop_gain == "" or stop_loss == "": | |
self.printLogTextBrowserConfig("<!> CONFIGURAÇÕES NÃO FORAM SALVAS, UM OU MAIS CAMPOS ESTÃO VAZIOS <!>") | |
else: | |
if cb_valor_entrada == "%": | |
try: | |
balance = self.iqoption_api.get_balance() | |
_valor_entrada = (float(valor_entrada)/100) | |
_valor_entrada = balance * _valor_entrada | |
_valor_entrada = float(format(round(_valor_entrada, 2))) | |
except websocket._exceptions.WebSocketConnectionClosedException: | |
if self.iqoption_api.check_connect()==False: | |
self.printLogTextBrowserConfig("<!>Tentando se reconectar ...") | |
check,reason=self.iqoption_api.connect() | |
if check: | |
self.printLogTextBrowserConfig("<!>Reconectado com sucesso! ... [ok]") | |
balance = self.iqoption_api.get_balance() | |
_valor_entrada = (float(valor_entrada)/100) | |
_valor_entrada = balance * _valor_entrada | |
_valor_entrada = float(format(round(_valor_entrada, 2))) | |
else: | |
self.printLogTextBrowserConfig(f"<!>Problemas na reconexão. MOTIVO: {reason}... [ok]") | |
else: | |
if cb_valor_entrada == "R$": | |
_valor_entrada = float(valor_entrada) | |
_valor_entrada = float(format(round(_valor_entrada, 2))) | |
if cb_stop_gain == "%": | |
try: | |
balance = self.iqoption_api.get_balance() | |
_stop_gain = (float(stop_gain)/100) | |
_stop_gain = balance * _stop_gain | |
_stop_gain = float(format(round(_stop_gain, 2))) | |
except websocket._exceptions.WebSocketConnectionClosedException: | |
if self.iqoption_api.check_connect()==False: | |
self.printLogTextBrowserConfig("<!>Tentando se reconectar ...") | |
check,reason=self.iqoption_api.connect() | |
if check: | |
self.printLogTextBrowserConfig("<!>Reconectado com sucesso! ... [ok]") | |
balance = self.iqoption_api.get_balance() | |
_stop_gain = (float(stop_gain)/100) | |
_stop_gain = balance * _stop_gain | |
_stop_gain = float(format(round(_stop_gain, 2))) | |
else: | |
self.printLogTextBrowserConfig(f"<!>Problemas na reconexão. MOTIVO: {reason}... [ok]") | |
else: | |
if cb_stop_gain == "R$": | |
_stop_gain = float(stop_gain) | |
_stop_gain = float(format(round(_stop_gain, 2))) | |
if cb_stop_loss == "%": | |
try: | |
balance = self.iqoption_api.get_balance() | |
_stop_loss = (float(stop_loss)/100) | |
_stop_loss = balance * _stop_loss | |
_stop_loss = - float(format(round(_stop_loss, 2))) | |
except websocket._exceptions.WebSocketConnectionClosedException: | |
if self.iqoption_api.check_connect()==False: | |
self.printLogTextBrowserConfig("<!>Tentando se reconectar ...") | |
check,reason=self.iqoption_api.connect() | |
if check: | |
self.printLogTextBrowserConfig("<!>Reconectado com sucesso! ... [ok]") | |
balance = self.iqoption_api.get_balance() | |
_stop_loss = (float(stop_loss)/100) | |
_stop_loss = balance * _stop_loss | |
_stop_loss = - float(format(round(_stop_loss, 2))) | |
else: | |
self.printLogTextBrowserConfig(f"<!>Problemas na reconexão. MOTIVO: {reason}... [ok]") | |
else: | |
if cb_stop_loss == "R$": | |
_stop_loss = float(stop_loss) | |
_stop_loss = - float(format(round(_stop_loss, 2))) | |
tipo_conta = self.getCbTipoConta() | |
if tipo_conta == _TIPO_CONTA_DEMO: | |
self.printLogTextBrowserConfig(f"<br>{emoji.emojize(':moneybag: TIPO CONTA: DEMO.', use_aliases=True)} ") | |
else: | |
if tipo_conta == _TIPO_CONTA_REAL: | |
self.printLogTextBrowserConfig(f"<br>{emoji.emojize(':moneybag: TIPO CONTA: REAL.', use_aliases=True)} ") | |
if cb_valor_entrada == "R$": | |
msgValorEntrada = "VALOR DE ENTRADA: "+cb_valor_entrada+valor_entrada | |
msgStopGain = "STOP GAIN: "+str(_stop_gain)+" ("+stop_gain+cb_stop_gain+")" | |
msgStopLoss = "STOP LOSS: "+str(_stop_loss)+" ("+stop_loss+cb_stop_loss+")" | |
self.printLogTextBrowserConfig(msgValorEntrada) | |
self.printLogTextBrowserConfig(msgStopGain) | |
self.printLogTextBrowserConfig(msgStopLoss) | |
else: | |
if cb_valor_entrada == "%": | |
msgValorEntrada = "VALOR DE ENTRADA: "+str(_valor_entrada)+" ("+valor_entrada+cb_valor_entrada+")" | |
msgStopGain = "STOP GAIN: "+str(_stop_gain)+" ("+stop_gain+cb_stop_gain+")" | |
msgStopLoss = "STOP LOSS: "+str(_stop_loss)+" ("+stop_loss+cb_stop_loss+")" | |
self.printLogTextBrowserConfig(msgValorEntrada) | |
self.printLogTextBrowserConfig(msgStopGain) | |
self.printLogTextBrowserConfig(msgStopLoss) | |
self.printLogTextBrowserConfig(f"<br>{emoji.emojize(':white_check_mark: CONFIGURAÇÕES SALVAS.', use_aliases=True)} ") | |
#============ Salva as configurações no Firebase | |
self.SalvaConfigTradeFirebaseV2() | |
else: | |
self.printLogTextBrowserConfig("Não há conexão com a internet!<br>Por favor, tente novamente.") | |
def isTraderIDSubscriber(self,rcvMsg): | |
global _trader_id | |
global _client_id | |
_json_data = json.loads(rcvMsg) | |
json_trader_id = _json_data['trader_id'] | |
trader_id_list = [] | |
for k in _trader_id: | |
trader_id_list = _trader_id[k] | |
for k in range(len(trader_id_list)): | |
if json_trader_id == trader_id_list[k]: | |
r = True | |
print(f"client:{_client_id} is subscribed on trader: {json_trader_id}") | |
return r | |
r = False | |
print(f"client:{_client_id} is NOT subscribed on trader: {json_trader_id}") | |
return r | |
#=========== Definia as funções envio, codificação e decodificação da mensagem | |
def receiveClientMsg(self): | |
global _client | |
''' | |
#===== INICIA O WORKER RUNNABLE PARA MANIPULAR AS ORDENS | |
self.worker = Worker() | |
self.worker.signal.finished.connect(self.handle_result_worker) | |
self.qt_threadpool_globalinstance = QThreadPool.globalInstance() | |
''' | |
#====== INICIA O WORKER QTHREAD PARA MANIPULAR AS ORDENS | |
self.worker_qthread = WorkerQThread() | |
self.worker_qthread.signal.finished.connect(self.handle_result_worker) | |
is_json = self.is_json(_client.rcvMsg) | |
if is_json: | |
if self.isTraderIDSubscriber(_client.rcvMsg): | |
self.openIqoptionOrderV2(_client.rcvMsg) | |
def handle_result_worker(self, rcvMsg=f''): | |
global _closed_ws_connection | |
#print(f'handle_result: {rcvMsg}') | |
if rcvMsg == "The remote host closed the connection": #The remote host closed the connection (Qwebsocket) | |
print(f'signal: {rcvMsg}') | |
_closed_ws_connection = True | |
self.StopQtWebsocket() | |
self.StartQtWebsocketV2() | |
else: | |
self.printLogTextBrowserOrdens(rcvMsg) | |
def handle_result_worker_zeromq_subscribe(self, rcvMsg=f''): | |
rcvMsg = rcvMsg.split(" ") | |
notification = rcvMsg[1] | |
notification = notification.split("=") | |
is_digital = notification[0] | |
if is_digital == 'False': | |
is_digital = False | |
else: | |
if is_digital == 'True': | |
is_digital = True | |
money = notification[1] | |
goal = notification[2] | |
order = notification[3] | |
expirations_mode = notification[4] | |
expirations_mode = int(expirations_mode) | |
#====== INICIA O WORKER QTHREAD PARA MANIPULAR AS ORDENS | |
self.worker_qthread = WorkerQThread() | |
self.worker_qthread.signal.finished.connect(self.handle_result_worker) | |
json_msg = json.dumps({'is_digital':is_digital,'money':money,'goal':goal,'order':order,'expirations_mode':expirations_mode,'trader_id':_trader_id}) | |
is_json = self.is_json(json_msg) | |
if is_json: | |
self.openIqoptionOrderV2(json_msg) | |
def is_json(self,myjson): | |
try: | |
json_object = json.loads(myjson) | |
except ValueError as e: | |
return False | |
return True | |
def openIqoptionOrderV2(self,json_message): | |
global _valor_entrada,_stop_gain_atingido, _stop_loss_atingido,_client_id | |
if not _stop_loss_atingido: | |
if not _stop_gain_atingido: | |
json_dec = json.loads(json_message) | |
self.is_digital = json_dec['is_digital'] | |
self.m = _valor_entrada | |
self.g = json_dec['goal'] | |
self.o = json_dec['order'] | |
self.exp = json_dec['expirations_mode'] | |
tipo_conta = self.getCbTipoConta() | |
if tipo_conta == _TIPO_CONTA_DEMO: | |
self.tipo_conta = "D" | |
else: | |
if tipo_conta == _TIPO_CONTA_REAL: | |
self.tipo_conta = "R" | |
''' | |
#====== START O WORKER RUNNABLE | |
self.worker.setMainWindowObj(self) | |
self.qt_threadpool_globalinstance.start(self.worker) | |
''' | |
#===== START O WORKER QTHREAD | |
self.worker_qthread.setMainWindowObj(self) | |
self.worker_qthread.start() | |
self.worker_qthread.exec() | |
QtTest.QTest.qWait(1000) | |
else: | |
self.txt_browser_log.append("<br><AVISO> ORDEM NÃO ABERTA - RAZÃO: STOP GAIN DIÁRIO ATINGIDO") | |
else: | |
self.txt_browser_log.append("<br><AVISO> ORDEM NÃO ABERTA - RAZÃO: STOP LOSS DIÁRIO ATINGIDO") | |
def openIqoptionOrder(self,json_message): | |
global _valor_entrada,_stop_gain_atingido, _stop_loss_atingido,_client_id | |
''' | |
data_hoje = (datetime.now()).strftime("%d_%m_%Y") | |
stop_loss_atingido = self.getValueChild([_client_id,'n_trades',data_hoje,'stop_loss_diario']) | |
stop_gain_atingido = self.getValueChild([_client_id,'n_trades',data_hoje,'stop_gain_diario']) | |
''' | |
if not _stop_loss_atingido: | |
if not _stop_gain_atingido: | |
json_dec = json.loads(json_message) | |
#print("Open Client order") | |
#print(json_dec['money']) | |
#print(json_dec['goal']) | |
#print(json_dec['order']) | |
#print(json_dec['expirations_mode']) | |
#m = json_dec['money'] | |
m = _valor_entrada | |
g = json_dec['goal'] | |
o = json_dec['order'] | |
exp = json_dec['expirations_mode'] | |
#==== Abre ordem em opções binárias | |
self.iqoption_api.buy(m,g,o,exp) | |
#self.iqoption_api.buy(json_dec['money'],json_dec['goal'],json_dec['order'],json_dec['expirations_mode']) | |
data_hora_hoje = (datetime.now()).strftime("%d/%m/%Y, %H:%M:%S") | |
rcvMsg = "Ordem Recebida: " +" - "+ data_hora_hoje +" - "+ "Entrada: "+str(m) + " Par: " + json_dec['goal'] + " - " +" Direção: "+ json_dec['order'] + " - " +" Tempo de Expiração: "+ str(json_dec['expirations_mode']) | |
self.txt_browser_log.append(rcvMsg) | |
#self.iqoption_api.buy() | |
#======== Vericia se Meta Diária foi batida | |
self.calculaMetaDiaria() | |
#if historico_stop_gain >= _stop_gain or historico_stop_loss >= _stop_loss | |
#==== Contabiliza ordem | |
self.contabilizaTradeHoje() | |
#==== Inicializar checkador de ordem em paralelo | |
#self.CheckOpenOrder(exp) | |
else: | |
self.txt_browser_log.append("<AVISO> ORDEM NÃO ABERTA - RAZÃO: STOP GAIN DIÁRIO ATINGIDO") | |
else: | |
self.txt_browser_log.append("<AVISO> ORDEM NÃO ABERTA - RAZÃO: STOP LOSS DIÁRIO ATINGIDO") | |
#===== Atualiza o balanço | |
balance = self.iqoption_api.get_balance() | |
currency = self.iqoption_api.api.profile.balances[0]['currency'] #currency = json_['currency'] | |
self.balanco_valor.setText(str(balance) +" "+currency) | |
def contabilizaTradeHoje(self): | |
global _client_id | |
data_hoje = (datetime.now()).strftime("%d_%m_%Y") | |
exist_record_num_trade = self.existeRecordNumTradesHoje(data_hoje) | |
if exist_record_num_trade == None: | |
num_trades= 1 | |
self.fb_database.post('Cliente' + '/' + _client_id + '/' + 'n_trades' + '/'+data_hoje,num_trades) | |
# Insere em 'Client' / '???client_id???' / 'n_trades' / 'data_hoje' | |
else: | |
num_trades = None | |
data_hoje_id = None | |
for key in exist_record_num_trade: | |
if key != 'stop_loss_diario' and key != 'stop_gain_diario': | |
num_trades = exist_record_num_trade[key] | |
data_hoje_id = key | |
num_trades = num_trades + 1 | |
self.fb_database.put('Cliente' + '/' + _client_id + '/' + 'n_trades' + '/' + data_hoje, data_hoje_id,num_trades) | |
def calculaMetaDiaria(self): | |
global _stop_loss,_stop_gain,_stop_gain_atingido,_stop_loss_atingido | |
global _client_id | |
data_hoje = (datetime.now()).strftime("%d_%m_%Y") | |
record = self.fb_database.get('Cliente',_client_id + '/' + 'n_trades' +'/'+ data_hoje) | |
num_trades = None | |
if record == None: | |
num_trades= 0 | |
self.fb_database.post('Cliente' + '/' + _client_id + '/' + 'n_trades' + '/'+data_hoje,num_trades) | |
else: | |
for key in record: | |
if key != 'stop_loss_diario' and key != 'stop_gain_diario': | |
num_trades = record[key] | |
json_ = {} | |
json_ = self.iqoption_api.get_optioninfo_v2(num_trades) | |
historico_stop_gain = 0 | |
historico_stop_loss = 0 | |
for k in range(len(json_['msg']['closed_options'])): | |
profit = json_['msg']['closed_options'][k]['win_amount'] - json_['msg']['closed_options'][k]['amount'] | |
if profit >= 0: | |
historico_stop_gain = historico_stop_gain + profit | |
else: | |
if profit < 0: | |
historico_stop_loss = historico_stop_loss + profit | |
total_profit = historico_stop_gain + historico_stop_loss | |
if total_profit <= _stop_loss: | |
self.txt_browser_log.append("<AVISO> STOP LOSS DIÁRIO ATINGIDO") | |
_stop_loss_atingido = True | |
''' | |
stop_loss_diario_id = self.getChildID([_client_id,'n_trades',data_hoje,'stop_loss_diario']) | |
self.fb_database.put('Cliente' + '/' + _client_id + '/' + 'n_trades' + '/' + data_hoje +'/'+ 'stop_loss_diario' , stop_loss_diario_id,_stop_loss_atingido) | |
''' | |
return | |
if total_profit >= _stop_gain: | |
self.txt_browser_log.append("<AVISO> STOP GAIN DIÁRIO ATINGIDO") | |
_stop_gain_atingido = True | |
return | |
def sendMsgAllClients(self,json_message): | |
global _client | |
_client.msg = json_message | |
_client.send_message() | |
def printLogTextBrowserConfig(self,message): | |
self.txt_browser_log_configuracoes.append(message) | |
def printLogTextBrowserOrdens(self,message): | |
self.txt_browser_log.append(message) | |
def openOrderOnTraderAccount(self,json_msg): | |
''' | |
#===== INICIA O WORKER RUNNABLE | |
self.worker = Worker() | |
self.worker.signal.finished.connect(self.handle_result_worker) | |
self.qt_threadpool_globalinstance = QThreadPool.globalInstance() | |
''' | |
#====== INICIA O WORKER QTHREAD PARA MANIPULAR AS ORDENS | |
self.worker_qthread = WorkerQThread() | |
self.worker_qthread.signal.finished.connect(self.handle_result_worker) | |
is_json = self.is_json(json_msg) | |
if is_json: | |
self.openIqoptionOrderV2(json_msg) | |
def buildCallOrder(self): | |
global _valor_entrada | |
global _trader_id | |
if self.is_internet(): | |
if self.iqoption_api.check_connect()==False: | |
self.printLogTextBrowserOrdens("<br>RECONCTANDO-SE À IQPTION BROKER ...") | |
check,reason=self.iqoption_api.connect() | |
if check: | |
self.printLogTextBrowserOrdens("<br>RECONECTADO COM SUCESSO ... [ok]") | |
money = _valor_entrada | |
goal = None | |
if self.cb_otc.isChecked() == True: | |
goal = self.getCurrentRadioButtonPar() + '-' + 'OTC' #goal = self.cb_par.currentText() + '-' + 'OTC' | |
else: | |
goal = self.getCurrentRadioButtonPar() #goal = self.cb_par.currentText() | |
order = "call" | |
is_digital = False | |
if self.cb_digital.isChecked() == True: | |
is_digital = True | |
expirations_mode = self.fld_expiracao.text() | |
if expirations_mode == '': | |
self.printLogTextBrowserOrdens("<br><AVISO> TEMPO DE EXPIRAÇÃO NÃO PODE SER VAZIO") | |
else: | |
expirations_mode = int(expirations_mode) | |
json_msg = json.dumps({'is_digital':is_digital,'money':money,'goal':goal,'order':order,'expirations_mode':expirations_mode,'trader_id':_trader_id}) | |
self.sendMsgAllClients(json_msg) | |
msg= str(money)+" - "+goal+" - "+order+" - "+str(expirations_mode) | |
#self.printLogTextBrowserOrdens(msg) | |
#==== Abre order na conta do Trader | |
self.openOrderOnTraderAccount(json_msg) | |
else: | |
self.printLogTextBrowserOrdens(f"<br>PROBLEMAS NA RECONEXÃO COM BROKER. MOTIVO: {reason}... [ok]") | |
else: | |
money = _valor_entrada | |
goal = None | |
if self.cb_otc.isChecked() == True: | |
goal = self.getCurrentRadioButtonPar() + '-' + 'OTC' #goal = self.cb_par.currentText() + '-' + 'OTC' | |
else: | |
goal = self.getCurrentRadioButtonPar() #goal = self.cb_par.currentText() | |
order = "call" | |
is_digital = False | |
if self.cb_digital.isChecked() == True: | |
is_digital = True | |
expirations_mode = self.fld_expiracao.text() | |
if expirations_mode == '': | |
self.printLogTextBrowserOrdens("<br><AVISO> TEMPO DE EXPIRAÇÃO NÃO PODE SER VAZIO") | |
else: | |
expirations_mode = int(expirations_mode) | |
json_msg = json.dumps({'is_digital':is_digital,'money':money,'goal':goal,'order':order,'expirations_mode':expirations_mode,'trader_id':_trader_id}) | |
self.sendMsgAllClients(json_msg) | |
msg= str(money)+" - "+goal+" - "+order+" - "+str(expirations_mode) | |
#self.printLogTextBrowserOrdens(msg) | |
#==== Abre order na conta do Trader | |
self.openOrderOnTraderAccount(json_msg) | |
else: | |
self.printLogTextBrowserOrdens(f"<br>NÃO HÁ CONEXÃO COM A INTERNET.<br>VOCÊ PERDEU CONEXÃO COM O HOST REMOTO.POR FAVOR, CLIQUE NO BOTÃO 'PARAR' E EM SEGUIDA NO BOTÃO 'INICIAR' PARA UM NOVA CONEXÃO. ") | |
def buildPutOrder(self): | |
global _valor_entrada | |
global _trader_id | |
if self.is_internet(): | |
if self.iqoption_api.check_connect()==False: | |
self.printLogTextBrowserOrdens("<br>RECONCTANDO-SE À IQPTION BROKER ...") | |
check,reason=self.iqoption_api.connect() | |
if check: | |
self.printLogTextBrowserOrdens("<br>RECONECTADO COM SUCESSO ... [ok]") | |
money = _valor_entrada | |
goal = None | |
if self.cb_otc.isChecked() == True: | |
goal = self.getCurrentRadioButtonPar() + '-' + 'OTC' #goal = self.cb_par.currentText() + '-' + 'OTC' | |
else: | |
goal = self.getCurrentRadioButtonPar() #goal = self.cb_par.currentText() | |
order = "put" | |
is_digital = False | |
if self.cb_digital.isChecked() == True: | |
is_digital = True | |
expirations_mode = self.fld_expiracao.text() | |
if expirations_mode == '': | |
self.printLogTextBrowserOrdens("<br><AVISO> TEMPO DE EXPIRAÇÃO NÃO PODE SER VAZIO") | |
else: | |
expirations_mode = int(expirations_mode) | |
json_msg = json.dumps({'is_digital':is_digital,'money':money,'goal':goal,'order':order,'expirations_mode':expirations_mode,'trader_id':_trader_id}) | |
self.sendMsgAllClients(json_msg) | |
msg= str(money)+" - "+goal+" - "+order+" - "+str(expirations_mode) | |
#self.printLogTextBrowserOrdens(msg) | |
#==== Abre order na conta do Trader | |
self.openOrderOnTraderAccount(json_msg) | |
else: | |
self.printLogTextBrowserOrdens(f"<br>PROBLEMAS NA RECONEXÃO COM BROKER. MOTIVO: {reason}... [ok]") | |
else: | |
money = _valor_entrada | |
goal = None | |
if self.cb_otc.isChecked() == True: | |
goal = self.getCurrentRadioButtonPar() + '-' + 'OTC' #goal = self.cb_par.currentText() + '-' + 'OTC' | |
else: | |
goal = self.getCurrentRadioButtonPar() #goal = self.cb_par.currentText() | |
order = "put" | |
is_digital = False | |
if self.cb_digital.isChecked() == True: | |
is_digital = True | |
expirations_mode = self.fld_expiracao.text() | |
if expirations_mode == '': | |
self.printLogTextBrowserOrdens("<br><AVISO> TEMPO DE EXPIRAÇÃO NÃO PODE SER VAZIO") | |
else: | |
expirations_mode = int(expirations_mode) | |
json_msg = json.dumps({'is_digital':is_digital,'money':money,'goal':goal,'order':order,'expirations_mode':expirations_mode,'trader_id':_trader_id}) | |
self.sendMsgAllClients(json_msg) | |
msg= str(money)+" - "+goal+" - "+order+" - "+str(expirations_mode) | |
#self.printLogTextBrowserOrdens(msg) | |
#==== Abre order na conta do Trader | |
self.openOrderOnTraderAccount(json_msg) | |
else: | |
self.printLogTextBrowserOrdens(f"<br>NÃO HÁ CONEXÃO COM A INTERNET.<br>VOCÊ PERDEU CONEXÃO COM O HOST REMOTO.POR FAVOR, CLIQUE NO BOTÃO 'PARAR' E EM SEGUIDA NO BOTÃO 'INICIAR' PARA UM NOVA CONEXÃO. ") | |
#================== Define funções QtWs | |
def printServerLog(self): | |
self.printLogTextBrowserOrdens(self.server.newConnectionLog) | |
self.server.newConnectionLog = None | |
def sendClientDisconnectIDX(self): | |
global _client | |
if not _client.client_qws_idx == None: | |
_client.msg = _client.client_qws_idx+"xpto" #index | |
_client.send_message() | |
def ClickBtnStopQtWebsocket(self): | |
global _click_btn_action | |
_click_btn_action = True | |
self.StopQtWebsocket() | |
def StopQtWebsocket(self): | |
global _isConnected | |
global _client | |
global _closed_ws_connection, _click_btn_action | |
if _isConnected: | |
if _tipo_cliente == "sender": | |
#self.printLogTextBrowserOrdens("[OK] CLIENTE-TRADER PARADO!") | |
self.sendClientDisconnectIDX() | |
_client.client.close() #self.triggerqtclient.quit_app() | |
self.btn_parar_servidor.setEnabled(False) | |
self.btn_iniciar_servidor.setEnabled(True) | |
_isConnected = False | |
if _click_btn_action: | |
self.printLogTextBrowserOrdens("<br><AVISO>SERVIÇO DE ENVIO DE ORDENS PARADO ... [OK]") | |
_click_btn_action = False | |
else: | |
if _closed_ws_connection: | |
_closed_ws_connection = False | |
self.btn_call.clicked.disconnect(self.buildCallOrder) | |
self.btn_put.clicked.disconnect(self.buildPutOrder) | |
else: | |
if _tipo_cliente == "receiver": | |
self.sendClientDisconnectIDX() | |
_client.client.close() #self.triggerqtclient.quit_app() | |
self.btn_parar_copy.setEnabled(False) | |
self.btn_iniciar_copy.setEnabled(True) | |
_isConnected = False | |
if _click_btn_action: | |
self.printLogTextBrowserOrdens("SERVIÇO DE CÓPIA DE ORDENS PARADO ... [OK]") | |
_click_btn_action = False | |
else: | |
if _closed_ws_connection: | |
_closed_ws_connection = False | |
def getServerPort(self): | |
if self.is_internet(): | |
port = self.fb_database.get('Servidor','port') | |
return port | |
else: | |
#self.printLogTextBrowserOrdens("Não há conexão com a internet!<br>Por favor, tente novamente." | |
pass | |
def getServerIP(self): | |
if self.is_internet(): | |
ip = self.fb_database.get('Servidor','ip') | |
return ip | |
else: | |
self.printLogTextBrowserOrdens("<br>NÃO HÁ CONEXÃO COM A INTERNET.<br>POR FAVOR, CLIQUE NO BOTÃO 'INICIAR' PARA UM NOVA CONEXÃO. .") | |
def getServerLocalIP(self): | |
if self.is_internet(): | |
local_ip = self.fb_database.get('Servidor','local_ip') | |
return local_ip | |
else: | |
self.printLogTextBrowserOrdens("<br>NÃO HÁ CONEXÃO COM A INTERNET.<br>POR FAVOR, CLIQUE NO BOTÃO 'INICIAR' PARA UM NOVA CONEXÃO. .") | |
def getIsLocal(self): | |
if self.is_internet(): | |
isLocal = self.fb_database.get('Servidor','isLocal') | |
if isLocal: | |
isLocal = True | |
return isLocal | |
else: | |
isLocal = False | |
return isLocal | |
else: | |
pass | |
#self.printLogTextBrowserOrdens("Não há conexão com a internet!<br>Por favor, tente novamente.") | |
def buildURL(self): | |
self.port = self.getServerPort() | |
self.isLocal = self.getIsLocal() | |
self.state_con = None | |
if self.isLocal: | |
self.ip = self.getServerLocalIP() | |
else: | |
self.ip = self.getServerIP() | |
#====== IP PARA PRODUÇÃO | |
self.url = "ws://"+str(self.ip)+":"+str(self.port) | |
#====== IP E PORTA PARA TESTES LOCAL | |
#self.url = "ws://127.0.0.1:8080" | |
def NewClientTraderConnection(self): | |
global _client | |
global _closed_ws_connection,_click_btn_action | |
#self.triggerqtclient = TriggerQtWclient() | |
QTimer.singleShot(2000,ping) | |
#QTimer.singleShot(3000,send_message) | |
''' | |
self.btn_call.clicked.connect(self.buildCallOrder) | |
self.btn_put.clicked.connect(self.buildPutOrder) | |
''' | |
_client = MyQtWclient(app,self.url) | |
#_client.client.textMessageReceived.connect(self.countClientArrived) | |
_client.signal.finished.connect(self.handle_result_worker) | |
self.setTrderIdTrader() | |
result = None | |
while True: | |
QtWidgets.QApplication.processEvents() | |
if _client.msg.find("[onPong]") != -1: | |
_client.msg = "bla bla bla" | |
if _click_btn_action: | |
msg = f"<br>{emoji.emojize(':white_check_mark: CONECTADO AO SERVER-TRADER', use_aliases=True)} " | |
self.printLogTextBrowserOrdens(msg) | |
_click_btn_action = False | |
else: | |
if _closed_ws_connection: | |
msg = f"<br>{emoji.emojize(':white_check_mark: CHECAGEM NA CONEXÃO', use_aliases=True)} " | |
self.printLogTextBrowserOrdens(msg) | |
send_message() | |
self.btn_call.clicked.connect(self.buildCallOrder) | |
self.btn_put.clicked.connect(self.buildPutOrder) | |
result='ok' | |
break | |
else: | |
if _client.msg.find("[onError]") != -1: | |
if _client.client.errorString()=='Invalid URL': | |
self.printLogTextBrowserOrdens(f"<br><AVISO> NÃO FOI POSSIVEL SE CONECTAR AO TRADER-SERVER. MOTIVO: Não há conexão com a internet ...") | |
_client.client.close() | |
result='error' | |
break | |
return result | |
''' | |
def countClientArrived(self): | |
global _client | |
self.printLogTextBrowserOrdens(f"NÚMERO DE CLIENTES CONECTADOS: {_client.client_counter}") | |
''' | |
def setTrderIdTrader(self): | |
global _trader_id | |
global _client | |
_client.trader_id = _trader_id | |
def NewClientClientConnection(self): | |
global _client | |
global _trader_id | |
global _closed_ws_connection,_click_btn_action | |
#self.triggerqtclient = TriggerQtWclient() | |
QTimer.singleShot(2000,ping) | |
#QTimer.singleShot(3000,send_message) | |
_client = MyQtWclient(app,self.url) | |
_client.client.textMessageReceived.connect(self.receiveClientMsg) | |
_client.signal.finished.connect(self.handle_result_worker) | |
result = None | |
while True: | |
QtWidgets.QApplication.processEvents() | |
if _client.msg.find("[onPong]") != -1: | |
_client.msg = "bla bla bla" | |
if _click_btn_action: | |
msg = f"<br>{emoji.emojize(':white_check_mark: CONECTADO AO SERVIÇO DE TRADER', use_aliases=True)} " | |
self.printLogTextBrowserOrdens(msg) | |
_click_btn_action = False | |
else: | |
if _closed_ws_connection: | |
msg = f"<br>{emoji.emojize(':white_check_mark: CHECAGEM NA CONEXÃO', use_aliases=True)} " | |
self.printLogTextBrowserOrdens(msg) | |
send_message() | |
result='ok' | |
break | |
else: | |
if _client.msg.find("[onError]") != -1: | |
if _client.client.errorString()=='Invalid URL': | |
self.printLogTextBrowserOrdens(f"<AVISO>NÃO FOI POSSIVEL SE CONECTAR AO SERVIÇO DE TRADER. MOTIVO: Não há conexão com a internt ...") | |
_client.client.close() | |
result='error' | |
break | |
#self.setHandShakeClient() | |
#self.printLogTextBrowserOrdens("CONECTADO AO SERVIÇO DE TRADER! ... [OK]") | |
return result | |
''' | |
def setHandShakeClient(self): | |
global _client | |
global _trader_id | |
_json = {} | |
_json['msg'] = 'bla bla bla' | |
_json['trader_id'] = _trader_id | |
_client.msg = json.dumps(_json) | |
''' | |
def StopClientConnection(self): | |
global _client | |
_client.close() | |
def getCurrentRadioButtonPar(self): | |
if self.rb_AUDJPY.isChecked(): | |
return "AUDJPY" | |
if self.rb_AUDCAD.isChecked(): | |
return "AUDCAD" | |
if self.rb_AUDUSD.isChecked(): | |
return "AUDUSD" | |
if self.rb_AUDCHF.isChecked(): | |
return "AUDCHF" | |
if self.rb_AUDNZD.isChecked(): | |
return "AUDNZD" | |
if self.rb_GBPNZD.isChecked(): | |
return "GBPNZD" | |
if self.rb_GBPAUD.isChecked(): | |
return "GBPAUD" | |
if self.rb_GBPUSD.isChecked(): | |
return "GBPUSD" | |
if self.rb_GBPCAD.isChecked(): | |
return "GBPCAD" | |
if self.rb_GBPJPY.isChecked(): | |
return "GBPJPY" | |
if self.rb_GBPCHF.isChecked(): | |
return "GBPCHF" | |
if self.rb_USDJPY.isChecked(): | |
return "USDJPY" | |
if self.rb_USDCAD.isChecked(): | |
return "USDCAD" | |
if self.rb_USDCHF.isChecked(): | |
return "USDCHF" | |
if self.rb_USDNOK.isChecked(): | |
return "USDNOK" | |
if self.rb_CADJPY.isChecked(): | |
return "CADJPY" | |
if self.rb_CADCHF.isChecked(): | |
return "CADCHF" | |
if self.rb_CHFJPY.isChecked(): | |
return "CHFJPY" | |
if self.rb_EURNZD.isChecked(): | |
return "EURNZD" | |
if self.rb_EURCAD.isChecked(): | |
return "EURCAD" | |
if self.rb_EURAUD.isChecked(): | |
return "EURAUD" | |
if self.rb_EURGBP.isChecked(): | |
return "EURGBP" | |
if self.rb_EURJPY.isChecked(): | |
return "EURJPY" | |
if self.rb_EURUSD.isChecked(): | |
return "EURUSD" | |
if self.rb_NZDUSD.isChecked(): | |
return "NZDUSD" | |
def buildCallOrderV2(self): | |
global _valor_entrada | |
global _trader_id | |
global _trader_idV2 | |
global _client_id #<<<< client_id == trader_id para o trader | |
global _SOCKET_REQ | |
if self.is_internet(): | |
if self.iqoption_api.check_connect()==False: | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':electric_plug: :zap: RECONECTANDO-SE À IQPTION BROKER ...', use_aliases=True)} ") #"<br>RECONCTANDO-SE À IQPTION BROKER ..." | |
check,reason=self.iqoption_api.connect() | |
if check: | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':white_check_mark: RECONECTADO COM SUCESSO', use_aliases=True)} ") | |
money = _valor_entrada | |
goal = None | |
if self.cb_otc.isChecked() == True: | |
goal = self.getCurrentRadioButtonPar() + '-' + 'OTC' #goal = self.cb_par.currentText() + '-' + 'OTC' | |
else: | |
goal = self.getCurrentRadioButtonPar() #goal = self.cb_par.currentText() | |
if goal == None: | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':warning: TEMPO DE EXPIRAÇÃO NÃO PODE SER VAZIO', use_aliases=True)} ") | |
return | |
order = "call" | |
is_digital = False | |
classe_trade = "" | |
if self.cb_digital.isChecked() == True: | |
is_digital = True | |
classe_trade = "DIGITAL" | |
else: | |
classe_trade = "BINARIA" | |
expirations_mode = self.fld_expiracao.text() | |
if expirations_mode == '': | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':warning: TEMPO DE EXPIRAÇÃO NÃO PODE SER VAZIO', use_aliases=True)} ")# "<br><AVISO> TEMPO DE EXPIRAÇÃO NÃO PODE SER VAZIO" | |
else: | |
expirations_mode = int(expirations_mode) | |
work_message = {'trader_id':_client_id,'is_digital':is_digital,'money':money,'goal':goal,'order':order,'expirations_mode':expirations_mode} | |
work_messageV2 = {'trader_id':_trader_idV2,'is_digital':is_digital,'money':money,'goal':goal,'order':order,'expirations_mode':expirations_mode} | |
QtWidgets.QApplication.processEvents() | |
_SOCKET_REQ.send_json(work_messageV2) | |
message = _SOCKET_REQ.recv() | |
print(message) | |
#json_msg = json.dumps({'is_digital':is_digital,'money':money,'goal':goal,'order':order,'expirations_mode':expirations_mode,'trader_id':_trader_id}) | |
#self.sendMsgAllClients(json_msg) | |
#msg= str(money)+" - "+goal+" - "+order+" - "+str(expirations_mode) | |
#self.printLogTextBrowserOrdens(msg) | |
#==== Abre order na conta do Trader | |
json_msg = json.dumps(work_message) | |
self.openOrderOnTraderAccount(json_msg) | |
else: | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':warning: PROBLEMAS NA RECONEXÃO COM BROKER. ', use_aliases=True)} MOTIVO: {reason} ") #f"<br>PROBLEMAS NA RECONEXÃO COM BROKER. MOTIVO: {reason}... [ok]" | |
else: | |
money = _valor_entrada | |
goal = None | |
if self.cb_otc.isChecked() == True: | |
goal = self.getCurrentRadioButtonPar() + '-' + 'OTC' #goal = self.cb_par.currentText() + '-' + 'OTC' | |
else: | |
goal = self.getCurrentRadioButtonPar() #goal = self.cb_par.currentText() | |
order = "call" | |
is_digital = False | |
classe_trade = "" | |
if self.cb_digital.isChecked() == True: | |
is_digital = True | |
classe_trade = "DIGITAL" | |
else: | |
classe_trade = "BINARIA" | |
expirations_mode = self.fld_expiracao.text() | |
if expirations_mode == '': | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':warning: TEMPO DE EXPIRAÇÃO NÃO PODE SER VAZIO', use_aliases=True)} ") | |
else: | |
expirations_mode = int(expirations_mode) | |
work_message = {'trader_id':_client_id,'is_digital':is_digital,'money':money,'goal':goal,'order':order,'expirations_mode':expirations_mode} | |
work_messageV2 = {'trader_id':_trader_idV2,'is_digital':is_digital,'money':money,'goal':goal,'order':order,'expirations_mode':expirations_mode} | |
QtWidgets.QApplication.processEvents() | |
_SOCKET_REQ.send_json(work_messageV2) | |
message = _SOCKET_REQ.recv() | |
print(message) | |
#json_msg = json.dumps({'is_digital':is_digital,'money':money,'goal':goal,'order':order,'expirations_mode':expirations_mode,'trader_id':_trader_id}) | |
#self.sendMsgAllClients(json_msg) | |
#msg= str(money)+" - "+goal+" - "+order+" - "+str(expirations_mode) | |
#self.printLogTextBrowserOrdens(msg) | |
#==== Abre order na conta do Trader | |
json_msg = json.dumps(work_message) | |
self.openOrderOnTraderAccount(json_msg) | |
else: | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':warning: SEM CONEXÃO COM A INTERNET', use_aliases=True)} ") | |
def buildPutOrderV2(self): | |
global _valor_entrada | |
global _trader_id | |
global _trader_idV2 | |
global _client_id #<<<< client_id == trader_id para o trader | |
global _SOCKET_REQ | |
if self.is_internet(): | |
if self.iqoption_api.check_connect()==False: | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':electric_plug: :zap: RECONECTANDO-SE À IQPTION BROKER ...', use_aliases=True)} ") | |
check,reason=self.iqoption_api.connect() | |
if check: | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':white_check_mark: RECONECTADO COM SUCESSO', use_aliases=True)} ") | |
money = _valor_entrada | |
goal = None | |
if self.cb_otc.isChecked() == True: | |
goal = self.getCurrentRadioButtonPar() + '-' + 'OTC' #goal = self.cb_par.currentText() + '-' + 'OTC' | |
else: | |
goal = self.getCurrentRadioButtonPar() #goal = self.cb_par.currentText() | |
if goal == None: | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':warning: TEMPO DE EXPIRAÇÃO NÃO PODE SER VAZIO', use_aliases=True)} ") | |
return | |
order = "put" | |
classe_trade = "" | |
if self.cb_digital.isChecked() == True: | |
is_digital = True | |
classe_trade = "DIGITAL" | |
else: | |
classe_trade = "BINARIA" | |
expirations_mode = self.fld_expiracao.text() | |
if expirations_mode == '': | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':warning: TEMPO DE EXPIRAÇÃO NÃO PODE SER VAZIO', use_aliases=True)} ") | |
else: | |
expirations_mode = int(expirations_mode) | |
#json_msg = json.dumps({'is_digital':is_digital,'money':money,'goal':goal,'order':order,'expirations_mode':expirations_mode,'trader_id':_trader_id}) | |
#self.sendMsgAllClients(json_msg) | |
work_message = {'trader_id':_client_id,'is_digital':is_digital,'money':money,'goal':goal,'order':order,'expirations_mode':expirations_mode} | |
work_messageV2 = {'trader_id':_trader_idV2,'is_digital':is_digital,'money':money,'goal':goal,'order':order,'expirations_mode':expirations_mode} | |
QtWidgets.QApplication.processEvents() | |
_SOCKET_REQ.send_json(work_messageV2) | |
message = _SOCKET_REQ.recv() | |
print(message) | |
#msg= str(money)+" - "+goal+" - "+order+" - "+str(expirations_mode) | |
#self.printLogTextBrowserOrdens(msg) | |
#==== Abre order na conta do Trader | |
json_msg = json.dumps(work_message) | |
self.openOrderOnTraderAccount(json_msg) | |
else: | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':warning: PROBLEMAS NA RECONEXÃO COM BROKER. ', use_aliases=True)} MOTIVO: {reason} ") | |
else: | |
money = _valor_entrada | |
goal = None | |
if self.cb_otc.isChecked() == True: | |
goal = self.getCurrentRadioButtonPar() + '-' + 'OTC' #goal = self.cb_par.currentText() + '-' + 'OTC' | |
else: | |
goal = self.getCurrentRadioButtonPar() #goal = self.cb_par.currentText() | |
order = "put" | |
is_digital = False | |
classe_trade = "" | |
if self.cb_digital.isChecked() == True: | |
is_digital = True | |
classe_trade = "DIGITAL" | |
else: | |
classe_trade = "BINARIA" | |
expirations_mode = self.fld_expiracao.text() | |
if expirations_mode == '': | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':warning: TEMPO DE EXPIRAÇÃO NÃO PODE SER VAZIO', use_aliases=True)} ") | |
else: | |
expirations_mode = int(expirations_mode) | |
#json_msg = json.dumps({'is_digital':is_digital,'money':money,'goal':goal,'order':order,'expirations_mode':expirations_mode,'trader_id':_trader_id}) | |
#self.sendMsgAllClients(json_msg) | |
work_message = {'trader_id':_client_id,'is_digital':is_digital,'money':money,'goal':goal,'order':order,'expirations_mode':expirations_mode} | |
work_messageV2 = {'trader_id':_trader_idV2,'is_digital':is_digital,'money':money,'goal':goal,'order':order,'expirations_mode':expirations_mode} | |
QtWidgets.QApplication.processEvents() | |
_SOCKET_REQ.send_json(work_messageV2) | |
message = _SOCKET_REQ.recv() | |
print(message) | |
#msg= str(money)+" - "+goal+" - "+order+" - "+str(expirations_mode) | |
#self.printLogTextBrowserOrdens(msg) | |
#==== Abre order na conta do Trader | |
json_msg = json.dumps(work_message) | |
self.openOrderOnTraderAccount(json_msg) | |
else: | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':warning: SEM CONEXÃO COM A INTERNET', use_aliases=True)} ") | |
def BtnStartZeroMQRequestClientV2(self): | |
global _client_id #<<<< client_id == trader_id para o trader | |
global _CONTEXT,_SOCKET_REQ | |
if self.is_internet(): | |
self.btn_iniciar_servidor.setEnabled(False) | |
self.btn_parar_servidor.setEnabled(True) | |
self.btn_call.setEnabled(True) | |
self.btn_put.setEnabled(True) | |
_CONTEXT = zmq.Context() | |
_SOCKET_REQ = _CONTEXT.socket(zmq.REQ) | |
snap = self.fb_admin_sdk_rt.recupera_remote_server_tb() | |
ip = "" | |
req_port = "" | |
for key,val in snap.items(): | |
for k,v in val.items(): | |
if k == "pktriot_ipv4": | |
ip = v | |
if k == "req_port": | |
req_port = v | |
host = f"tcp://{ip}:{req_port}" | |
_SOCKET_REQ.connect(host) | |
print(f"Conetando ao REPLY server {host}") | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':hourglass: INICIANDO CONEXÃO COM SERVER-TRADER', use_aliases=True)} ") | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':white_check_mark: CONECTADO AO SERVER-TRADER', use_aliases=True)} ") | |
else: | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':warning: SEM CONEXÃO COM A INTERNET', use_aliases=True)} ") | |
def BtnStartZeroMQRequestClient(self): #>>>>>>>>>>>>>>>>>>>> START Trader | |
global _client_id #<<<< client_id == trader_id para o trader | |
global _CONTEXT,_SOCKET_REQ | |
#===== Import zeromq | |
#import zmq | |
if self.is_internet(): | |
self.btn_iniciar_servidor.setEnabled(False) | |
self.btn_parar_servidor.setEnabled(True) | |
self.btn_call.setEnabled(True) | |
self.btn_put.setEnabled(True) | |
_CONTEXT = zmq.Context() | |
_SOCKET_REQ = _CONTEXT.socket(zmq.REQ) | |
ip = self.fb_database.get('Servidor','pktriot_ipv4') | |
req_port = str(self.fb_database.get('Servidor','req_port')) | |
host = f"tcp://{ip}:{req_port}" | |
_SOCKET_REQ.connect(host) | |
print(f"Conetando ao REPLY server {host}") | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':hourglass: INICIANDO CONEXÃO COM SERVER-TRADER', use_aliases=True)} ") | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':white_check_mark: CONECTADO AO SERVER-TRADER', use_aliases=True)} ") | |
else: | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':warning: SEM CONEXÃO COM A INTERNET', use_aliases=True)} ") | |
def BtnStopZeroMQRequestClientV2(self): | |
global _CONTEXT,_SOCKET_REQ | |
if self.is_internet(): | |
self.btn_iniciar_servidor.setEnabled(True) | |
self.btn_parar_servidor.setEnabled(False) | |
self.btn_call.setEnabled(False) | |
self.btn_put.setEnabled(False) | |
snap = self.fb_admin_sdk_rt.recupera_remote_server_tb() | |
ip = "" | |
req_port = "" | |
for key,val in snap.items(): | |
for k,v in val.items(): | |
if k == "pktriot_ipv4": | |
ip = v | |
if k == "req_port": | |
req_port = v | |
host = f"tcp://{ip}:{req_port}" | |
_SOCKET_REQ.disconnect(host) | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':warning: SERVIÇO PARADO', use_aliases=True)} ") | |
else: | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':warning: SEM CONEXÃO COM A INTERNET', use_aliases=True)} ") | |
def BtnStopZeroMQRequestClient(self): #>>>>>>>>>>>>>>>>>>>> STOP Trader | |
global _CONTEXT,_SOCKET_REQ | |
if self.is_internet(): | |
self.btn_iniciar_servidor.setEnabled(True) | |
self.btn_parar_servidor.setEnabled(False) | |
self.btn_call.setEnabled(False) | |
self.btn_put.setEnabled(False) | |
ip = self.fb_database.get('Servidor','pktriot_ipv4') | |
req_port = str(self.fb_database.get('Servidor','req_port')) | |
host = f"tcp://{ip}:{req_port}" | |
_SOCKET_REQ.disconnect(host) | |
#_SOCKET_REQ = None #_SOCKET_REQ.close() | |
#_CONTEXT = None #_CONTEXT.term() | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':warning: SERVIÇO PARADO', use_aliases=True)} ") | |
else: | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':warning: SEM CONEXÃO COM A INTERNET', use_aliases=True)} ") | |
def BtnStartZeroMQSubscribeClient(self): #>>>>>>>>>>>>>>>>>> START Cliente | |
global _CONTEXT,_SOCKET_SUB | |
global _client_id | |
if self.is_internet(): | |
self.btn_iniciar_copy.setEnabled(False) | |
self.btn_parar_copy.setEnabled(True) | |
record = self.fb_database.get('Cliente',_client_id + '/' + 'trader_id') | |
trader_id_list = None | |
for rec in record: | |
_key = record[rec] | |
print(_key) | |
trader_id_list = _key | |
_CONTEXT = zmq.Context() | |
_SOCKET_SUB = _CONTEXT.socket(zmq.SUB) | |
ip = self.fb_database.get('Servidor','pktriot_ipv4') | |
sub_port = str(self.fb_database.get('Servidor','sub_port')) | |
host = f"tcp://{ip}:{sub_port}" | |
_SOCKET_SUB.connect(host) | |
print(f"Conetando ao PUBLISHER server {host}") | |
for _trader_id in trader_id_list: | |
_SOCKET_SUB.subscribe(_trader_id) | |
print(f"SUBSCRIBE TO LISTENING TO THE TRADER_ID: {_trader_id}") | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':hourglass: INICIANDO CONEXÃO COM TRADER-SERVER', use_aliases=True)} ") | |
self.worker_zeromq_subscribe_client = WorkerZeroMQSubscribeClientQThread() | |
self.worker_zeromq_subscribe_client.signal.finished.connect(self.handle_result_worker_zeromq_subscribe) | |
self.worker_zeromq_subscribe_client.start() | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':white_check_mark: CONECTADO AO SERVER-TRADER', use_aliases=True)} ") | |
else: | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':warning: SEM CONEXÃO COM A INTERNET', use_aliases=True)} ") | |
def BtnStopZeroMQSubscribeClient(self): #>>>>>>>>>>>>>>>>>> STOP Cliente | |
global _CONTEXT,_SOCKET_SUB | |
if self.is_internet(): | |
self.worker_zeromq_subscribe_client.stop() | |
self.btn_iniciar_copy.setEnabled(True) | |
self.btn_parar_copy.setEnabled(False) | |
ip = self.fb_database.get('Servidor','pktriot_ipv4') | |
sub_port = str(self.fb_database.get('Servidor','sub_port')) | |
host = f"tcp://{ip}:{sub_port}" | |
_SOCKET_SUB.disconnect(host) | |
#_CONTEXT = None #_CONTEXT.term() | |
#_SOCKET_SUB= None #_SOCKET_SUB.close() | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':warning: SERVIÇO PARADO', use_aliases=True)} ") | |
else: | |
self.printLogTextBrowserOrdens(f"<br>{emoji.emojize(':warning: SEM CONEXÃO COM A INTERNET', use_aliases=True)} ") | |
def ClickBtnStartQtWebsocketV2(self): | |
global _click_btn_action | |
_click_btn_action = True | |
self.StartQtWebsocketV2() | |
def StartQtWebsocketV2(self): | |
global _isLocal | |
global _isConnected | |
global _valor_entrada,_stop_gain,_stop_loss | |
global _closed_ws_connection,_click_btn_action | |
valor_entrada = self.fld_valor_entrada.text() | |
cb_valor_entrada = str(self.combo_box_valor_entrada.currentText()) | |
stop_gain = self.fld_stop_gain.text() | |
cb_stop_gain = str(self.combo_box_stop_gain.currentText()) | |
stop_loss = self.fld_stop_loss.text() | |
cb_stop_loss = str(self.combo_box_stop_loss.currentText()) | |
if valor_entrada == "" or stop_gain == "" or stop_loss == "": | |
self.printLogTextBrowserOrdens("<!> Configurações NÃO salvas, um ou mais campos estão vazios <!>") | |
else: | |
if self.is_internet(): | |
self.buildURL() | |
if _tipo_cliente == "sender": | |
if _click_btn_action: | |
msg = f"<br>{emoji.emojize(':alarm_clock: AGUARDANDO SERVER-TRADER', use_aliases=True)} " | |
self.printLogTextBrowserOrdens(msg) | |
result = self.NewClientTraderConnection() | |
if not result == 'error': | |
#=========== Desabilita botão Iniciar Cliente e Cliente-Trade | |
self.btn_iniciar_servidor.setEnabled(False) | |
self.btn_parar_servidor.setEnabled(True) | |
_isConnected = True | |
else: | |
if _tipo_cliente == "receiver": | |
if _click_btn_action: | |
msg = f"<br>{emoji.emojize(':alarm_clock: AGUARDANDO TRADER', use_aliases=True)} " | |
self.printLogTextBrowserOrdens(msg) | |
result = self.NewClientClientConnection() | |
if not result == 'error': | |
#=========== Desabilita botão Iniciar Copy | |
self.btn_iniciar_copy.setEnabled(False) | |
self.btn_parar_copy.setEnabled(True) | |
_isConnected = True | |
else: | |
self.printLogTextBrowserOrdens(f"<br>NÃO HÁ CONEXÃO COM A INTERNET.<BR>POR FAVOR, CLIQUE NO BOTÃO 'INICIAR' PARA UM NOVA CONEXÃO.") | |
#================== Define funções para trocar painel do Trader/Cliente | |
def showTraderPainel(self): | |
self.btn_iniciar_copy.hide() | |
self.btn_parar_copy.hide() | |
self.cb_expiracao.hide() | |
self.group_box_trader_painel.show() | |
def hideTraderPainel(self): | |
self.btn_iniciar_copy.show() | |
self.btn_parar_copy.show() | |
self.group_box_trader_painel.hide() | |
#================== Define funções IQoption | |
def setIQoptionTipoConta(self): | |
tipo_conta = self.getCbTipoConta() | |
if tipo_conta == _TIPO_CONTA_DEMO: | |
try: | |
self.iqoption_api.change_balance("PRACTICE") # REAL | |
#profile = self.iqoption_api.get_profile() | |
profile = self.iqoption_api.get_profile_ansyc() | |
parse_profile_json = json.dumps(dict(profile), ensure_ascii=False) | |
json_ = json.loads(parse_profile_json) | |
#balance = json_['result']['balance'] | |
#balance = self.iqoption_api.api.profile.balances[1]['amount'] | |
balance = self.iqoption_api.get_balance() | |
#currency = json_['result']['currency'] # Se usar get_profile() | |
#currency = self.iqoption_api.api.profile.balances[1]['currency'] | |
currency = json_['currency'] #$get_profile_ansyc() | |
self.balanco_valor.setText(str(balance) +" "+currency) | |
except websocket._exceptions.WebSocketConnectionClosedException: | |
if self.iqoption_api.check_connect()==False: | |
self.printLogTextBrowserConfig(f"<!>Não há conexão com a internet.<br>") | |
self.printLogTextBrowserOrdens(f"<!>Não há conexão com a internet.<br>") | |
self.printLogTextBrowserConfig("<!>Tentando se reconectar ...") | |
self.printLogTextBrowserOrdens("<!>Tentando se reconectar ...") | |
check,reason=self.iqoption_api.connect() | |
if check: | |
self.printLogTextBrowserConfig("<!>Reconectado com sucesso! ... [ok]") | |
self.iqoption_api.change_balance("PRACTICE") # REAL | |
#profile = self.iqoption_api.get_profile() | |
profile = self.iqoption_api.get_profile_ansyc() | |
parse_profile_json = json.dumps(dict(profile), ensure_ascii=False) | |
json_ = json.loads(parse_profile_json) | |
#balance = json_['result']['balance'] | |
#balance = self.iqoption_api.api.profile.balances[1]['amount'] | |
balance = self.iqoption_api.get_balance() | |
#currency = json_['result']['currency'] # Se usar get_profile() | |
#currency = self.iqoption_api.api.profile.balances[1]['currency'] | |
currency = json_['currency'] #$get_profile_ansyc() | |
self.balanco_valor.setText(str(balance) +" "+currency) | |
else: | |
self.printLogTextBrowserConfig(f"<!>Problemas na reconexão. MOTIVO: {reason}... [ok]") | |
self.printLogTextBrowserOrdens(f"<!>Problemas na reconexão. MOTIVO: {reason}... [ok]") | |
else: | |
if tipo_conta == _TIPO_CONTA_REAL: | |
try: | |
self.iqoption_api.change_balance("REAL") | |
#profile = self.iqoption_api.get_profile() | |
profile = self.iqoption_api.get_profile_ansyc() | |
parse_profile_json = json.dumps(dict(profile), ensure_ascii=False) | |
json_ = json.loads(parse_profile_json) | |
#balance = json_['result']['balance'] | |
#balance = self.iqoption_api.api.profile.balances[0]['amount'] | |
#currency = json_['result']['currency'] # Se usar get_profile() | |
balance = self.iqoption_api.get_balance() | |
#currency = self.iqoption_api.api.profile.balances[0]['currency'] #currency = json_['currency'] | |
currency = json_['currency'] #$get_profile_ansyc() | |
self.balanco_valor.setText(str(balance) +" "+currency) | |
except websocket._exceptions.WebSocketConnectionClosedException: | |
if self.iqoption_api.check_connect()==False: | |
self.printLogTextBrowserConfig(f"<!>Não há conexão com a internet.<br>") | |
self.printLogTextBrowserOrdens(f"<!>Não há conexão com a internet.<br>") | |
self.printLogTextBrowserConfig("<!>Tentando se reconectar ...") | |
self.printLogTextBrowserOrdens("<!>Tentando se reconectar ...") | |
check,reason=self.iqoption_api.connect() | |
if check: | |
self.printLogTextBrowserConfig("<!>Reconectado com sucesso! ... [ok]") | |
self.iqoption_api.change_balance("REAL") | |
#profile = self.iqoption_api.get_profile() | |
profile = self.iqoption_api.get_profile_ansyc() | |
parse_profile_json = json.dumps(dict(profile), ensure_ascii=False) | |
json_ = json.loads(parse_profile_json) | |
#balance = json_['result']['balance'] | |
#balance = self.iqoption_api.api.profile.balances[0]['amount'] | |
#currency = json_['result']['currency'] # Se usar get_profile() | |
balance = self.iqoption_api.get_balance() | |
#currency = self.iqoption_api.api.profile.balances[0]['currency'] | |
currency = json_['currency'] #$get_profile_ansyc() | |
self.balanco_valor.setText(str(balance) +" "+currency) | |
else: | |
self.printLogTextBrowserConfig(f"<!>Problemas na reconexão. MOTIVO: {reason}... [ok]") | |
self.printLogTextBrowserOrdens(f"<!>Problemas na reconexão. MOTIVO: {reason}... [ok]") | |
#========= Func mostra barra de progresso | |
def startLoading(self): | |
if self.is_internet(): | |
self.aviso_login.hide() | |
self.progressBar.show() | |
self.progressBar.setValue(0) #50 | |
self.timer = QTimer() | |
self.timer.timeout.connect(self.handleTimer) | |
self.timer.start(100) # chama o metodo a cada segundo (1000) | |
else: | |
self.showAvisoMainLogin("Não há conexão com a internet!<br>Por favor, tente novamente.",True) | |
self.fld_login_2.setText("") | |
self.fld_senha_2.setText("") | |
def handleTimer(self): | |
value = self.progressBar.value() | |
if value < 100: | |
value = value + 25 | |
self.progressBar.setValue(value) | |
else: | |
self.timer.stop() | |
self.connectIqoptionV2() | |
def connectIqoptionV2(self): | |
email = self.fld_login_2.text() | |
senha = self.fld_senha_2.text() | |
if email != '' and senha != '': | |
self.iqoption_api = IQ_Option(email,senha) | |
isLogged,result = self.iqoption_api.connect() | |
#I_want_money.connect() | |
if isLogged: | |
print("Logged-in") | |
#profile = I_want_money.get_profile() | |
profile = self.iqoption_api.get_profile_ansyc() | |
parse_profile_json = json.dumps(dict(profile), ensure_ascii=False) | |
json_ = json.loads(parse_profile_json) | |
#profile_id = json_['result']['id'] # get_profile() | |
profile_id = json_['id'] # get_profile() | |
self.id_perfil_corretora_valor.setText(str(profile_id)) | |
#first_name = json_['result']['first_name'] # get_profile() | |
first_name = json_['first_name'] #get_profile_async() | |
self.nome_perfil_valor.setText(str(first_name)) | |
#print(profile_id) | |
self.cb_tipo_conta.setCurrentIndex(1) | |
self.showAvisoMainLogin("Usuário logado!",False) | |
self.progressBar.hide() | |
#Habilita Abas: Configuração e CopyTrading | |
self.enableCopyTradingTab() | |
self.enableConfiguracaoAba() | |
#Habilita Combobox: Tipo de conta (Demo ou Real) | |
self.enableComboBoxTipoConta() | |
#Desabilita Aba: Login Iqoption | |
self.disableIqoptionLoginTab() | |
else: | |
self.showAvisoMainLogin("Credenciais incorretas!",True) | |
self.progressBar.hide() | |
else: | |
print("Campos e-mail e/ou senha vazios!") | |
self.showAvisoMainLogin("Campos e-mail e/ou senha vazios!",True) | |
self.progressBar.hide() | |
def connectIqoption(self): | |
global _client_id | |
email = self.fld_login_2.text() | |
senha = self.fld_senha_2.text() | |
if email != '' and senha != '': | |
I_want_money=IQ_Option(email,senha) | |
self.iqoption_api = I_want_money | |
isLogged,result = self.iqoption_api.connect() | |
#I_want_money.connect() | |
if isLogged: | |
print("Logged-in") | |
#profile = I_want_money.get_profile() | |
profile = self.iqoption_api.get_profile_ansyc() | |
parse_profile_json = json.dumps(dict(profile), ensure_ascii=False) | |
json_ = json.loads(parse_profile_json) | |
#profile_id = json_['result']['id'] # get_profile() | |
profile_id = json_['id'] # get_profile() | |
current_broker_email = None | |
record = self.fb_database.get('Cliente',_client_id + '/' + 'broker_email') | |
if record == None: | |
self.fb_database.post('Cliente' + '/' + _client_id + '/' + 'broker_email',I_want_money.email) | |
else: | |
k= None | |
for key in record: | |
k = key | |
current_broker_email = record[k] | |
#self.fb_database.put('Cliente' + '/' + _client_id + '/' + 'broker_id',k,profile_id) | |
if current_broker_email != I_want_money.email and current_broker_email != None: | |
self.showAvisoMainLogin(f"A conta ({_client_id[0:int(len(_client_id)/2)]}...) já está linkada à conta IQOPTION ({current_broker_email}).<br>Por favor, efetue um novo login!",True) | |
self.progressBar.hide() | |
if _tipo_cliente == "receiver": | |
self.btn_iniciar_copy.setEnabled(False) | |
else: | |
if _tipo_cliente == "sender": | |
self.btn_iniciar_servidor.setEnabled(False) | |
self.btn_parar_servidor.setEnabled(False) | |
self.cb_par.setEnabled(False) | |
self.btn_call.setEnabled(False) | |
self.btn_put.setEnabled(False) | |
#===Limpa campos de login e senha | |
self.fld_login_2.setText("") | |
self.fld_senha_2.setText("") | |
return | |
else: | |
self.id_perfil_corretora_valor.setText(str(profile_id)) | |
#first_name = json_['result']['first_name'] # get_profile() | |
first_name = json_['first_name'] #get_profile_async() | |
self.nome_perfil_valor.setText(str(first_name)) | |
#print(profile_id) | |
self.cb_tipo_conta.setCurrentIndex(1) | |
self.showAvisoMainLogin("Usuário logado!",False) | |
self.progressBar.hide() | |
#Habilita Abas: Configuração e CopyTrading | |
self.enableCopyTradingTab() | |
self.enableConfiguracaoAba() | |
#Habilita Combobox: Tipo de conta (Demo ou Real) | |
self.enableComboBoxTipoConta() | |
#Desabilita Aba: Login Iqoption | |
self.disableIqoptionLoginTab() | |
else: | |
self.showAvisoMainLogin("Credenciais incorretas!",True) | |
self.progressBar.hide() | |
else: | |
print("Campos e-mail e/ou senha vazios!") | |
self.showAvisoMainLogin("Campos e-mail e/ou senha vazios!",True) | |
self.progressBar.hide() | |
def showAvisoMainLogin(self,msg,isError): | |
self.aviso_login.show() | |
if not isError: | |
self.aviso_login.setText("<html><head/><body><p><span style=\" font-weight:600; color:#00aa00;\">"+msg+"</span></p></body></html>") | |
else: | |
self.aviso_login.setText("<html><head/><body><p><span style=\" font-weight:600; color:#ff0000;\">"+msg+"</span></p></body></html>") | |
#================ Define o função que pega o status do combobox de tipo conta | |
def getCbTipoConta(self): | |
cb_tipoconta = self.cb_tipo_conta.currentText() | |
return cb_tipoconta | |
#================= Habilitar componentes | |
def enableComboBoxTipoConta(self): | |
self.cb_tipo_conta.setEnabled(True) | |
#===== Habilita Nome de Perfil | |
def enableDisplayName(self): | |
pass | |
#===== Habilita e Desabilita Aba Broker - Iqoption | |
def enableIqoptionLoginTab(self): | |
self.iqoption_login_tab.setEnabled(True) | |
def disableIqoptionLoginTab(self): | |
self.iqoption_login_tab.setEnabled(False) | |
#===== Habilita e Desabilita Aba Copy Trading | |
def enableCopyTradingTab(self): | |
self.copy_trading_tab.setEnabled(True) | |
#===== Habilita e Desabilita Aba Configurações | |
def enableConfiguracaoAba(self): | |
self.configuracoes_tab.setEnabled(True) | |
#====== Desabilita função de autenticação | |
def disableLoginVizion(self): | |
self.actionVizion_Login.setEnabled(False) | |
#====== Hailibata Menu Ajuda | |
def enableAjudaMenu(self): | |
#self.menuAjuda.setEnabled(True) | |
pass | |
#================== Define funções de database do Firebase | |
def getChildID(self,child_array): | |
data = '' | |
for k in range(len(child_array)): | |
if k == 0: | |
data = data+child_array[k] | |
else: | |
data = data+'/'+child_array[k] | |
r = self.fb_database.get('Cliente',data) | |
num_trades = None | |
k= None | |
for key in r: | |
k = key | |
return k | |
def getValueChild(self,child_array): | |
data = '' | |
for k in range(len(child_array)): | |
if k == 0: | |
data = data+child_array[k] | |
else: | |
data = data+'/'+child_array[k] | |
record = self.fb_database.get('Cliente',data) | |
value = None | |
for k in record: | |
value = record[k] | |
return value | |
def existeRecordNumTradesHoje(self,data_hoje): | |
global _client_id | |
existe_record = self.fb_database.get('Cliente',_client_id + '/' + 'n_trades' +'/'+ data_hoje) | |
#existe_record = Procura em 'Client' / '???client_id???' / 'n_trades' se existe 'data_hoje' | |
return existe_record | |
def existeRecordStopGainLoss(self): | |
pass | |
def deleteClientSession(self,client_id,session_id): | |
if session_id != None: | |
self.fb_database.delete('Cliente',client_id + '/' + 'sessao' + '/' + session_id) | |
else: | |
print("Fecha programa") | |
#======== Define conexão de Action para menubar | |
''' | |
def connectLogionDiag(self): | |
self.actionVizion_Login.connect(self.vizionLoginDiag) | |
''' | |
#======== Define conexão de Action para MenuAjuda menubar | |
def connnectMenuAjudaActionSobre(self): | |
self.Dialog = QtWidgets.QDialog() | |
self.ui = Ui_Dialog_Sobre() | |
self.ui.setupUi(self.Dialog) | |
self.Dialog.show() | |
def connectMenuAjudaActionPoliticaPrivacidade(self): | |
self.Dialog = QtWidgets.QDialog() | |
self.ui = Ui_Dialog_Politica_Privacidade() | |
self.ui.setupUi(self.Dialog) | |
self.Dialog.show() | |
def connectMenuAjudaActionTermosCondicoes(self): | |
self.Dialog = QtWidgets.QDialog() | |
self.ui = Ui_Dialog_Termos_Condicoes() | |
self.ui.setupUi(self.Dialog) | |
self.Dialog.show() | |
def connectMenuAjudaActionTelegramURL(self): | |
url = QtCore.QUrl('https://t.me/vizioncopyoficial') | |
if not QtGui.QDesktopServices.openUrl(url): | |
QtGui.QMessageBox.warning(self, 'Open Url', 'Could not open url') | |
def connectMenuAjudaActionConteudo(self): | |
self.Dialog = QtWidgets.QDialog() | |
self.ui = Ui_Dialog_Conteudo() | |
self.ui.setupUi(self.Dialog) | |
self.Dialog.show() | |
#======== Define janela Login_diag | |
def vizionLoginDiag(self): | |
self.Dialog = QtWidgets.QDialog() | |
self.ui = Ui_Dialog() | |
self.ui.setupUi(self.Dialog) | |
self.Dialog.show() | |
self.ui.btn_entrar.clicked.connect(self.startLoadingLoginDiag) | |
#sys.exit(app.exec_()) | |
#self.Dialog.exec_() | |
#========= Func mostra barra de progresso | |
def startLoadingLoginDiag(self): | |
if self.is_internet(): | |
self.ui.aviso_login.hide() | |
self.ui.progressBar.show() | |
self.ui.progressBar.setValue(0) #50 | |
self.timer = QTimer() | |
self.timer.timeout.connect(self.handleTimerLoginDiag) | |
self.timer.start(100) # chama o metodo a cada segundo (1000) | |
else: | |
self.showAvisoLoginDiag("Não há conexão com a internet!<br>Por favor, tente novamente.") | |
self.ui.fld_login.setText("") | |
self.ui.fld_senha.setText("") | |
def handleTimerLoginDiag(self): | |
value = self.ui.progressBar.value() | |
if value < 100: | |
value = value + 25 | |
self.ui.progressBar.setValue(value) | |
else: | |
self.timer.stop() | |
result = self.ui.fbSigInV3() #result = self.ui.fbSigInV2() | |
if result == "sign-in multiplas-sessoes": | |
#self.showAvisoLoginDiag("Usuário já está logado em outra sessão!") | |
self.getLoginResultv2() | |
else: | |
if result == "sign-in campos-vazios": | |
self.showAvisoLoginDiag("Campos de usuário e/ou senha estão vazios!") | |
else: | |
self.getLoginResultv2() | |
#======= Verifica se há conexão com a internet | |
def is_internet(self): | |
try: | |
urlopen('https://www.google.com',timeout=1) | |
return True | |
except urllib.error.URLError as Error: | |
print(Error) | |
return False | |
def getLoginResultv2(self): | |
global _trader_id,_trader_idV2 | |
result = self.ui.authentication_result | |
if result == "sign-in exception": | |
print("Usuário não autenticado") | |
self.showAvisoLoginDiag("Credenciais incorretas!") | |
self.ui.progressBar.hide() | |
else: | |
if result == "sign-in ok": | |
_trader_idV2 = self.fb_admin_sdk_rt.recupera_client_id(self.ui.client_email) | |
self.enableDisplayName() | |
self.enableIqoptionLoginTab() | |
self.disableLoginVizion() | |
self.enableAjudaMenu() | |
self.showTraderPainel() | |
self.Dialog.close() | |
#======= Define função que pega o retorno da autenticação | |
def getLoginResult(self): | |
global _client_id | |
global _session_id | |
global _token_uid | |
global _tipo_cliente | |
global _trader_id | |
result = self.ui.authentication_result | |
if result != None: | |
self.client_json_ = self.ui.client_json | |
self.session_id_ = self.ui.session_id | |
self.client_id_ = self.ui.client_id | |
_client_id = self.client_id_ | |
_session_id = self.session_id_ | |
try: | |
_token_uid = self.client_json_['uid'] | |
_tipo_cliente = self.client_json_['tipo_cliente'] | |
if _tipo_cliente == 'sender': #Trader | |
_trader_id = _client_id | |
else: | |
if _tipo_cliente == 'receiver': | |
_trader_id = self.client_json_['trader_id'] | |
except KeyError as e: | |
msg = f"<OCORREU O SEGUINTE ERRO> MOTIVO: {str(e)}" | |
print(msg) | |
self.enableDisplayName() | |
self.enableIqoptionLoginTab() | |
self.disableLoginVizion() | |
self.enableAjudaMenu() | |
if _tipo_cliente == "sender": | |
self.showTraderPainel() | |
print("Client: ",_tipo_cliente) | |
else: | |
if _tipo_cliente == "receiver": | |
self.hideTraderPainel() | |
print("Client: ",_tipo_cliente) | |
self.Dialog.close() | |
else: | |
print("Usuário não autenticado") | |
self.showAvisoLoginDiag("Credenciais incorretas!") | |
self.ui.progressBar.hide() | |
def showAvisoLoginDiag(self,msg): | |
self.ui.aviso_login.show() | |
self.ui.aviso_login.setText("<html><head/><body><p><span style=\" font-weight:600; color:#ff0000;\">"+msg+"</span></p></body></html>") | |
#======= Encerra a sessao do usuário ao sair | |
def sairMenu(self): | |
if self.client_json_ != None: | |
#print(self.user_tb_json) | |
#sessao = self.client_json_['sessao'] | |
#print(sessao) | |
#self.deleteClientSession(self.client_id_,self.session_id_) | |
print("Encerra sessaso do usuário") | |
else: | |
print("Sair") | |
import iq_logo_rc | |
import vizion_logo_rc | |
#======== Cria classe Vizion Window | |
class VizionWindow(QtWidgets.QMainWindow): | |
''' | |
def closeEvent(self,event): | |
#ui_mainwindow = Ui_MainWindow() | |
print('Encerra programa') | |
#ui_mainwindow.deleteClientSession(_client_id,_session_id) | |
self.deleteClientSession(_client_id,_session_id) | |
#===== Pára a conexão Websocket | |
if _tipo_cliente == "receiver": | |
if ui.btn_parar_copy.isEnabled() == True: | |
ui.StopQtWebsocket() | |
else: | |
if _tipo_cliente == "sender": | |
if ui.btn_parar_servidor.isEnabled() == True: | |
ui.StopQtWebsocket() | |
''' | |
def closeEvent(self,event): | |
print('Encerrando programa') | |
self.deleteClientSession(_client_id,_session_id) | |
def deleteClientSession(self,client_id,session_id): | |
from firebase import firebase as fbdatabase | |
try: | |
self.fb_database = fbdatabase.FirebaseApplication("https://vizion-a0cda.firebaseio.com/",None) | |
if session_id != None: | |
self.fb_database.delete('Cliente',client_id + '/' + 'sessao' + '/' + session_id) | |
else: | |
print("Fecha programa") | |
except: | |
print("Não foi possivel deletar a sessão. Motivo: Não há conexão com a internet") | |
#==================== Worker para segurar as ordens em andamento | |
class Signals(QtCore.QObject): | |
finished = QtCore.pyqtSignal(str) | |
class WorkerZeroMQSubscribeClientQThread(QtCore.QThread): | |
def __init__(self): | |
super().__init__() | |
self.signal = Signals() | |
self.close_qthread = False | |
def stop(self): | |
self.close_qthread = True | |
def run(self): | |
global _SOCKET_SUB | |
print("Listening to PUBLISHER server... ") | |
QtWidgets.QApplication.processEvents() | |
while True: | |
msg = _SOCKET_SUB.recv_string() | |
print(msg) | |
self.signal.finished.emit(msg) | |
if self.close_qthread: | |
print("close qthread") | |
break | |
class WorkerQThread(QtCore.QThread): | |
def __init__(self): | |
super().__init__() | |
self.signal = Signals() | |
def setMainWindowObj(self,main_window_obj): #def setMainWindowObj(self,iqoption_arg,direction_arg,goal_arg,amount_arg,exp_arg,main_window_obj): | |
''' | |
self.I_want_money = iqoption_arg | |
self.direction = direction_arg | |
self.goal = goal_arg | |
self.amount = amount_arg | |
self.expiration = exp_arg | |
''' | |
self.is_digital = main_window_obj.is_digital | |
self.iqoption_api = main_window_obj.iqoption_api | |
self.direction = main_window_obj.o | |
self.goal = main_window_obj.g | |
self.amount = main_window_obj.m | |
self.expiration = main_window_obj.exp | |
self.tipo_conta = main_window_obj.tipo_conta | |
self.main_window_obj = main_window_obj | |
def SalvaResultTradeClienteV2(self,is_digital,ordem_id,par,result,profit,expiration_time,tipo_conta): | |
if is_digital: | |
classe_trade = "DIGITAL" | |
else: | |
classe_trade = "BINARIA" | |
if tipo_conta == 'D': | |
t_conta = "DEMO" | |
else: | |
if tipo_conta == 'R': | |
t_conta = "REAL" | |
self.main_window_obj.fb_admin_sdk_rt.cadastra_ordem_fechada(self.main_window_obj.ui.client_email,classe_trade,ordem_id,par,result,profit,expiration_time,t_conta) | |
def SalvaResultTradeCliente(self,is_digital,id,goal,result,profit,expiration_time,tipo_conta): | |
print("salva result trade client") | |
global _client_id | |
json_data = {} | |
json_result = {} | |
if not is_digital: | |
id = 'B'+str(id) | |
else: | |
if is_digital: | |
id = 'D'+str(id) | |
json_result["id"] = id | |
json_result["par"] = goal | |
json_result["result"] = result | |
json_result["profit"] = profit | |
json_result["expiration_time"] = expiration_time | |
json_result["tipo_conta"] = tipo_conta | |
json_data["closed_order"] = json.dumps(json_result) | |
data_hoje = (datetime.now()).strftime("%d_%m_%Y") | |
self.main_window_obj.fb_database.post('Cliente' + '/' + _client_id + '/' + 'n_trades' + '/'+data_hoje + '/' + 'closed_orders',json_data) | |
def ChecaStopWinLossV2(self, tipo_conta): | |
global _stop_gain_atingido,_stop_loss_atingido | |
snap = self.main_window_obj.fb_admin_sdk_rt.recupera_todas_ordem_fechadas_diarias(self.main_window_obj.ui.client_email) | |
if tipo_conta == 'D': | |
t_conta = "DEMO" | |
else: | |
if tipo_conta == 'R': | |
t_conta = "REAL" | |
total_profit_diario = 0 | |
for key,val in snap.items(): | |
p = 0 | |
for k,v in val.items(): | |
if k == 'profit': | |
p = v | |
if k == 'tipo_conta' and v == t_conta: | |
total_profit_diario = total_profit_diario + p | |
#print(f"{k}:{v}") | |
snap = self.main_window_obj.fb_admin_sdk_rt.recupera_stops_diarios(self.main_window_obj.ui.client_email) | |
stop_gain_diario = 0 | |
stop_loss_diario = 0 | |
for key,val in snap.items(): | |
for k,v in val.items(): | |
if k == 'stop_loss': | |
stop_loss_diario = v | |
else: | |
if k == 'stop_gain': | |
stop_gain_diario = v | |
if total_profit_diario >= stop_gain_diario: | |
_stop_gain_atingido = True | |
else: | |
if total_profit_diario <= stop_loss_diario: | |
_stop_loss_atingido = True | |
def ChecaStopWinLoss(self): | |
print("Checa Stop Win Loss") | |
global _client_id, _stop_gain_atingido,_stop_loss_atingido | |
data_hoje = (datetime.now()).strftime("%d_%m_%Y") | |
total_profit_diario = 0 | |
json_data_closed_orders = self.main_window_obj.fb_database.get('Cliente',_client_id + '/' + 'n_trades' +'/'+ data_hoje +'/'+'closed_orders') | |
for trade in json_data_closed_orders: | |
_json = json.loads(json_data_closed_orders[trade]['closed_order']) | |
total_profit_diario = total_profit_diario + _json['profit'] | |
json_data_stop_gain = self.main_window_obj.fb_database.get('Cliente',_client_id + '/' + 'n_trades' +'/'+ data_hoje +'/'+'stop_gain_diario') | |
json_data_stop_loss = self.main_window_obj.fb_database.get('Cliente',_client_id + '/' + 'n_trades' +'/'+ data_hoje +'/'+'stop_loss_diario') | |
s_g = 0 | |
s_l = 0 | |
for stop in json_data_stop_gain: | |
s_g = json_data_stop_gain[stop] | |
for stop in json_data_stop_loss: | |
s_l = json_data_stop_loss[stop] | |
if total_profit_diario >= s_g: | |
_stop_gain_atingido = True | |
else: | |
if total_profit_diario <= s_l: | |
_stop_loss_atingido = True | |
def run(self): | |
is_digital = self.is_digital | |
direction = self.direction | |
goal = self.goal | |
amount = self.amount | |
expiration = self.expiration | |
tipo_conta = self.tipo_conta | |
try: | |
tipo = '' | |
at_price= 0.0 | |
second_id = 0 | |
if not is_digital: | |
try: | |
check,self.id,at_price,second_id = self.iqoption_api.buy(amount,goal , direction, expiration) | |
if not check == True and not type(self.id) == int: | |
rcvMsg = f"<br><MENSAGEM DE API> IQOPTION: {self.id}. MOTIVOS: PAR NÃO DISPONÍVEL E/OU TEMPO DE EXPIRAÇÃO MENOR DO QUE O PERMITIDO" | |
self.signal.finished.emit(rcvMsg) | |
return | |
print(check,self.id) | |
tipo = 'BINÁRIA' | |
except websocket._exceptions.WebSocketConnectionClosedException: | |
if self.iqoption_api.check_connect()==False: | |
check,reason=self.iqoption_api.connect() | |
if check: | |
rcvMsg = f"<br>RECONECTADO A IQOPTION BROKER COM SUCESSO! ...[ok]" | |
self.signal.finished.emit(rcvMsg) | |
check,self.id,at_price,second_id = self.iqoption_api.buy(amount,goal , direction, expiration) | |
if not check == True and not type(self.id) == int: | |
rcvMsg = f"<br><MENSAGEM DE API> IQOPTION: {self.id}. MOTIVOS: PAR NÃO DISPONÍVEL E/OU TEMPO DE EXPIRAÇÃO MENOR DO QUE O PERMITIDO" | |
self.signal.finished.emit(rcvMsg) | |
return | |
else: | |
rcvMsg =f"<br><!>Problemas na reconexão. MOTIVO: {reason}... [ok]" | |
self.signal.finished.emit(rcvMsg) | |
else: | |
if is_digital: | |
try: | |
check,self.id=(self.iqoption_api.buy_digital_spot(goal,amount,direction,expiration)) | |
if not check == True: | |
rcvMsg = f"<br><MENSAGEM DE API> IQOPTION: {self.id['message']}. MOTIVOS: PAR NÃO DISPONÍVEL E/OU TEMPO DE EXPIRAÇÃO MENOR DO QUE O PERMITIDO" | |
self.signal.finished.emit(rcvMsg) | |
return | |
print(check,self.id) | |
tipo = 'DIGITAL' | |
except websocket._exceptions.WebSocketConnectionClosedException: | |
if self.iqoption_api.check_connect()==False: | |
check,reason=self.iqoption_api.connect() | |
if check: | |
rcvMsg = f"<br>RECONECTADO A IQOPTION BROKER COM SUCESSO! ...[ok]" | |
self.signal.finished.emit(rcvMsg) | |
check,self.id=(self.iqoption_api.buy_digital_spot(goal,amount,direction,expiration)) | |
if not check == True: | |
rcvMsg = f"<br><MENSAGEM DE API> IQOPTION: {self.id['message']}. MOTIVOS: PAR NÃO DISPONÍVEL E/OU TEMPO DE EXPIRAÇÃO MENOR DO QUE O PERMITIDO" | |
self.signal.finished.emit(rcvMsg) | |
return | |
else: | |
rcvMsg =f"<br><!>Problemas na reconexão. MOTIVO: {reason}... [ok]" | |
self.signal.finished.emit(rcvMsg) | |
except ValueError: | |
rcvMsg =f"<br><!>Alerta de exception: {ValueError}... [ok]" | |
self.signal.finished.emit(rcvMsg) | |
try: | |
id = self.id | |
data_hora_hoje = (datetime.now()).strftime("%d/%m/%Y, %H:%M:%S") | |
rcvMsg = f"<br> {emoji.emojize(':email: ORDEM ABERTA :arrow_forward:', use_aliases=True)} TIPO: {tipo}, PAR: {goal}, DATA DE ABERTURA: {data_hora_hoje}, ENTRADA: {amount}, DIREÇÃO: {direction}, TEMPO DE EXPIRAÇÃO: {expiration}" | |
self.signal.finished.emit(rcvMsg) | |
print(f"Open order:: type:{tipo}, par:{goal}, amount: {amount},direction:{direction},expiration_time:{expiration}") | |
#===== Atualiza o balanço | |
balance = self.iqoption_api.get_balance() | |
currency = self.iqoption_api.api.profile.balances[0]['currency'] #currency = json_['currency'] | |
self.main_window_obj.balanco_valor.setText(str(balance) +" "+currency) | |
while True: #while not self.isInterruptionRequested(): | |
QtWidgets.QApplication.processEvents() | |
if not is_digital: | |
if self.iqoption_api.get_async_order(self.id)["option-closed"] =={}: | |
pass | |
#QtWidgets.QApplication.processEvents() | |
else: | |
print("closed binary option") | |
profit = self.iqoption_api.get_async_order(self.id)["option-closed"]["msg"]["profit_amount"] - self.iqoption_api.get_async_order(self.id)["option-closed"]["msg"]["amount"] | |
result = self.iqoption_api.get_async_order(id)["option-closed"]["msg"]["result"] | |
if result == "loose": | |
result = "LOSS" | |
else: | |
if result == "win": | |
result = "WIN" | |
expiration_time = self.iqoption_api.get_async_order(id)["option-closed"]["msg"]["expiration_time"] | |
expiration_time = time.strftime("%H:%M",time.localtime( expiration_time) ) | |
rcvMsg = f"<br>{emoji.emojize(':email: ORDEM FECHADA ::arrow_backward::', use_aliases=True)} TIPO: {tipo}, PAR: {goal}, RESULTADO: {result}, LUCRO: {currency} {profit}, HORA DE FECHAMENTO: {expiration_time}" | |
self.signal.finished.emit(rcvMsg) | |
#print(f"Closed order:: par:{goal},result:{result},profit:{profit},expiration_time:{expiration_time}") | |
#===========Salva resultado do trade | |
self.SalvaResultTradeClienteV2(is_digital,id,goal,result,profit,expiration_time,tipo_conta) | |
#self.SalvaResultTradeCliente(is_digital,id,goal,result,profit,expiration_time,tipo_conta) | |
#=========== Checa se a meta diária foi batida | |
self.ChecaStopWinLossV2(tipo_conta) | |
#self.ChecaStopWinLoss() | |
#===== Atualiza o balanço | |
balance = self.iqoption_api.get_balance() | |
currency = self.iqoption_api.api.profile.balances[0]['currency'] #currency = json_['currency'] | |
self.main_window_obj.balanco_valor.setText(str(balance) +" "+currency) | |
break | |
else: | |
if is_digital: | |
check,profit = self.iqoption_api.check_win_digital_v2(id) | |
if not check: | |
pass | |
#QtWidgets.QApplication.processEvents() | |
else: | |
print("closed digital option") | |
check,profit = self.iqoption_api.check_win_digital_v2(id) | |
result = "" | |
if profit >=0: | |
result = "WIN" | |
else: | |
result = "LOSS" | |
expiration_time = time.strftime("%H:%M",time.localtime() ) | |
rcvMsg = f"<br>{emoji.emojize(':email: ORDEM FECHADA ::arrow_backward::', use_aliases=True)} TIPO: {tipo}, PAR: {goal}, RESULTADO: {result}, LUCRO: {currency} {profit}, HORA DE FECHAMENTO: {expiration_time}" | |
#rcvMsg = f"<br> ORDEM FECHADO TESTE DIGITAL" | |
self.signal.finished.emit(rcvMsg) | |
#print(f"Closed order:: par:{goal},result:{result},profit:{profit},expiration_time:{expiration_time}") | |
#===========Salva resultado do trade | |
self.SalvaResultTradeClienteV2(is_digital,id,goal,result,profit,expiration_time,tipo_conta) | |
#self.SalvaResultTradeCliente(is_digital,id,goal,result,profit,expiration_time,tipo_conta) | |
#=========== Checa se a meta diária foi batida | |
self.ChecaStopWinLossV2(tipo_conta) | |
#self.ChecaStopWinLoss() | |
#===== Atualiza o balanço | |
balance = self.iqoption_api.get_balance() | |
currency = self.iqoption_api.api.profile.balances[0]['currency'] #currency = json_['currency'] | |
self.main_window_obj.balanco_valor.setText(str(balance) +" "+currency) | |
break | |
except AttributeError: | |
#rcvMsg = f"NÃO HÁ CONEXÃO COM A INTERNET. POR FAVOR, TENTE NOVAMENTE ..." | |
#self.signal.finished.emit(rcvMsg) | |
pass | |
except KeyError as e: | |
rcvMsg = f"<br><OCORREU O SEGUINTE ERRO> MOTIVO: {str(e)} não está listado e/ou não está disponível" | |
#print(rcvMsg) | |
self.signal.finished.emit(rcvMsg) | |
class Worker(QtCore.QRunnable): | |
def __init__(self): | |
super().__init__() | |
self.signal = Signals() | |
def setMainWindowObj(self,main_window_obj): #def setMainWindowObj(self,iqoption_arg,direction_arg,goal_arg,amount_arg,exp_arg,main_window_obj): | |
''' | |
self.I_want_money = iqoption_arg | |
self.direction = direction_arg | |
self.goal = goal_arg | |
self.amount = amount_arg | |
self.expiration = exp_arg | |
''' | |
self.is_digital = main_window_obj.is_digital | |
self.iqoption_api = main_window_obj.iqoption_api | |
self.direction = main_window_obj.o | |
self.goal = main_window_obj.g | |
self.amount = main_window_obj.m | |
self.expiration = main_window_obj.exp | |
self.tipo_conta = main_window_obj.tipo_conta | |
self.main_window_obj = main_window_obj | |
#self.run() | |
def SalvaResultTradeCliente(self,is_digital,id,goal,result,profit,expiration_time,tipo_conta): | |
global _client_id | |
json_data = {} | |
json_result = {} | |
if not is_digital: | |
id = 'B'+str(id) | |
else: | |
if is_digital: | |
id = 'D'+str(id) | |
json_result["id"] = id | |
json_result["par"] = goal | |
json_result["result"] = result | |
json_result["profit"] = profit | |
json_result["expiration_time"] = expiration_time | |
json_result["tipo_conta"] = tipo_conta | |
json_data["closed_order"] = json.dumps(json_result) | |
data_hoje = (datetime.now()).strftime("%d_%m_%Y") | |
self.main_window_obj.fb_database.post('Cliente' + '/' + _client_id + '/' + 'n_trades' + '/'+data_hoje + '/' + 'closed_orders',json_data) | |
def ChecaStopWinLoss(self): | |
global _client_id, _stop_gain_atingido,_stop_loss_atingido | |
data_hoje = (datetime.now()).strftime("%d_%m_%Y") | |
total_profit_diario = 0 | |
json_data_closed_orders = self.main_window_obj.fb_database.get('Cliente',_client_id + '/' + 'n_trades' +'/'+ data_hoje +'/'+'closed_orders') | |
for trade in json_data_closed_orders: | |
_json = json.loads(json_data_closed_orders[trade]['closed_order']) | |
total_profit_diario = total_profit_diario + _json['profit'] | |
json_data_stop_gain = self.main_window_obj.fb_database.get('Cliente',_client_id + '/' + 'n_trades' +'/'+ data_hoje +'/'+'stop_gain_diario') | |
json_data_stop_loss = self.main_window_obj.fb_database.get('Cliente',_client_id + '/' + 'n_trades' +'/'+ data_hoje +'/'+'stop_loss_diario') | |
s_g = 0 | |
s_l = 0 | |
for stop in json_data_stop_gain: | |
s_g = json_data_stop_gain[stop] | |
for stop in json_data_stop_loss: | |
s_l = json_data_stop_loss[stop] | |
if total_profit_diario >= s_g: | |
_stop_gain_atingido = True | |
else: | |
if total_profit_diario <= s_l: | |
_stop_loss_atingido = True | |
def run(self): | |
is_digital = self.is_digital | |
direction = self.direction | |
goal = self.goal | |
amount = self.amount | |
expiration = self.expiration | |
tipo_conta = self.tipo_conta | |
try: | |
tipo = '' | |
if not is_digital: | |
try: | |
check,self.id = self.iqoption_api.buy(amount,goal , direction, expiration) | |
if not check == True and not type(self.id) == int: | |
rcvMsg = f"<br><MENSAGEM DE API> IQOPTION: {self.id}. MOTIVOS: PAR NÃO DISPONÍVEL E/OU TEMPO DE EXPIRAÇÃO MENOR DO QUE O PERMITIDO" | |
self.signal.finished.emit(rcvMsg) | |
return | |
print(check,self.id) | |
tipo = 'BINÁRIA' | |
except websocket._exceptions.WebSocketConnectionClosedException: | |
if self.iqoption_api.check_connect()==False: | |
check,reason=self.iqoption_api.connect() | |
if check: | |
rcvMsg = f"<br>RECONECTADO A IQOPTION BROKER COM SUCESSO! ...[ok]" | |
self.signal.finished.emit(rcvMsg) | |
check,self.id = self.iqoption_api.buy(amount,goal , direction, expiration) | |
if not check == True and not type(self.id) == int: | |
rcvMsg = f"<br><MENSAGEM DE API> IQOPTION: {self.id}. MOTIVOS: PAR NÃO DISPONÍVEL E/OU TEMPO DE EXPIRAÇÃO MENOR DO QUE O PERMITIDO" | |
self.signal.finished.emit(rcvMsg) | |
return | |
else: | |
rcvMsg =f"<br><!>Problemas na reconexão. MOTIVO: {reason}... [ok]" | |
self.signal.finished.emit(rcvMsg) | |
else: | |
if is_digital: | |
try: | |
check,self.id=(self.iqoption_api.buy_digital_spot(goal,amount,direction,expiration)) | |
if not check == True: | |
rcvMsg = f"<br><MENSAGEM DE API> IQOPTION: {self.id['message']}. MOTIVOS: PAR NÃO DISPONÍVEL E/OU TEMPO DE EXPIRAÇÃO MENOR DO QUE O PERMITIDO" | |
self.signal.finished.emit(rcvMsg) | |
return | |
print(check,self.id) | |
tipo = 'DIGITAL' | |
except websocket._exceptions.WebSocketConnectionClosedException: | |
if self.iqoption_api.check_connect()==False: | |
check,reason=self.iqoption_api.connect() | |
if check: | |
rcvMsg = f"<br>RECONECTADO A IQOPTION BROKER COM SUCESSO! ...[ok]" | |
self.signal.finished.emit(rcvMsg) | |
check,self.id=(self.iqoption_api.buy_digital_spot(goal,amount,direction,expiration)) | |
if not check == True: | |
rcvMsg = f"<br><MENSAGEM DE API> IQOPTION: {self.id['message']}. MOTIVOS: PAR NÃO DISPONÍVEL E/OU TEMPO DE EXPIRAÇÃO MENOR DO QUE O PERMITIDO" | |
self.signal.finished.emit(rcvMsg) | |
return | |
else: | |
rcvMsg =f"<br><!>Problemas na reconexão. MOTIVO: {reason}... [ok]" | |
self.signal.finished.emit(rcvMsg) | |
try: | |
id = self.id | |
data_hora_hoje = (datetime.now()).strftime("%d/%m/%Y, %H:%M:%S") | |
rcvMsg = f"<br>ORDEM ABERTA -> TIPO: {tipo}, PAR: {goal}, DATA DE ABERTURA: {data_hora_hoje}, ENTRADA: {amount}, DIREÇÃO: {direction}, TEMPO DE EXPIRAÇÃO: {expiration}" | |
self.signal.finished.emit(rcvMsg) | |
print(f"Open order:: type:{tipo}, par:{goal}, amount: {amount},direction:{direction},expiration_time:{expiration}") | |
#===== Atualiza o balanço | |
balance = self.iqoption_api.get_balance() | |
currency = self.iqoption_api.api.profile.balances[0]['currency'] #currency = json_['currency'] | |
self.main_window_obj.balanco_valor.setText(str(balance) +" "+currency) | |
#QtWidgets.QApplication.processEvents() | |
while True: | |
QtWidgets.QApplication.processEvents() | |
if not is_digital: | |
if self.iqoption_api.get_async_order(self.id)["option-closed"] =={}: | |
pass | |
#QtWidgets.QApplication.processEvents() | |
else: | |
profit = self.iqoption_api.get_async_order(self.id)["option-closed"]["msg"]["profit_amount"] - self.iqoption_api.get_async_order(self.id)["option-closed"]["msg"]["amount"] | |
result = self.iqoption_api.get_async_order(id)["option-closed"]["msg"]["result"] | |
if result == "loose": | |
result = "LOSS" | |
else: | |
if result == "win": | |
result = "WIN" | |
expiration_time = self.iqoption_api.get_async_order(id)["option-closed"]["msg"]["expiration_time"] | |
expiration_time = time.strftime("%H:%M",time.localtime( expiration_time) ) | |
rcvMsg = f"ORDEM FECHADA <- TIPO: {tipo}, PAR: {goal}, RESULTADO: {result}, LUCRO: {currency} {profit}, TEMPO DE EXPIRAÇÃO: {expiration_time}" | |
self.signal.finished.emit(rcvMsg) | |
#print(f"Closed order:: par:{goal},result:{result},profit:{profit},expiration_time:{expiration_time}") | |
#===========Salva resultado do trade | |
self.SalvaResultTradeCliente(is_digital,id,goal,result,profit,expiration_time,tipo_conta) | |
#=========== Checa se a meta diária foi batida | |
self.ChecaStopWinLoss() | |
#===== Atualiza o balanço | |
balance = self.iqoption_api.get_balance() | |
currency = self.iqoption_api.api.profile.balances[0]['currency'] #currency = json_['currency'] | |
self.main_window_obj.balanco_valor.setText(str(balance) +" "+currency) | |
break | |
else: | |
if is_digital: | |
check,profit = self.iqoption_api.check_win_digital_v2(id) | |
if not check: | |
pass | |
#QtWidgets.QApplication.processEvents() | |
else: | |
print("closed digital option") | |
check,profit = self.iqoption_api.check_win_digital_v2(id) | |
result = "" | |
if profit >=0: | |
result = "WIN" | |
else: | |
result = "LOSS" | |
expiration_time = time.strftime("%H:%M",time.localtime() ) | |
rcvMsg = f"ORDEM FECHADA <- TIPO: {tipo}, PAR: {goal}, RESULTADO: {result}, LUCRO: {currency} {profit}, TEMPO DE EXPIRAÇÃO: {expiration_time}" | |
self.signal.finished.emit(rcvMsg) | |
#print(f"Closed order:: par:{goal},result:{result},profit:{profit},expiration_time:{expiration_time}") | |
#===========Salva resultado do trade | |
self.SalvaResultTradeCliente(is_digital,id,goal,result,profit,expiration_time,tipo_conta) | |
#=========== Checa se a meta diária foi batida | |
self.ChecaStopWinLoss() | |
#===== Atualiza o balanço | |
balance = self.iqoption_api.get_balance() | |
currency = self.iqoption_api.api.profile.balances[0]['currency'] #currency = json_['currency'] | |
self.main_window_obj.balanco_valor.setText(str(balance) +" "+currency) | |
break | |
except AttributeError: | |
#rcvMsg = f"NÃO HÁ CONEXÃO COM A INTERNET. POR FAVOR, TENTE NOVAMENTE ..." | |
#self.signal.finished.emit(rcvMsg) | |
pass | |
except KeyError as e: | |
rcvMsg = f"<br><OCORREU O SEGUINTE ERRO> MOTIVO: {str(e)} não está listado e/ou não está disponível" | |
#print(rcvMsg) | |
self.signal.finished.emit(rcvMsg) | |
def ping(): | |
_client.do_ping() | |
#print(_client.client.errorString()) | |
''' | |
workerqws = WorkerQWS() | |
threadpool_globalinstance = QThreadPool.globalInstance() | |
threadpool_globalinstance.start(workerqws) | |
''' | |
def send_message(): | |
_client.send_message() | |
if __name__ == "__main__": | |
#======== Importa IQoption API | |
from iqoptionapi.stable_api import IQ_Option | |
error_password="""{"code":"invalid_credentials","message":"You entered the wrong credentials. Please check that the login/password is correct."}""" | |
import websocket | |
import json | |
import sys | |
import time | |
import urllib | |
from urllib.request import urlopen | |
#========= import QtWebsocket | |
from PyQt5 import QtCore, QtWebSockets, QtNetwork, QtGui | |
from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QAction | |
from PyQt5.QtCore import QUrl,QTimer | |
from PyQt5.QtCore import (QCoreApplication, QObject, QRunnable, QThread,QThreadPool, pyqtSignal) | |
from QtWServer import MyServer as MyQtWserver | |
from QtWClientV2 import Client as MyQtWclient | |
#from QtWClientV2 import TriggerClient as TriggerQtWclient | |
import emoji | |
from datetime import datetime | |
app = QtWidgets.QApplication(sys.argv) | |
#======= Adiciona paleta Dark | |
''' IQOPTION PALETTE | |
backgroud 28,35,51 | |
button 53,61,79 | |
orange 218,73,49 | |
green 44,171,64 | |
''' | |
app.setStyle('Fusion') #'Fusion' | |
''' | |
palette = QtGui.QPalette() | |
palette.setColor(QtGui.QPalette.Window, QtGui.QColor(53,53,53))#silver | |
palette.setColor(QtGui.QPalette.WindowText, QtCore.Qt.white) | |
palette.setColor(QtGui.QPalette.Base, QtGui.QColor(15,15,15))#black | |
palette.setColor(QtGui.QPalette.AlternateBase, QtGui.QColor(53,53,53)) | |
palette.setColor(QtGui.QPalette.ToolTipBase, QtCore.Qt.white) | |
palette.setColor(QtGui.QPalette.ToolTipText, QtCore.Qt.white) | |
palette.setColor(QtGui.QPalette.Text, QtCore.Qt.white) | |
palette.setColor(QtGui.QPalette.Button, QtGui.QColor(53,53,53)) | |
palette.setColor(QtGui.QPalette.ButtonText, QtCore.Qt.white) | |
palette.setColor(QtGui.QPalette.BrightText, QtCore.Qt.red) | |
palette.setColor(QtGui.QPalette.Highlight, QtGui.QColor(19, 127, 0).lighter())#green | |
palette.setColor(QtGui.QPalette.HighlightedText, QtCore.Qt.black) | |
''' | |
palette = QtGui.QPalette() | |
palette.setColor(QtGui.QPalette.Window, QtGui.QColor(28,35,51)) | |
palette.setColor(QtGui.QPalette.WindowText, QtCore.Qt.white) | |
palette.setColor(QtGui.QPalette.Base, QtGui.QColor(15,15,15))#black | |
palette.setColor(QtGui.QPalette.AlternateBase, QtGui.QColor(51,204,204)) | |
palette.setColor(QtGui.QPalette.ToolTipBase, QtCore.Qt.white) | |
palette.setColor(QtGui.QPalette.ToolTipText, QtCore.Qt.white) | |
palette.setColor(QtGui.QPalette.Text, QtCore.Qt.white) | |
palette.setColor(QtGui.QPalette.Button, QtGui.QColor(28,35,51)) | |
palette.setColor(QtGui.QPalette.ButtonText, QtCore.Qt.white) | |
palette.setColor(QtGui.QPalette.BrightText, QtCore.Qt.red) | |
palette.setColor(QtGui.QPalette.Highlight, QtGui.QColor(51,204,204).lighter()) | |
palette.setColor(QtGui.QPalette.HighlightedText, QtCore.Qt.black) | |
app.setPalette(palette) | |
#MainWindow = QtWidgets.QMainWindow() | |
#========== Altera para classe VizionWindow | |
MainWindow = VizionWindow() | |
ui = Ui_MainWindow() | |
ui.setupUi(MainWindow) | |
MainWindow.show() | |
#===== Chama a interface de Login do Vizion no início do programa | |
ui.vizionLoginDiag() | |
sys.exit(app.exec_()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment