Skip to content

Instantly share code, notes, and snippets.

@callTx
Created July 29, 2021 23:28
Show Gist options
  • Save callTx/1b9982ba064430d37cd50735c43a3142 to your computer and use it in GitHub Desktop.
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
# -*- 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