搜索
查看: 1449|回复: 5

pythion写的一个dll调用转成aardio应该怎样写?

[复制链接]

6

主题

19

帖子

120

积分

一级会员

Rank: 2

积分
120
发表于 2017-10-19 10:03:09 | 显示全部楼层 |阅读模式
这是交易助手order.dll的一段调用范例,现在pythion的源码,如果改成aardio应该怎样写?

1、StockOrderApi.py内容

  1. #股票自动交易助手 Python 自动下单接口
  2. #把此脚本和 Order.dll 放到你自己编写的脚本同一目录
  3. #如何使用请参考 StockOrder.py

  4. from ctypes import *

  5. #加载API库
  6. api = windll.LoadLibrary( 'Order.dll' )

  7. #初始化函数的参数类型
  8. api.Buy1.argtypes=[c_wchar_p, c_int, c_float, c_int, c_int]

  9. api.Sell1.argtypes=[c_wchar_p, c_int, c_float, c_int, c_int]

  10. api.GetPosInfo.restype = c_float
  11. api.GetPosInfo.argtypes=[c_wchar_p, c_int, c_int]

  12. api.GetAccountInfo.restype = c_float
  13. api.GetAccountInfo.argtypes=[c_wchar_p, c_int,  c_int]

  14. api.GetAllPositionCode.restype = c_wchar_p
  15. api.GetAllPositionCode.argtypes=[c_int]

  16. api.GetAllOrderCode.restype = c_wchar_p
  17. api.GetAllOrderCode.argtypes=[c_int,  c_int]

  18. api.GetOrderInfo.restype = c_float
  19. api.GetOrderInfo.argtypes=[c_wchar_p, c_int, c_int, c_int]

  20. api.CancelOrder1.restype = c_int
  21. api.CancelOrder1.argtypes=[c_wchar_p, c_int, c_int]

  22. #以下是股票自动交易下单和查持仓等相关函数
  23. def Buy(stkCode, vol, price, formulaNum, ZhuShouHao):
  24.     api.Buy1(stkCode, vol, price, formulaNum, ZhuShouHao)

  25. def Sell(stkCode, vol, price, formulaNum, ZhuShouHao):
  26.     api.Sell1(stkCode, vol, price, formulaNum, ZhuShouHao)

  27. def GetPosInfo(stkCode, nType, nZhuShouHao):
  28.     return api.GetPosInfo(stkCode, nType, nZhuShouHao)

  29. def GetAccountInfo(stkCode, nType, nZhuShouHao):
  30.     return api.GetAccountInfo(stkCode, nType, nZhuShouHao)

  31. def GetAllPositionCode(nZhuShouHao):
  32.     return api.GetAllPositionCode(nZhuShouHao)

  33. def GetAllOrderCode(nZhuShouHao, orderType):
  34.     return api.GetAllOrderCode(nZhuShouHao, orderType)
  35.    
  36. def GetOrderInfo(stkCode, orderType, infoType, nZhuShouHao):
  37.     return api.GetOrderInfo(stkCode, orderType, infoType, nZhuShouHao)
  38.    
  39. def CancelOrder(stkCode, orderType, nZhuShouHao):
  40.     return api.CancelOrder1(stkCode, orderType, nZhuShouHao)
复制代码



