Java代码连接到IB Gateway并通过FIX协议进行交易

449 阅读2分钟

IB Gateway是Interactive Brokers提供的一种API接口,可以实现与IB交易系统的交互。如果需要将IB Gateway封装成FIX协议,可以使用以下步骤:

  1. 安装IB Gateway

首先需要下载并安装IB Gateway。可以在Interactive Brokers的官网上下载最新版本的IB Gateway,并按照安装向导进行安装。安装完成后需要登录IB Gateway,并创建一个API账户。

  1. 配置IB Gateway

在IB Gateway中,需要进行一些配置来开启API接口。首先需要在“Configure”选项卡中选择“API”选项卡,并勾选“Enable ActiveX and Socket Clients”选项。然后需要在“Settings”选项卡中选择“API”选项卡,并设置API连接的端口号和客户端ID。

  1. 使用QuickFIX进行封装

可以使用QuickFIX来实现对IB Gateway的封装。QuickFIX是一个开源的FIX协议实现库,支持多种语言和平台。以下是一个使用Java语言和QuickFIX实现对IB Gateway的封装的示例:

import quickfix.*;
import quickfix.field.*;
import quickfix.fix44.*;

public class IBGatewayFixClient implements Application {

    private SocketInitiator initiator;

    public IBGatewayFixClient(String host, int port) throws ConfigError {
        SessionSettings settings = new SessionSettings();
        settings.set(new SessionID("FIX.4.4", "IBGATEWAY", "FIXCLIENT"));
        settings.setString("SocketConnectHost", host);
        settings.setInt("SocketConnectPort", port);
        settings.setString("UseDataDictionary", "FIX44.xml");
        settings.setString("BeginString", "FIX.4.4");

        MessageStoreFactory storeFactory = new FileStoreFactory(settings);
        LogFactory logFactory = new FileLogFactory(settings);
        MessageFactory messageFactory = new DefaultMessageFactory();

        initiator = new SocketInitiator(this, storeFactory, settings, logFactory, messageFactory);
    }

    public void start() throws ConfigError, InterruptedException {
        initiator.start();
    }

    public void stop() {
        initiator.stop();
    }

    public void onCreate(SessionID sessionId) {
        System.out.println("Session created: " + sessionId);
    }

    public void onLogon(SessionID sessionId) {
        System.out.println("Logon successful: " + sessionId);
    }

    public void onLogout(SessionID sessionId) {
        System.out.println("Logout successful: " + sessionId);
    }

    public void toAdmin(Message message, SessionID sessionId) {
        System.out.println("To admin: " + message);
    }

    public void fromAdmin(Message message, SessionID sessionId) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon {
        System.out.println("From admin: " + message);
    }

    public void toApp(Message message, SessionID sessionId) throws DoNotSend {
        System.out.println("To app: " + message);
    }

    public void fromApp(Message message, SessionID sessionId) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType {
        System.out.println("From app: " + message);
    }

    public static void main(String[] args) throws Exception {
        IBGatewayFixClient client = new IBGatewayFixClient("localhost", 4001);
        client.start();

        String orderId = "12345";
        String symbol = "AAPL";
        Side side = new Side(Side.BUY);
        OrdType orderType = new OrdType(OrdType.LIMIT);
        double price = 100.0;
        int quantity = 100;
        NewOrderSingle order = new NewOrderSingle(new ClOrdID(orderId), side, new TransactTime(), orderType);
        order.set(new Symbol(symbol));
        order.set(new Price(price));
        order.set(new OrderQty(quantity));
        Session.sendToTarget(order, new SessionID("FIX.4.4", "IBGATEWAY", "FIXCLIENT"));

        Thread.sleep(5000);

        client.stop();
    }
}

以上代码中,我们首先创建了一个IBGatewayFixClient类,其中包含了QuickFIX的SocketInitiator对象和IB Gateway的配置信息。在IBGatewayFixClient类中,我们实现了Application接口,并重写了其各个方法,用于处理FIX消息的发送和接收。在main方法中,我们创建了一个NewOrderSingle消息,并使用Session.sendToTarget方法将其发送到IB Gateway。需要注意的是,代码中的FIX版本、消息类型、字段名称等需要根据具体情况进行修改。

  1. 测试封装效果

在完成封装后,可以使用FIX客户端或FIX测试工具来测试封装效果。可以向IB Gateway发送各种类型的FIX消息,例如NewOrderSingle、OrderCancelRequest、OrderStatusRequest等,以测试与IB交易系统的交互。需要注意的是,使用FIX协议进行交易可能存在风险和限制,需要仔细阅读相关文档和条款,并采取适当的风险管理措施。