现在才看到你的帖子,一直在找OQ或是QD的破解,没有找到,不知能否给我发一个,真的万分感谢了~ 我的邮箱:wingsmart@gmail.com MSN:jankingki@hotmail.com可以与我联系
谢谢老大信任,我恭敬不如从命喽。 我得老实交代一下,我只写过几个QD数据插件,完整的策略一个也没写过:o。QD已经从我硬盘删除至少有一年时间了,短期内不会研究它。如果有人愿意担任QD版版主,我随时让位啦。
点击这里下载。下载解压后放在QD的BIN目录,tools->configuration->providers->add...。最好将其DiverDll属性设置为通视的DLL文件的完整路径,如d:\jinzo\stock.dll。
//为了回馈海洋的好友,现张贴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 } }