2、StockOrder.py内容

  1. #股票自动交易助手 Python 自动下单使用 例子
  2. #把此脚本和 StockOrderApi.py Order.dll 放到你自己编写的脚本同一目录

  3. from StockOrderApi import *

  4. #买入测试
  5. #Buy(u"600000" , 100, 0, 1, 0)

  6. #卖出测试,是持仓股才会有动作
  7. #Sell(u"000100" , 100, 0, 1, 0)

  8. #账户信息
  9. print("股票自动交易接口测试")
  10. print("账户信息")
  11. print("--------------------------------")

  12. arrAccountInfo = ["总资产", "可用资金", "持仓总市值", "总盈利金额", "持仓数量"];
  13. for i in range(0, len(arrAccountInfo)):
  14. value = GetAccountInfo( u""  , i, 0)
  15. print ("%s %f "%(arrAccountInfo[i], value))

  16. print("--------------------------------")
  17. print(" ")

  18. print("股票持仓")
  19. print("--------------------------------")
  20. #取出所有的持仓股票代码,结果以 ','隔开的
  21. allStockCode = GetAllPositionCode(0)
  22. allStockCodeArray = allStockCode.split(',')
  23. for i in range(0, len(allStockCodeArray)):
  24. vol = GetPosInfo( allStockCodeArray[i]  , 0 , 0)
  25. changeP = GetPosInfo( allStockCodeArray[i]  , 4 , 0)
  26. print ("%s %d %.2f%%"%(allStockCodeArray[i], vol, changeP))

  27. print("--------------------------------")

  28. print("可撤买单")
  29. print("--------------------------------")
  30. allStockCode = GetAllOrderCode(0,1)
  31. allStockCodeArray = allStockCode.split(',')
  32. for i in range(0, len(allStockCodeArray)):
  33. vol = GetOrderInfo( allStockCodeArray[i]  , 0 , 0, 0)
  34. seconds = GetOrderInfo( allStockCodeArray[i]  , 0 , 1, 0)
  35. print ("%s %d %d"%(allStockCodeArray[i], vol, seconds))

  36. print("--------------------------------")

  37. print("可撤卖单")
  38. print("--------------------------------")
  39. allStockCode = GetAllOrderCode(0,2)
  40. allStockCodeArray = allStockCode.split(',')
  41. for i in range(0, len(allStockCodeArray)):
  42. vol = GetOrderInfo( allStockCodeArray[i]  , 1 , 0, 0)
  43. seconds = GetOrderInfo( allStockCodeArray[i]  , 1 , 1, 0)
  44. print ("%s %d %d"%(allStockCodeArray[i], vol, seconds))

  45. print("--------------------------------")

  46. #撤买
  47. CancelOrder("600036", 1, 0);
  48. #撤卖
  49. CancelOrder("600018", 2, 0);
复制代码




求解,万份感谢了
回复

使用道具 举报

186

主题

2536

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13930
发表于 2017-10-19 12:22:16 | 显示全部楼层
很多时候大家提这些问题,网址和DLL这些都要我自己去找,
不知道你说的是不是这个:http://www.gupiaohelp.com/help/13_3.html

他这个DLL是cdecl调用约定,unicode编码,所以你这样加载DLL:
var dll = raw.loadDll("Order.dll的路径",,"cdecl,unicode")

api声明可以用aardio自带的工具转换一下:
//1.交易API均是Order.dll文件的导出函数,包括以下函数:
/// 买入 Buy1,由于提供给大智慧的函数名是 BUY,为了不重名,因此是 Buy1
/// <param name="stkCode">股票代码 如:600000</param>
/// <param name="vol">买入数量:股数</param>
/// <param name="price">买入价格:如果是0按助手的设置价格下单</param>
/// <param name="formulaNum">公式编号,和大智慧公式编号类似,只是一个标记,区分那个买入的</param>
/// <param name="ZhuShouHao">助手编号,如果开了多个助手,可以指定编号</param>
/// <returns>返回值无意义,可忽略</returns>
Buy1  = dll.api("Buy1","int(ustring stkCode, int vol, float price, int formulaNum, int ZhuShouHao)");

/// 卖出 Sell1,由于提供给大智慧的函数名是 SLLL,为了不重名,因此是 Sell1
/// <param name="stkCode">股票代码 如:600000</param>
/// <param name="vol">卖出数量:股数</param>
/// <param name="price">卖出价格:如果是0按助手的设置价格下单</param>
/// <param name="formulaNum">公式编号,和大智慧公式编号类似,只是一个标记,区分那个买入的</param>
/// <param name="ZhuShouHao">助手编号,如果开了多个助手,可以指定编号</param>
/// <returns>返回值无意义,可忽略</returns>
Sell1 = dll.api("Sell1","int(ustring stkCode, int vol, float price, int formulaNum, int ZhuShouHao)");


/// 获取个股持仓信息 GetPosInfo
/// <param name="stkCode">股票代码 如:600000</param>
/// <param name="nType">持仓信息类型:0持仓总量(股)//1可卖数量(股)//2成本价//3盈利金额//4盈利百分比 //5持仓市值//6下单天数//7持仓天数</param>
/// <param name="ZhuShouHao">助手编号,如果开了多个助手,可以指定编号</param>
/// <returns>返回相应的持仓信息</returns>
GetPosInfo = dll.api("GetPosInfo","float(ustring stkCode, int nType, int nZhuShouHao)");

/// 获取账户信息 GetPosInfo
/// <param name="stkCode">股票代码 如:600000</param>
/// <param name="nType">持仓信息类型://0总资产//1可用资金//2持仓总市值//3总盈利金额//4持仓数量</param>
/// <param name="ZhuShouHao">助手编号,如果开了多个助手,可以指定编号</param>
/// <returns>返回相应的持仓信息</returns>
GetAccountInfo = dll.api("GetAccountInfo","float(ustring stkCode, int nType, int nZhuShouHao)");

