几个QD插件的源码

Discussion in 'QuantDeveloper' started by zwz, Feb 27, 2009.

  1. 现在才看到你的帖子,一直在找OQ或是QD的破解,没有找到,不知能否给我发一个,真的万分感谢了~
    我的邮箱:wingsmart@gmail.com
    MSN:jankingki@hotmail.com可以与我联系
     
  2. 恭喜楼上,因为zwz今天刚就任本版版主。
    在Google看到你刚大学毕业三年,现已进入行业前沿实务,前途无限啊。
     
  3. 呵呵,我也是刚看到。谢谢张兄。
     
  4. 恭贺ZWZ博士成为QD版主,能否抽时间完善一下通视接口,自己按上面的代码调试一直无法通过。
     
  5. zwz

    zwz

    谢谢老大信任,我恭敬不如从命喽。
    我得老实交代一下,我只写过几个QD数据插件,完整的策略一个也没写过:o。QD已经从我硬盘删除至少有一年时间了,短期内不会研究它。如果有人愿意担任QD版版主,我随时让位啦。
     
  6. zwz

    zwz

    自己整出来了?也不说一声呵呵:)

    通视接口在QD2.4或2.7应该还是可以用的,不知道你调试时出现什么错误?或者我回头把编译后的DLL发给你?

    PS我有时在ID前加dr,不是博士、医生的意思呵呵。。。
     
  7. 把编译后的DLL放在你的LIVE空间中就可以下载,和RE的接口放一起。
     
  8. 呵呵,当时没搞出来就没管了。本意是提取一点pobo的外盘数据,后来也不怎么需要了。

    张兄的回复没有留意,这两天才发现。赶紧记录了下来,过段时间还是会用得上。
     
  9. zwz

    zwz

    点击这里下载。下载解压后放在QD的BIN目录,tools->configuration->providers->add...。最好将其DiverDll属性设置为通视的DLL文件的完整路径,如d:\jinzo\stock.dll。
     
  10. 太伟大了,周一开盘测试一下。
     
  11. 向老大的工作致敬!

    如遇加载不成功可能是因为缺少引用文件引起。。。请重新编译。。。添加system.design
     
  12. //为了回馈海洋的好友,现张贴QD的通达信的日数据插件
    using System;
    using System.Collections.Generic;
    using System.IO;
    using SmartQuant.Providers;
    using SmartQuant.Data;
    using SmartQuant.FIX;
    using System.ComponentModel;
    using System.Drawing;
    using System.Drawing.Design;
    using System.Windows.Forms;


    namespace MyLab
    {
    public class TdxProvider : IProvider, IHistoryProvider
    {
    private string tdxPath = @"D:\GTJARZ\";

    public TdxProvider()
    {
    ProviderManager.Add(this);
    }
    [Category("设置"), Description("通达信安装目录"), DefaultValue(@"D:\GTJARZ\")]
    public string TdxPath
    {
    get { return this.tdxPath; }
    set
    {
    this.tdxPath = value.Trim();
    }
    }
    private void EmitError(int id, int code, string message)
    {
    if (Error != null)
    Error(new ProviderErrorEventArgs(new ProviderError(DateTime.Now, this, id, code, message)));
    }

    #region IProvider 成员
    private bool isConnected = false;
    public void Connect(int timeout)
    {
    this.Connect();
    ProviderManager.WaitConnected(this, timeout);
    }

    public void Connect()
    {
    if (System.IO.Directory.Exists(this.tdxPath))
    {
    isConnected = true;
    if (Connected != null)
    {
    Connected(this, new EventArgs());
    }
    }
    else
    {
    this.EmitError(-1, -1, this.tdxPath + "的Pobo文件夹不存在!");
    }
    }

    public event EventHandler Connected;

    public void Disconnect()
    {
    isConnected = false;
    if (Disconnected != null)
    Disconnected(this, new EventArgs());
    }

    public event EventHandler Disconnected;

    public event ProviderErrorEventHandler Error;

    [Category("信息")]
    public byte Id
    {
    get { return 192; }
    }

    [Category("信息")]
    public bool IsConnected
    {
    get { return isConnected; }
    }

    [Category("信息")]
    public string Name
    {
    get { return "通达信"; }
    }

    public void Shutdown()
    {

    }

    [Category("信息")]
    public ProviderStatus Status
    {
    get
    {
    if (!IsConnected)
    return ProviderStatus.Disconnected;
    else
    return ProviderStatus.Connected;
    }
    }

    public event EventHandler StatusChanged;

    [Category("信息")]
    public string Title
    {
    get { return "通达信本地数据 Provider"; }
    }

    [Category("信息")]
    public string URL
    {
    get { return String.Empty; }
    }
    #endregion

    #region IHistoryProvider 成员

    [Category("数据类型")]
    public bool BarSupported
    {
    get { return false; }
    }
    [Category("数据类型")]
    public bool DailySupported
    {
    get { return true; }
    }

    public Bar[] GetBarHistory(IFIXInstrument instrument, DateTime datetime1, DateTime datetime2, int barSize)
    {
    throw new NotImplementedException();
    }

    public Daily[] GetDailyHistory(IFIXInstrument instrument, DateTime datetime1, DateTime datetime2, bool dividendAndSplitAdjusted)
    {
    string mkt = instrument.SecurityExchange;
    return GetDailyList(instrument.Symbol, instrument.SecurityExchange, datetime1, datetime2);
    }

    public MarketDepth[] GetMarketDepthHistory(IFIXInstrument instrument, DateTime datetime1, DateTime datetime2)
    {
    throw new NotImplementedException();
    }

    public Quote[] GetQuoteHistory(IFIXInstrument instrument, DateTime datetime1, DateTime datetime2)
    {
    throw new NotImplementedException();
    }

    public Trade[] GetTradeHistory(IFIXInstrument instrument, DateTime datetime1, DateTime datetime2)
    {
    throw new NotImplementedException();
    }

    public bool MarketDepthSupported
    {
    get { throw new NotImplementedException(); }
    }
    [Category("数据类型")]
    public bool QuoteSupported
    {
    get { return false; }
    }
    [Category("数据类型")]
    public bool TradeSupported
    {
    get { return false; }
    }
    #endregion

    #region 通达信
    private Daily[] GetDailyList(string symbol, string mkt, DateTime datetime1, DateTime datetime2)
    {
    List<Daily> dailyList = new List<Daily>();
    string fileName = Path.Combine(tdxPath, @"Vipdoc\"+ mkt + @"\lday\" + mkt + symbol + @".day");
    if (File.Exists(fileName) == false)
    return dailyList.ToArray();

    int iDt1, iDt2;
    DateTime dt1900 = new DateTime(1900, 1, 1);
    DateTime dt2100 = new DateTime(2100, 1, 1);
    if (datetime1 > dt1900)
    iDt1 = datetime1.Year * 10000 + datetime1.Month * 100 + datetime1.Day;
    else
    iDt1 = 19000101;
    if (datetime2 > dt1900)
    iDt2 = datetime2.Year * 10000 + datetime2.Month * 100 + datetime2.Day;
    else
    iDt2 = 21000101;

    FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    BinaryReader br = new BinaryReader(fs);
    int recordCount = (int)(fs.Length / 32);
    double div = 100 * 1.0;
    int PriceDigits = 2;
    DayData day;
    for (long r = 0; r < recordCount; r++)
    {
    fs.Position = r * 32;
    day.date = br.ReadUInt32(); if (day.date < iDt1 || day.date > iDt2) continue;
    day.open = br.ReadUInt32(); day.high = br.ReadUInt32(); day.low = br.ReadUInt32(); day.close = br.ReadUInt32();
    day.amount = br.ReadUInt32();
    day.volume = br.ReadUInt32();
    br.ReadUInt32();

    string rqs = day.date.ToString().Trim();
    DateTime date = new DateTime(int.Parse(rqs.Substring(0, 4)), int.Parse(rqs.Substring(4, 2)), int.Parse(rqs.Substring(6, 2)));//日期
    Daily bar = new Daily();
    bar.DateTime = date;
    bar.Open = Math.Round(day.open / div, PriceDigits);
    bar.High = Math.Round(day.high / div, PriceDigits);
    bar.Low = Math.Round(day.low / div, PriceDigits);
    bar.Close = Math.Round(day.close / div, PriceDigits);

    bar.Volume = (long)day.volume;
    bar.OpenInt = (long)Math.Round(day.amount / div, 0);
    dailyList.Add(bar);
    }
    fs.Close();
    br.Close();
    return dailyList.ToArray();
    }
    private struct DayData
    {
    public uint date;
    public uint open; //元*1000
    public uint high;
    public uint low;
    public uint close;
    public uint amount;
    public uint volume; //手=100股
    uint unuse;
    }
    #endregion
    }
    }
     
    zhuce30hao likes this.
  13. 正准备自己编呢,每想到这儿有。Toby, 多谢!多谢!

    Charley
    ----------
    居安思危,居卫思安