【问题标题】:C# - Interactive Brokers API - get market dataC# - Interactive Brokers API - 获取市场数据
【发布时间】:2016-04-26 06:58:20
【问题描述】:

我正在尝试使用 C# 中的基础 Interactive Broker API 来处理外汇市场数据。我的目标是获得多个货币对的买入价和卖出价。

这就是我现在所拥有的。主要:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IBApi;

namespace TWS_Data
{
    class Program
    {
        static void Main(string[] args)
        {
            //IB's main object
            EWrapperImpl ibClient = new EWrapperImpl();

            //Connect
            ibClient.ClientSocket.eConnect("127.0.0.1", 7497, 0);

            //Creat and define a contract to fetch data for
            Contract contract = new Contract();
            contract.Symbol = "EUR";
            contract.SecType = "CASH";
            contract.Currency = "USD";
            contract.Exchange = "IDEALPRO";

            // Create a new TagValue List object (for API version 9.71) 
            List<TagValue> mktDataOptions = new List<TagValue>();


            // calling method every X seconds
            var timer = new System.Threading.Timer(
            e => ibClient.ClientSocket.reqMktData(1, contract, "", true, mktDataOptions),
            null,
            TimeSpan.Zero,
            TimeSpan.FromSeconds(10));

         }
    }
}

API 函数“reqMktData”调用以下两个函数:

        public virtual void tickSize(int tickerId, int field, int size)
        {
            Console.WriteLine("Tick Size. Ticker Id:" + tickerId + ", Field: " + field + ", Size: " + size + "\n");
        }

        public virtual void tickPrice(int tickerId, int field, double price, int canAutoExecute)
        {
            Console.WriteLine("Tick Price. Ticker Id:" + tickerId + ", Field:" + field + ", Price:" + price + ", CanAutoExecute: " + canAutoExecute + "\n");
            string str = Convert.ToString(price);
            System.IO.File.WriteAllText(@"C:\Users\XYZ\Documents\price.txt", str);
        }

在这段代码中,我试图将市场数据保存在我的硬盘上作为虚拟测试。但是,这里我的问题出现了。在一次运行中,函数 tickPrice(..) 被调用 6 次并提供 6 种不同的价格(请参阅此处的 API 指南:https://www.interactivebrokers.com/en/software/api/apiguide/java/tickprice.htm

我现在需要知道的是如何在 C# 中以某种方式保存这些单独的结果? (它们都被发布到控制台,但显然只有最后一个价格是保存在文件中的价格)。

我对 Matlab 编码非常熟悉,但对 C# 语法不熟悉。所以我以某种方式思考向量或 for 循环的形式来解决这个问题,但它不是那样工作的。

感谢任何帮助或提示

【问题讨论】:

    标签: c# data-structures algorithmic-trading


    【解决方案1】:

    您可以使用 List 来存储所有值,例如:

        List<string> priceList = new List<string>();
        public virtual void tickPrice(int tickerId, int field, double price, int canAutoExecute)
        {
            Console.WriteLine("Tick Price. Ticker Id:" + tickerId + ", Field:" + field + ", Price:" + price + ", CanAutoExecute: " + canAutoExecute + "\n");
    
            // here you add your prices to list
            priceList.Add(price);
    
            string str = Convert.ToString(price);
            System.IO.File.WriteAllText(@"C:\Users\XYZ\Documents\price.txt", str);
        }
    

    从列表中获取最后一个条目:

        string lastPrice = priceList[priceList.Count - 1];
    

    【讨论】:

    • 我正在使用相同的函数/代码,但回调函数 tickPrice 或 tickSize 没有被触发。请您指导我一点,因为我是第一次与 IBAPI 打交道。
    • @AneeqAzamKhan 不幸的是我对 IBAPI 不熟悉,无法帮助你:(
    【解决方案2】:

    我通过将回调中的值作为实例变量存储在先前创建的对象列表集合中来做到这一点。

    我从循环内部调用了reqMarketData() 函数,并在主程序类中将循环的迭代设置为静态整数,因此可以从EWrapperImpl 的回调函数中识别它,例如tickPrice()

    循环遍历对象集合的长度(在我的例子中,每个基础合约对应一个对象)。这样,EWrapperImpl 回调中的以下示例代码会将每个请求的数据保存在集合中的一个对象中。

    public virtual void tickPrice(int tickerId, int field, double price, int canAutoExecute)      
    {         
      Program.exampleCollection[Program.exampleIteration].ExamplePriceVar = price;
    }
    

    然后您可以使用该集合访问EWrapperImpl 回调之外的数据。 (示例代码没有展示集合实例、对象实例或实例变量的创建)

    【讨论】:

    • 我正在使用相同的函数/代码,但回调函数 tickPrice 或 tickSize 没有被触发。请您指导我一点,因为我是第一次与 IBAPI 打交道。
    【解决方案3】:

    解决数据被多次返回而不是一次返回的问题:

    -您需要确定要将price 用于哪个字段。无论如何,它都会为您提供多个字段。在您使用tickPrice() 的情况下,每个字段代表不同类型的价格。

    public virtual void tickPrice(int tickerId, int field, double price, int canAutoExecute)
        {
            if (field == 4)
            {
                //here, price is equal to the "last" price.
            }
            else
            {
            }
    
            if (field == 9)
            {
                //here, price is equal to the "close" price.
            }
            else
            {
            }
        }
    

    【讨论】:

    • 我正在使用相同的函数/代码,但回调函数 tickPrice 或 tickSize 没有被触发。请您指导我一点,因为我是第一次与 IBAPI 打交道。
    【解决方案4】:

    您的问题是File.WriteAllText 会覆盖文件的内容(如果存在)。这就是为什么您只能看到最新数据。

    但是你需要的是将数据追加到文件中,例如:

      using (var file = File.AppendText(@"C:\Users\XYZ\Documents\price.txt"))
           file.WriteLine(str);
    

    但是,我相信您订阅了多种工具并收到了来自不同线程的报价。在这种情况下,有时您会遇到异常,该文件正忙,因此您需要更复杂的东西来记录数据(例如 NLog)。

    【讨论】:

    • 我正在使用相同的函数/代码,但回调函数 tickPrice 或 tickSize 没有被触发。请您指导我一点,因为我是第一次与 IBAPI 打交道。
    猜你喜欢
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多