“Connection is already closed” no robô de opções binárias
O robô abre, opera bem por um tempo e do nada para com essa mensagem. Não é bug do seu código: é a conexão WebSocket com a corretora que caiu e ninguém religou.
O que está acontecendo
A biblioteca conversa com a corretora por um WebSocket — uma conexão aberta o tempo todo, diferente de uma requisição comum que abre e fecha. Essa conexão cai por motivos banais: oscilação de internet, o servidor da corretora derrubando sessões ociosas, o computador entrando em suspensão, o Wi-Fi trocando de canal.
Quando cai, o objeto da API continua existindo na memória — ele só não tem mais um cano do outro lado. A próxima chamada que tentar mandar qualquer coisa levanta essa exceção. O erro não aparece na hora da queda: aparece no próximo uso. Por isso ele parece aleatório.
Como resolver
Verifique a conexão antes de cada operação, não só no início
A maioria dos robôs checa a conexão uma vez, no connect(), e nunca mais.
Checar antes de cada ciclo custa quase nada:
if not api.check_connect():
api.connect()
Reconecte com espera crescente (backoff)
Reconectar em loop apertado piora tudo: a corretora passa a recusar, e algumas contam isso como abuso. Espere um pouco mais a cada tentativa:
import time
def garantir_conexao(api, tentativas=6):
for n in range(tentativas):
if api.check_connect():
return True
api.connect()
time.sleep(min(2 ** n, 60)) # 1s, 2s, 4s... até 60s
return False
Nunca reconecte no meio de uma operação aberta
Este é o erro caro. Se a conexão cai com uma ordem já enviada, reconectar e mandar de novo pode duplicar a entrada. Reconecte, e só depois consulte qual foi o resultado da ordem que ficou para trás — sem reenviar nada.
Guarde o ponto em que parou
Se a luz cair, o robô precisa saber ao voltar o que estava aberto. Grave em arquivo (ou banco) o id de cada ordem enviada e o estado dela. Sem isso, toda queda vira operação órfã: dinheiro no mercado que o seu programa esqueceu.
Essa mensagem é queda de conexão, não bloqueio de conta. Se ela vier junto de falha de login repetida, aí sim vale olhar credencial e a situação da conta.
Antes de deixar o robó operar
Consertar o erro faz o robô rodar — não faz ele ganhar. O Binaryzando testa a sua estratégia no histórico real de velas antes de você arriscar dinheiro nela, e sela o resultado numa carta com código verificável — para o número não poder ser editado depois.
Testar minha estratégia