API IQ Option con Python (iqoptionapi) — Conectar, Operar y check_win

Cómo conectar a IQ Option desde Python usando la librería de la comunidad iqoptionapi: iniciar sesión, leer velas, enviar órdenes y leer el resultado con check_win_v4. Y un bot open source gratis que ya hace todo eso.

🤖 Recibe el bot IQ Option gratis (API lista)

Bot Python open source usando iqoptionapi. Edítalo conversando con ChatGPT/Claude — sin programar. Gratis, sin spam.

¿IQ Option tiene API oficial?

No. IQ Option no tiene una API pública oficial. La comunidad usa la librería open source iqoptionapi, que habla con el mismo WebSocket de la plataforma. Es no oficial — usa cuenta demo (practice) y ten en cuenta el riesgo de baneo en cuenta real.

Cómo instalar iqoptionapi correctamente (entorno virtual)

La causa más común de que el ejemplo anterior falle es la instalación. pip install iqoptionapi descarga el paquete con ese nombre en PyPI, que es la versión 0.5, publicada en octubre de 2016. Esa versión no tiene el módulo stable_api, así que from iqoptionapi.stable_api import IQ_Option falla con ModuleNotFoundError. El código de la comunidad que incluye check_win_v4 se mantiene en GitHub y hay que instalarlo desde ahí:

  1. Crea un entorno aislado en la carpeta del proyecto: python -m venv .venv
  2. Actívalo: .venv\Scripts\activate en Windows, source .venv/bin/activate en Linux/macOS.
  3. Si instalaste el paquete viejo, desinstálalo: pip uninstall iqoptionapi
  4. Instala desde GitHub por HTTPS: pip install -U git+https://github.com/iqoptionapi/iqoptionapi.git (requiere Git). Sin Git, usa el enlace ZIP que indica el README del proyecto: pip install -U https://github.com/iqoptionapi/iqoptionapi/archive/refs/heads/master.zip
  5. Prueba el import: python -c "from iqoptionapi.stable_api import IQ_Option" — si no aparece nada, funcionó.

Por qué un entorno virtual: la librería fija websocket-client==0.56, una versión muy antigua. Dentro de .venv esa restricción no rompe otros proyectos Python del mismo equipo. Y no uses el comando git+git:// que todavía aparece en el README: GitHub desactivó definitivamente el protocolo git:// sin cifrado el 15 de marzo de 2022, así que solo funciona la forma https://.

Conectar con Python — ejemplo mínimo

Iniciar sesión, leer velas, comprar y leer el resultado con check_win_v4:

# pip install -U git+https://github.com/iqoptionapi/iqoptionapi.git (NO el paquete de PyPI — ver la sección de instalación) import time from iqoptionapi.stable_api import IQ_Option api = IQ_Option("tu@email.com", "tuclave") api.connect() api.change_balance("PRACTICE") # siempre demo primero velas = api.get_candles("EURUSD", 60, 100, time.time()) ok, order_id = api.buy(1, "EURUSD", "call", 1) # 1 = expiración de 1 min resultado, ganancia = api.check_win_v4(order_id) # ("win" | "loose" | "equal", ganancia)

check_win_v4 devuelve una tupla: el estado en texto — "win", "loose" (así lo escribe la propia librería) o "equal" — y la ganancia como número (ganancia neta si gana, menos el monto invertido si pierde, 0 en empate). Solo funciona con opciones binarias/turbo y espera el resultado sin límite de tiempo.

Métodos útiles de iqoptionapi

connect() / change_balance()
get_candles()
buy() / buy_digital_spot()
check_win_v4() / get_balance()

Lo que devuelve realmente cada llamada (verificado en el código stable_api.py de la versión de GitHub, 7.1.1):