/// 初始化接收行情 InitReceiveQuote
/// <param name="hQuoteWnd">负责接收行情的窗口 此窗口通过响应 WM_COPYDATA接收行情</param>
/// <param name="ZhuShouHao">助手编号,如果开了多个助手,可以指定编号</param>
/// <returns>返回值 忽略</returns>
InitReceiveQuote = dll.api("InitReceiveQuote","void(addr hQuoteWnd, int ZhuShouHao)");

/// 注册某个股票的行情 RegisterQuote
/// <param name="stkCode">股票代码 如:600000</param>
/// <param name="ZhuShouHao">助手编号,如果开了多个助手,可以指定编号</param>
RegisterQuote = dll.api("RegisterQuote","void(ustring stkCode, int ZhuShouHao)");

/// 返回所有持仓股票代码,以 ','号分开
/// <param name="ZhuShouHao">助手编号,如果开了多个助手,可以指定编号</param>
GetAllPositionCode = dll.api("GetAllPositionCode","ustring(int nZhuShouHao)");

/// 撤单由于提供给大智慧的函数名是 CancelOrder,为了不重名,因此是 CancelOrder1
/// <param name="stkCode">股票代码 如:600000</param>
/// <param name="orderType">撤单类型:1撤买单,2撤卖单</param>
/// <param name="ZhuShouHao">助手编号,如果开了多个助手,可以指定编号</param>
/// <returns>返回值无意义,可忽略</returns>
CancelOrder1 = dll.api("CancelOrder1","int(ustring stkCode, int orderType, int ZhuShouHao)");

/// 返回所有可撤股票代码,以 ','号分开
/// <param name="ZhuShouHao">助手编号,如果开了多个助手,可以指定编号</param>
// <param name="orderType">可撤单类型:1撤买单,2撤卖单</param>
GetAllOrderCode = dll.api("GetAllOrderCode","ustring(int nZhuShouHao, int orderType)");

/// 获取个股可撤单信息 GetOrderInfo
/// <param name="stkCode">股票代码 如:600000</param>
/// <param name="orderType">可撤单类型:1撤买单,2撤卖单</param>
/// <param name="infoType">查询类型:0数量,1时间秒</param>
/// <param name="ZhuShouHao">助手编号,如果开了多个助手,可以指定编号</param>
/// <returns>返回相应的可撤单信息</returns>
GetOrderInfo = dll.api("GetOrderInfo","float(ustring stkCode, int orderType, int infoType, int nZhuShouHao)");

Unicode字符串要声明为ustring
回复

使用道具 举报

6

主题

19

帖子

120

积分

一级会员

Rank: 2

积分
120
 楼主| 发表于 2017-10-19 12:40:58 | 显示全部楼层
嗯嗯  谢谢版主,学习了
回复

使用道具 举报

6

主题

26

帖子

226

积分

培训班

积分
226
发表于 2017-10-19 15:17:54 | 显示全部楼层
zchenxi 发表于 2017-10-19 12:40
嗯嗯  谢谢版主,学习了

这个接口上次用了下没成功,应该要开着大智慧然后登入资金帐号才有用吧?
回复

使用道具 举报

6

主题

19

帖子

120

积分

一级会员

Rank: 2

积分
120
 楼主| 发表于 2017-11-27 11:59:58 | 显示全部楼层
Jacen.He 发表于 2017-10-19 12:22
很多时候大家提这些问题,网址和DLL这些都要我自己去找,
不知道你说的是不是这个:http://www.gupiaohelp ...

Sell1 = dll.api("Sell1","int(ustring stkCode, int vol, float price, int formulaNum, int ZhuShouHao)");
是这样声明的,但是运行时提示
cannot find function 'Sell1' in the dll

但是看他其他源码里都是用的 'Buy1' 'Sell1' 这样的函数名;

我用dll分析软件查看dll的时候,发现里面却是  _Buy1@20   _Sell1@20 这样的?
回复

使用道具 举报

186

主题

2536

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13930
发表于 2017-11-27 12:09:34 | 显示全部楼层
zchenxi 发表于 2017-11-27 11:59
Sell1 = dll.api("Sell1","int(ustring stkCode, int vol, float price, int formulaNum, int ZhuShouHao ...


如果DLL的实际函数名是_Buy1@20   _Sell1@20 ,那你就要这样写,
一般DLL不应该直接使用这样的修饰名,会出现兼容性的问题(修饰名的规则不同编译器不一定是一样的)。

你可以写
Sell1 = dll.api("_Sell1@20"


这种修饰名的调用约定是stdcall,你需要把调用约定改成stdcall,删掉该参数也可以(因为默认stdcall)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-8-15 10:45 , Processed in 0.062501 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表