Set m_transmit to False in your order.
from ib.ext.Contract import Contract
from ib.ext.Order import Order
from ib.opt import ibConnection, message
from time import sleep
def watchAll(msg):
print(msg)
con = ibConnection(clientId=1)
con.registerAll(watchAll)
con.connect()
sleep(1)
fx = Contract()
fx.m_secType = "CASH"
fx.m_symbol = "USD"
fx.m_currency = "CAD"
fx.m_exchange = "IDEALPRO"
con.reqMktData(1,fx,"",False)
ord = Order()
ord.m_orderType = 'MKT'
ord.m_totalQuantity = 100000
ord.m_action = 'BUY'
ord.m_transmit = False
con.placeOrder(1234,fx,ord)
Your TWS will have a row like this
Notice the transmit button if you want to transmit from TWS.
Then you can resend the same order using the same orderId but set m_transmit to True.
ord.m_transmit = True
con.placeOrder(1234,fx,ord)
Then it get's transmitted and TWS will show the fill, also the order message callbacks will get printed in the simple def watchAll(msg)