MétodoQué haceDevuelve / cuidado
connect()Inicia sesión y abre el WebSocket(True, None) si funciona, (False, motivo) si falla, (False, "2FA") cuando pide código por SMS
connect_2fa(codigo)Completa el login con el código SMSLa misma tupla que connect()
change_balance(modo)Elige la cuenta: "PRACTICE", "REAL" o "TOURNAMENT"Cualquier otro texto (ej.: "DEMO") registra un error y llama a exit(1) — el script se detiene
get_balance()Saldo de la cuenta seleccionadaUn número
get_candles(activo, intervalo, cantidad, fin)Historial; intervalo en segundos (60 = M1), fin como timestamp UnixLista de diccionarios de velas ("from" = inicio de la vela). Un activo desconocido imprime Asset … not found on consts
get_all_open_time()Qué activos están abiertos ahoraDiccionario anidado: [tipo][activo]["open"] = True/False, tipo como "turbo", "binary", "digital"
get_all_profit()Payout por activoFracciones: {"turbo": 0.85, ...} significa 85%
buy(monto, activo, "call"/"put", minutos)Abre una opción binaria/turbo(True, order_id) o (False, mensaje); tras 5 s sin confirmación registra buy late 5 sec y devuelve (False, None)
check_win_v4(order_id)Espera a que la orden cierre("win" | "loose" | "equal", ganancia) — bloquea sin timeout; solo binaria/turbo
buy_digital_spot() / check_win_digital_v2()Equivalentes para opciones digitalesÚsalos en órdenes digitales; check_win_v4 nunca devuelve nada para ellas
check_connect()¿El WebSocket sigue vivo?False cuando el socket se cerró

Errores comunes y cómo resolverlos

SíntomaCausa probableSolución
ModuleNotFoundError: No module named 'iqoptionapi.stable_api'Está instalado el paquete de PyPI de 2016 (0.5)pip uninstall iqoptionapi e instala desde GitHub como se indicó arriba
pip falla con una URL git+git://GitHub ya no acepta git://Usa git+https://
El import funciona en una terminal y en otra nopip instaló en otro Python distinto al que ejecuta el scriptActiva el venv y usa python -m pip install ...; revisa python --version (README de la librería: 3.7+; nuestro bot: 3.12+)
connect() devuelve (False, motivo)Correo/contraseña incorrectos o login bloqueadoImprime el motivo; entra una vez desde el navegador con los mismos datos
motivo == "2FA"Login en dos pasos por SMS activadoapi.connect_2fa(input("Código SMS: "))
El script se cierra justo después de change_balanceModo distinto de PRACTICE/REAL/TOURNAMENTUsa exactamente "PRACTICE"
Asset EURUSD-op not found on constsActivo ausente en constants.ACTIVESInyecta el ID (ver la sección "-op" más abajo) o usa un nombre de la lista
check_win_v4 nunca devuelveOrden digital, o el WebSocket se cayó antes del resultadoUsa check_win_digital_v2 en digitales; vigila check_connect()
check_connect() pasa a False tras varias horasCaída de red o sesión expiradaLlama de nuevo a api.connect() y repite change_balance("PRACTICE") antes de la siguiente orden

Revisa el payout antes de cada orden (el cálculo)

get_all_profit() entrega el payout como fracción, y ese número define la tasa de acierto mínima: acierto de equilibrio = 1 / (1 + payout). Resultado esperado por cada $1 operado = p × payout − (1 − p), donde p es tu tasa de acierto.

PayoutAcierto de equilibrioResultado por $1 con 56% de acierto
0,90 (90%)52,6%+$0,064
0,85 (85%)54,1%+$0,036
0,80 (80%)55,6%+$0,008
0,70 (70%)58,8%−$0,048

La misma tasa de 56% pasa de una ganancia pequeña a una pérdida constante solo porque el payout bajó de 85% a 70%. En nuestra prueba con velas M1 reales de forex, las mejores estrategias se mantuvieron en ~57–61% fuera de muestra y nada se acercó al 70% (resultados completos); en los activos OTC el resultado fue estadísticamente aleatorio, ~50% (por qué el OTC es aleatorio). Por eso el bot debe saltarse cualquier activo cuyo payout ponga el equilibrio por encima de lo que la estrategia mostró en demo.

