#!/usr/bin/env ruby # # This script allows you to cancel either a set of open Orders by their ids, # or ALL Orders opened via IB API at once. The latter is useful when your # robot goes crazy and opens gazillions of wrong limit orders. # # Accepts the port to connect to as first command-parameter, T)ws or G)ateway, which is the default # # Numeric Parameter are interpreted as keys for specific orders to kill require 'bundler/setup' require 'ib-api' specified_port = ARGV[0] || 'Gateway' port = case specified_port when /^[gG]/ ARGV.shift # consume the first argument 4002 when /^[Tt]/ ARGV.shift # consume the first argument 7497 end # First, connect to IB TWS. ib = IB::Connection.new client_id: 1111, port: port do | gw | # Subscribe to TWS alerts/errors and order-related messages gw.subscribe(:Alert, :ManagedAccounts, :OpenOrder, :OrderStatus, :OpenOrderEnd) { |msg| puts msg.to_human } # Set log level gw.logger.level = Logger::FATAL # DEBUG -- INFO -- WARN -- ERROR -- FATAL end if ARGV.empty? ib.send_message :RequestGlobalCancel else puts "ARGV: #{ARGV}" # Will only work for Orders placed under the same :client_id ib.cancel_order *ARGV puts '-'*55 puts "Remaining Orders" puts '-'*55 end puts '-'*55 puts "Remaining Orders" ib.send_message :RequestAllOpenOrders puts '-'*55 sleep 3 ## Expected output #12:20:25.154 Connected to server, version: 137, # connection time: 2018-02-27 12:20:25 +0000 local, 2018-02-27T12:20:25+00:00 remote. #12:20:25.156 Got message 5 (IB::Messages::Incoming::OpenOrder) # > #12:20:25.158 Got message 3 (IB::Messages::Incoming::OrderStatus) #> #12:20:25.197 Got message 53 (IB::Messages::Incoming::OpenOrderEnd) # #12:20:25.197 Got message 15 (IB::Messages::Incoming::ManagedAccounts) #12:20:25.197 No subscribers for message IB::Messages::Incoming::ManagedAccounts! #12:20:25.197 Got message 9 (IB::Messages::Incoming::NextValidId) #12:20:25.197 Got next valid order id: 2. #12:20:25.254 Got message 5 (IB::Messages::Incoming::OpenOrder) # > #12:20:25.256 Got message 3 (IB::Messages::Incoming::OrderStatus) #> #12:20:25.297 Got message 53 (IB::Messages::Incoming::OpenOrderEnd) # #12:20:25.342 Got message 3 (IB::Messages::Incoming::OrderStatus) #> #12:20:25.343 Got message 4 (IB::Messages::Incoming::Alert) #TWS Error 202: Order Canceled - reason: ##