Trade.dll 股票交易接口C#调用源代码
http://www.nezip.cn/forum.php?mod=viewthread&tid=9&fromuid=1
(出处: 网际风官网)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.IO;
using System.Threading;
using System.Windows.Forms;
using System.Collections.Specialized;
using System.Web;
using System.Net.Sockets;
using static System.Net.Mime.MediaTypeNames;
//总体说明:调用很简单,载入dll→发出指令→等待结果→解析结果
namespace TradeCS
{
class CTest
{
[DllImport("Trade.dll")]
private extern static int Start(RcvCallback_ callBack, IntPtr answer, int maxLen); //注册回调函数
[DllImport("Trade.dll")]
public extern static int Ask([MarshalAs(UnmanagedType.LPTStr)] string ask, IntPtr answer, int maxLen); //发出指令,参数参考调用规范填写,比如 下单?请求=登录&券商=信达证券
[DllImport("Trade.dll")]
private extern static int Stop(); //注销
[UnmanagedFunctionPointerAttribute(CallingConvention.StdCall, CharSet = CharSet.Unicode)]
public delegate int RcvCallback_(IntPtr ans, IntPtr data, int len, IntPtr dataEx, int exLen); //定义回调函数对应的委托
public static RcvCallback_ m_callBack = null;
public static TcpC m_tdx = null;
public static CTest s_test = new CTest();
//回调函数占用内部线程,为防止锁死,禁用运行耗时严重任务或进行界面操作。
public static int Answer(IntPtr ans, IntPtr data, int len, IntPtr dataEx, int exLen)
{
String query = KV_BASE.String(ans, "请求");
String pkName = KV_BASE.String(ans, "包名称");
String err = KV_BASE.String(ans, "错误");
String kind = KV_BASE.Kind(ans);
int td = KV_BASE.Int(ans, "通道");
if (err.Length > 0)
{
Console.WriteLine(err);
return 1;
}
if (kind == "内部指令")
{
if (query == "重新载入 Trade.dll")
{
MessageBox.Show("Trade.dll 有升级,需要重启程序后生效。", "提示信息", MessageBoxButtons.YesNo);
return 0; //返回 0 ,然后重启您的程序。
}
return 1;
}
if (pkName == "发送包")
{
if (td == 0) //其它模式和通道自行参考改写
{
return m_tdx.Answer(ans, data, len, dataEx, exLen);
}
return 1;
}
return 1;
}
static Task Main(string[] args)
{
Console.Write("股票交易接口使用。\r\n\r\n");
Console.Write("按 q + 回车 退出演示。\r\n\r\n");
Console.Write("正在初始化交易客户端。\r\n\r\n");
Console.Write("参考调用规范,直接输入下单指令。\r\n\r\n");
m_callBack = Answer;
int maxLen = 2048 * 1000;
IntPtr answer = Marshal.AllocHGlobal(maxLen); //多线程,需要每个线程分配一次
string txt = null;
string str = null;
bool proMode = false; //true 专业模式,将自行与券商进行TCP通讯;默认 false 使用trade.dll进行TCP通讯
int ret = Start(m_callBack, answer, proMode ? 8888 : maxLen); //注册回调函数,8888表示专业模式
if (ret > 0)
{
if (proMode)
{
str = KV_BASE.Json(answer);
}
else
{
str = Marshal.PtrToStringUni(answer);
}
Console.WriteLine(str);
}
txt = "下单?请求=连接Trade.exe";
ret = Ask(txt, answer, maxLen);
if (ret > 0)
{
if (proMode)
{
str = KV_BASE.Json(answer);
}
else
{
str = Marshal.PtrToStringUni(answer);
}
Console.WriteLine(str);
}
txt = "下单?请求=登录&模块=认证&账号=6&密码=1&自动升级=开发版&版本=20221120&等待=10000";
//填写自己认证账号密码
//自动升级:稳定版、最新版、测试版、开发版,大部分账号选择稳定版,其中开发版不支持自动升级,需要手工升级。
ret = Ask(txt, answer, maxLen);
if (ret > 0)
{
if (proMode)
{
str = KV_BASE.Json(answer);
}
else
{
str = Marshal.PtrToStringUni(answer);
}
Console.WriteLine(str);
}
m_tdx = new TcpC(); //负责券商数据交换,每个通道建立一个实例
txt = "下单?请求=登录&通道=0&模块=小信&信用=1&券商=开源证券&账号=88&密码=60&等待=20000";
//填写自己券商账号密码
ret = Ask(txt, answer, maxLen);
if (ret > 0)
{
if (proMode)
{
str = KV_BASE.Json(answer);
}
else
{
str = Marshal.PtrToStringUni(answer);
}
Console.WriteLine(str);
}
while (true)
{
txt = Console.ReadLine();
if (txt == null) //非控制台方式
{
break;
}
if (txt == "q")
{
break;
}
ret = Ask(txt, answer, maxLen); //输入调用指令
if (ret > 0)
{
if (proMode)
{
str = KV_BASE.Json(answer);
}
else
{
str = Marshal.PtrToStringUni(answer);
}
Console.WriteLine(str);
}
}
txt = "系统?请求=退出接口";
ret = Ask(txt, answer, maxLen);
Stop(); //注销
Marshal.FreeHGlobal(answer); //释放内存
return Task.CompletedTask;
}
}
}
[/font]