Buenas prácticas antes de automatizar

  • La contraseña fuera del código: léela de variables de entorno — IQ_Option(os.environ["IQ_EMAIL"], os.environ["IQ_PASSWORD"]) — y nunca subas a GitHub un archivo con credenciales.
  • No escribas tu contraseña en un .exe cerrado ni en un "sitio de robots": el propio README de la librería advierte que estafadores ya robaron contraseñas de IQ Option así. El código abierto corre en tu PC y puedes leer qué hace con la contraseña.
  • PRACTICE por defecto: llama a change_balance("PRACTICE") al iniciar y cambia a "REAL" solo mediante una configuración explícita, nunca como valor por defecto.
  • Revisa antes de comprar: get_all_open_time() para el activo, get_all_profit() para el payout y luego buy().
  • Una lectura de velas por vela cerrada basta para estrategias M1; un bucle sin pausa solo vuelve a bajar los mismos datos.
  • Registra cada order_id con el resultado de check_win_v4, para comparar tu tasa real de acierto con la tabla de equilibrio de arriba.

Sáltate la configuración: usa el bot listo

El IaTraderPro Bot ya usa iqoptionapi y añade 13 estrategias listas, panel visual Streamlit, filtro de payout, stop loss/win diario y martingala configurable — open source, lees y modificas el código. Funciona en IQ Option en cuenta demo (PRACTICE) y real — empieza siempre por la demo.

Modifícalo con IA — sin programar

Pega bot.py en ChatGPT o Claude, describe la estrategia que quieres, recibe el código listo. Pegas, pruebas en demo y listo.

Preguntas frecuentes

¿Es oficial? No — librería de la comunidad. Prueba en demo primero.
¿Qué hace check_win_v4? Espera a que cierre una orden binaria/turbo y devuelve la tupla (estado, ganancia).
¿Riesgo de baneo? La automatización tiene riesgo en cuenta real; prueba en demo y lee los términos.
¿Es gratis? Sí — el bot es gratis y open source. También soporta Quotex.

Forex REAL en IQ Option: los activos "-op" (descubrimiento 2026)

La API antigua de IQ Option parecía muerta para forex real: turbo/binarias solo en OTC y digitales desactivadas. Pero en 2026 IQ lanzó los activos con sufijo -op (ej.: USDJPY-op, EURUSD-op) — forex real en opción binaria, con expiraciones de 2 a 15 minutos.

El detalle técnico: iqoptionapi no lista esos activos porque no existen en el constants.ACTIVES de la librería. La solución (nuestro bot lo hace solo) es inyectar los IDs de los "-op" en el diccionario al iniciar. Dos notas prácticas: las cuentas verificadas tienen acceso más amplio a los "-op", y el payout debe leerse con fallback (1 − comisión) cuando la API no lo devuelve.

Cómo inyectar los activos "-op" (código funcional)

La librería trae un diccionario estático de activos, así que los instrumentos nuevos de forex real quedan invisibles hasta que los agregas. Nuestro bot lo hace al iniciar:

# Hace visibles los activos "-op" (forex real) para iqoptionapi from iqoptionapi import constants from iqoptionapi.stable_api import IQ_Option OP_ASSETS = {"USDJPY-op": 1807, "EURUSD-op": 1806, "GBPJPY-op": 1811} constants.ACTIVES.update(OP_ASSETS) # los IDs varían por cuenta/región api = IQ_Option("tu@email.com", "tucontrasena") api.connect() api.change_balance("PRACTICE") # demo primero, siempre ok, orden = api.buy(1, "USDJPY-op", "call", 15) # binaria de 15 min
ExpiraciónDisponibilidadNotas
2 minEURUSD-op y algunos majorsLa más rápida; no existe en todos los pares
5 / 10 minMayoría de los -opFormato blitz; la librería no compra blitz directo
15 minUSDJPY-op, GBPJPY-opBinaria estándar — la que usa nuestro bot en producción

Dos notas de la operación real: una cuenta verificada obtiene acceso más amplio a la lista -op, y el conjunto de activos cambia por región — lee siempre la lista en vivo.

⚠️ Las opciones binarias implican alto riesgo y pueden resultar en pérdida total. Contenido educativo, no es asesoramiento de inversión. Ningún bot garantiza ganancias. Prueba siempre en cuenta demo primero.