搜索
查看: 99101|回复: 48

谈一点期货辅助交易软件制作经验

[复制链接]
发表于 2012-3-27 21:04 | 显示全部楼层

谈一点期货辅助交易软件制作经验

来自:MACD论坛(bbs.shudaoyoufang.com) 作者:wjlhc 浏览:99101 回复:48

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
期货软件制作效率比较高的是使用vb,好学,做起来也比较快,比如资金管理、下单之类的的软件一般初学三五个月就做得比较不错了,vb一般情况下用一个月就可以学完,但是最好的方法还是边学边做,用到哪里就学到那里,可以跳跃的学习,我建议新手开始学习时,最好看看视频,这样不是很枯燥,金文的vb视频课程就很好,当看到教如何画控件时,基本就可以自己开始做软件的界面了,而且可以放弃看视频,因为再接着看视频,学习效率相当低,不如直接看书快。
    新手尽量不要一开始就学习vc,因为没任何基础,很容易一开始就挂掉,因为学习曲线太陡了,还是最好从最基础vb开始,而且vb是连同语言和开发环境融合起来进行学习的,c++则不同,除了开始要学习c++(或c语言)外,还要在学完之后,专门学习开发环境的使用,而且c++不整个学完,是不可能做软件的。如果采用c++来做的话,制作效率会比vb低一些,可能对于vc方面的老手这点区别并不大,对新手则有天壤之别。学会vb后,一般2~3个月就能将c++和vc学完,当然学完和学好是两回事儿,我这里指的是可以做软件了。
    期货软件和股票不同,一般不需要接口获得数据,因为数据量少,没有必要。
    数据的获取一般有2种方法,一个是读内存的方法,一种是通过文字点阵识别的方法来获取。就安全性和效率上来说,这两种方法基本没有太多的差异。在同一台机子上我测试,读取内存需要23微妙,而识别60*30像素区域只需要60~70微妙,读取内存必须进行校验,否则可能发生不可预测的后果,校验的方法可以通过2次获取数据比较来判断数据是否正确。文字点阵识别方式则无须校验,所以这样两者时间上几乎差异很小。文字点阵进行识别,最好是指定软件窗口为句柄,而不是用桌面句柄,这样做的好处就是即使软件被遮挡或最小化后,也能正常进行识别。因为采用钩子来获取数据消耗资源和时间比较多,所以一般情况下都不采用这种方法。
    很多情况下软件的数据通过读取内存很难获取,这时候,文字识别就比较方便了。
    如果你打算采用行情软件的指标数据,我建议尽量不要用获取数据的方法,这样不但延时大,而且耗费计算机资源很多,最好的方法就是获取价格后,通过计算机计算出指标数据,这本身就是计算机的特长,即使几十个指标数据,计算机也完全能够在1毫秒内计算完成,而你需要的只是将最新成交价格给他,因此要省事的多。
    如果打算画出k线和指标等图形,可以用现成的控件来完成,要知道vb画图是很吃力的,远不如采用c++编写的控件效率高,准确的说,vb下采用c++控件是混合编程,是在编程效率和执行效率的最佳结合方式,能把c++的执行高效完全展现出来。
    好了,先说这些,以后再慢慢补充。

[ 本帖最后由 wjlhc 于 2012-3-27 21:11 编辑 ]
参与人数 4奖励 +43 热心 +5 金币 +3 时间 理由
东和二队 + 36 + 5 + 3 2012-7-8 21:41 MACD有楼主更精彩!
杨太极 + 5 2012-6-23 18:34 MACD有楼主更精彩!
ligao2518 + 1 2012-6-23 11:36 希望楼主能继续。

查看全部评分

金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

签到天数: 1 天

发表于 2012-3-27 21:49 | 显示全部楼层
不得不顶,请楼主继续写
金币:
奖励:
热心:
注册时间:
2003-4-12

回复 使用道具 举报

发表于 2012-3-27 22:15 | 显示全部楼层
#*d1*#
看了LZ的内容,准备不学EXECL VBA了,改学VC。
“通过文字点阵识别,用指定软件窗口为句柄”,是如何做的???,能举个例子吗?
会有1个这样的问题吗。比方说读要23微秒,1234这个值刚读到12,行情刷新为1345,读的结果会是1245吗?这样不就错了吗。
因为不相信TB之类的安全性,所以感兴趣LZ的方法。

[ 本帖最后由 加加减减 于 2012-3-27 22:17 编辑 ]
金币:
奖励:
热心:
注册时间:
2012-1-31

回复 使用道具 举报

发表于 2012-3-27 22:24 | 显示全部楼层
要是LZ的方法可行,不睡觉我也要学会VC这个东西。
金币:
奖励:
热心:
注册时间:
2012-1-31

回复 使用道具 举报

发表于 2012-3-28 11:30 | 显示全部楼层
等LZ过来。
金币:
奖励:
热心:
注册时间:
2012-1-31

回复 使用道具 举报

发表于 2012-4-4 00:20 | 显示全部楼层
有点意思,可否讲细些,例如如何实现自动下单?
金币:
奖励:
热心:
注册时间:
2009-9-23

回复 使用道具 举报

签到天数: 12 天

发表于 2012-4-4 08:03 | 显示全部楼层

回复 #6 战无不胜2009 的帖子

#*22*#
我也想知道。。。#*22*#
金币:
奖励:
热心:
注册时间:
2012-2-19

回复 使用道具 举报

 楼主| 发表于 2012-4-5 15:50 | 显示全部楼层

回复 #3 加加减减 的帖子

1   GetDC(you_HAND)
2 是的,有可能会产生不可预知的错误。一般来说,在写入内存时,应当暂时停止读取,如果不控制,就会产生错误。当然,也可以用循环2次读取,数据一致的话就采用,不一致就进入下一次读取,将这次读到的数据放弃,这样比较安全。一般内存写入数据的时间连1微妙都不到,而利用api获取内存则需要几十微秒,当然c语言用指针读取会极快,可以多读取一些其他的数据后再回来读,反正2次对比,数据一致就可以采用了。
金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

签到天数: 12 天

发表于 2012-4-5 16:08 | 显示全部楼层

回复 #8 wjlhc 的帖子

wj兄,怎么自动下单呢?
你是怎么个思路?
金币:
奖励:
热心:
注册时间:
2012-2-19

回复 使用道具 举报

 楼主| 发表于 2012-4-6 02:51 | 显示全部楼层

回复 #9 紫无华 的帖子

获取交易软件句柄>获取行情数据>判断>对交易窗口发送(按键)消息。
获取交易数据>判断>对交易窗口发送消息或结束。
结束。
当然,获取数据后,可以进行各种各样的逻辑判断,设定各种复杂开平仓条件,设定何种条件就仁者见仁、智者见智了。

[ 本帖最后由 wjlhc 于 2012-4-6 02:58 编辑 ]
参与人数 1奖励 +5 时间 理由
杨太极 + 5 2012-6-23 18:36 MACD有楼主更精彩!

查看全部评分

金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

签到天数: 12 天

发表于 2012-4-6 07:47 | 显示全部楼层

回复 #10 wjlhc 的帖子

类似按键精灵吗?#loveliness#
金币:
奖励:
热心:
注册时间:
2012-2-19

回复 使用道具 举报

签到天数: 2 天

发表于 2012-4-7 09:01 | 显示全部楼层
严重同意楼主的观点!
MACD真有高人!

[ 本帖最后由 y87658 于 2012-4-7 09:08 编辑 ]
金币:
奖励:
热心:
注册时间:
2008-11-12

回复 使用道具 举报

 楼主| 发表于 2012-6-22 20:10 | 显示全部楼层
sleep是一个延时函数,精度为毫秒,一般情况下通常最短的延时不会小于10毫秒(和本身的计算机性能相关),所以无论sleep 1还是sleep 5或是sleep 10 所延时的时间大致都是10毫秒,但是sleep 15所用延时则为15毫秒。
       可以通过它来进行延时,或者来控制cpu的占有率,如果不使用它,一个大的循环会使cpu占用率达到100%,单核会出现“假死”现象,直到循环结束。
比如延时100毫秒:Sleep 100
sleep通常会和DoEvents一起来使用,DoEvents是释放对系统的控制权,使计算机能利用sleep的空暇时间来处理其他事务。DoEvents函数无需声明,sleep是一个API函数,需要声明,声明如下:
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
要注意vb.net中long要改成Integer:Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Integer)
可以用sleep写成自己的函数Mysleep,精度为10毫秒,也就是说一个Mysleep为10毫秒,10个为100毫秒:
Public Sub MySleep(ByVal n As Long)  '延时函数,不会假死
     Dim sTime As Long
        sTime = 1
        While sTime <= n
            sTime = sTime + 1
            System.Windows.Forms.Application.DoEvents()''vb.net所用方法
            ' DoEvents()'vb6所用方法
            Sleep(10)
        End While
    End Sub
使用时MySleep(10)就可以了,即延时100毫秒。

[ 本帖最后由 wjlhc 于 2012-6-23 00:44 编辑 ]
参与人数 1奖励 +5 时间 理由
杨太极 + 5 2012-6-23 18:36 MACD有楼主更精彩!

查看全部评分

金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

 楼主| 发表于 2012-6-22 20:38 | 显示全部楼层
我们说过获取数据的方法之一是使用文字识别的方法,可以使用双缓冲的方法,还有3种方法比这种快,有的会快上几倍。取到颜色数据后再点阵识别,最后得到文字。使用指针来处理颜色数据是最快的方法,除此之外,尽可能的不用或者少用动态数组,用动态数组会因为原来的内存不连续而发生错误,微软用了新的函数来处理动态数组,比如vb中就不会产生动态数组不安全的问题,这和c语言不同,因为微软每用一次动态数组函数,就会将原来的内存重新拷贝一次,内存是连贯的,但是这种安全性是以牺牲性能和内存空间(易产生大量不连贯无法利用的内存空间——内存垃圾碎片),同样的文字识别代码,动态数组和静态数组在性能上相差200倍左右。如果必须使用动态数组,可以向微软学习,先一次申请足够大的数组,等到数组不够用时,再一次申请一个比原来大一倍数组,以此类推,这样会使性能和内存的利用率提高很多。
      至于文字识别的安全性,本身也不是问题,可以针对易出问题的方面想出对策就可以了。比如担心软件的移动,可以采用程序将软件固定在桌面的固定位置,这是很容易的。如果窗口被挡住,用api函数将前面的软件窗口透明度设一下就可以了,这样后面的软件界面照样在内存当中刷新,由于采用了透明度设置,尽管人的眼睛看不到后面的界面,可计算机却能“看”到。可以这样认为,凡是遇到的困难,都应用软件来解决,我在制作软件过程中,基本没有遇到能难倒的,并不是水平高,而是肯去思考解决的方法,这和学习做期货没有区别,一个害怕遇到问题害怕解决问题,不肯开动脑筋的人,在期货上是没有出头之日的,可以这样说,期货上长期亏损是与一个人缺乏善于学习思考善于创新不怕困难的精神分不开的。思维的僵化教条往往是成功的最大障碍。
       采用API函数读取内存一般需要20微妙左右的时间,为了防止读取错误,要多读一次,加上校验时间大致读取一个数据需要60微妙,而双缓冲的方法完全识别数据(20*80像素)也仅用60微妙,所以效率并不低,方便性不言而喻。
        如果用钩子函数和句柄获取内容 ,效率大致差不多,基本也在60微妙。
如果开发商业软件,为了保证可靠性,可以直接和交易软件开发公司联系购买,一般软件公司都有接口和文档提供,费用也不是很高,但是个人使用而言,基本上没有太大必要性,毕竟资金有限。对于有实力的大客户每年支付2000元的接口费用基本不在话下,毕竟现成的接口不仅安全,而且开发效率也是成倍的。

[ 本帖最后由 wjlhc 于 2012-6-22 22:10 编辑 ]
参与人数 1奖励 +5 时间 理由
杨太极 + 5 2012-6-23 18:37 MACD有楼主更精彩!

查看全部评分

金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

 楼主| 发表于 2012-6-22 21:57 | 显示全部楼层
后台鼠标移动和点击要用到消息函数
'获取窗口句柄
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
'获取子窗口句柄
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer
'发送消息
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
'发送消息
    Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Private Const WM_LBUTTONDOWN = &H201 '窗口中按下鼠标左键
Private Const WM_LBUTTONUP = &H202 '窗口中松开鼠标左键
Private Const WM_MOUSEMOVE = &H200 '窗口中移动鼠标
Private Const WM_RBUTTONDOWN = &H204 '窗口中按下鼠标右键
Private Const WM_RBUTTONUP = &H205 '窗口中松开鼠标右键
Private Const WM_MOUSEWHEEL = &H20A '鼠标滚轮
Private Const WM_NCLBUTTONDOWN = &HA1 '窗口标题栏中按下鼠标左键
Private Const WM_NCLBUTTONUP = &HA2 '窗口标题栏中左开鼠标左键
Private Const WM_NCMOUSEMOVE = &HA0  '窗口标题栏中移动鼠标
Private Const WM_NCRBUTTONDOWN = &HA4 '窗口标题栏中按下鼠标右键
Private Const WM_NCRBUTTONUP = &HA5 '窗口标题栏中松开鼠标右键
后台鼠标移动和点击(vb6):
   X = 100'要选择点击的合约所在横坐标(行情栏客户区坐标)
    Y = 90'要选择点击的合约所在纵坐标(行情栏客户区坐标)
hwnd = 132924'行情软件行情栏窗口句柄
xy = Y * &H10000 + X'计算lParam值
PostMessage hwnd, WM_MOUSEMOVE, 0, ByVal xy'后台移动鼠标
Sleep 100
PostMessage hwnd, WM_LBUTTONDOWN, 1, ByVal xy'后台按下鼠标左键
Sleep 100
PostMessage hwnd, WM_LBUTTONUP, 0, ByVal xy'后台抬起鼠标左键
后台鼠标移动和点击(vb.net)将 ByVal去掉就可以了:
Dim i As Long
  i = PostMessage(132924, WM_MOUSEMOVE, 0,  (X And &HFFFF) + (Y And &HFFFF) * &H10000)

    i = PostMessage(132924, WM_LBUTTONDOWN, 1,  (X And &HFFFF) + (Y And &HFFFF) * &H10000)
    Sleep (100)
    i = PostMessage(132924, WM_LBUTTONUP, 0, (X And &HFFFF) + (Y And &HFFFF) * &H10000)
   
'
彗星小助手是一个比较好用的工具软件,可以显示窗口的句柄结构,挺方便的,当然也有其他功能。用这个工具甚至可以将金仕达隐藏的很多功能调出来,不过既然搞编程,自己做的肯定会比交易软件带的功能要强大完善的多。
vs带的spy++可以帮助查看消息,我用的是vs2010。
我们用彗星小助手获取易盛模拟软件的句柄结构,通过遍历句柄函数 EnumChildWindows委托挂单窗口的句柄为XXXXXXX:
MySoftHand=FindWindow ( vbNullString,"模拟交易软件的标题")‘获取交易软件句柄
Call EnumChildWindows(MySoftHand,AddressOf EnumWindowProc, &H0)'遍历句柄
'遍历窗口句柄并存储在动态数组中
    Public Function EnumWindowProc(ByVal hWnd As Long, ByVal lParam As Long) As Long
        If BianLiJuBing = 1 Then
            BianLiJuBing = 0
            g_nWndCount = 0
            ReDim MysTitle(g_nWndCount) ' MsgBox("标题" & sTitle)
            ReDim MysClass(g_nWndCount) ' MsgBox("类名" & sClass)
            ReDim Myshwnd(g_nWndCount) 'MsgBox("hWnd" & hWnd)
        Else
            ReDim Preserve MysTitle(g_nWndCount) ' MsgBox("标题" & sTitle)
            ReDim Preserve MysClass(g_nWndCount) ' MsgBox("类名" & sClass)
            ReDim Preserve Myshwnd(g_nWndCount) 'MsgBox("hWnd" & hWnd)
        End If
        MysTitle(g_nWndCount) = Space$(MAX_PATH)
        MysClass(g_nWndCount) = Space$(MAX_PATH)
        Call GetClassName(hWnd, MysClass(g_nWndCount), MAX_PATH)
        Call GetWindowText(hWnd, MysTitle(g_nWndCount), MAX_PATH)
        MysTitle(g_nWndCount) = Strings.Left(RTrim(LTrim(MysTitle(g_nWndCount))), Len(LTrim(RTrim(MysTitle(g_nWndCount)))) - 1)
        'MsgBox(MysTitle(g_nWndCount))
        ' If Strings.Left(RTrim(LTrim(MysTitle(g_nWndCount))), 4) = "成交查询" Then '使用RTrim和LTrim分别将字符串左右的空格去掉,但是字符结束的结束标志符是无法去除的
        'MsgBox("发现 成交查询 ")
        'End If
        ' MsgBox(RTrim(LTrim(MysTitle(g_nWndCount))))
        'MsgBox("长度为" & Len(LTrim(RTrim(MysTitle(g_nWndCount)))))
        'TextBox2.Text = "‘" & RTrim(LTrim(MysTitle(g_nWndCount))) & "‘" & "*"
        'TextBox2.Text = "‘" & Strings.Left(RTrim(LTrim(MysTitle(g_nWndCount))), Len(LTrim(RTrim(MysTitle(g_nWndCount))))) & "'"
        Myshwnd(g_nWndCount) = hWnd
        g_nWndCount = g_nWndCount + 1
        EnumWindowProc = 1
    End Function
下面就可以 获取委托挂单子窗口 的句柄:
委托挂单子窗口 的句柄=(FindWindowEx(XXXXXXX, 0, "TdxTreeList", vbNullString))‘委托挂单子窗口 的类名是 "TdxTreeList", 类名可以用彗星小助手或 Spy++得到
有了句柄就可以操作了,比如用鼠标后台点击等
***
截图和文字识别的前部分代码是完全相同的,不同之处在于取到颜色数组后进行点阵识别,这和图形处理一个道理,比如图形二值化处理。如果会二值化处理,就肯定会文字处理。
因为获取显存数据的API函数微软已经提供好了,所以微软 考虑到数据读取写入冲突的问题,已经在函数内部做了很好的处理,无需担心,这和读取内存不同 ,尽管读取内存发生错误的可能性较低,但是仍有可能发生不可预料的后果。
不过我觉得vc的学习效率开发效率比较低,不如vb来得快,现成代码远远要多很多,就学习而言,vb要方便快捷。
学vb.net我觉得还不如直接学完c++后直接学vc,vb6不需要你搞清楚了解太多机制,vb.net则需要了解很多机制,而又没课本讲得清楚,老实说有学vb.net的功夫,早把vc搞得很清楚了,再转到vb.net直接就过来了,因为vc必须学机制,所以不建议搞vb.net,要学就学vb6,然后学C++再学vc,这时vb.net不用学,自然就会。我认为这样的顺序比较好。要是为了写期货软件,vb6足够用了。

[ 本帖最后由 wjlhc 于 2012-6-23 01:57 编辑 ]
参与人数 1奖励 +5 时间 理由
杨太极 + 5 2012-6-23 18:37 感谢分享,收藏并加分支持!

查看全部评分

金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

 楼主| 发表于 2012-6-23 02:05 | 显示全部楼层
常用的一些 api函数声明(for vb.net)
Public Declare Function GetPixel Lib "gdi32" (ByVal hdc As Integer, ByVal X As Integer, ByVal Y As Integer) As Integer
    Public Declare Function ReleaseDC Lib "user32" Alias "ReleaseDC" (ByVal hwnd As Integer, ByVal hdc As Integer) As Integer

    Public Declare Function GetDC Lib "user32" (ByVal hwnd As IntPtr) As Integer
    '查找与指定文件关联在一起的程序的文件名(用来启动exe文件)
    Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As IntPtr, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Integer) As Integer

    '设置鼠标的位置
    Public Declare Function SetCursorPos Lib "user32" (ByVal X As Integer, ByVal Y As Integer) As Integer

    Public Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As Integer)
    Public Const MOUSEEVENTF_ABSOLUTE = &H8000 'dx和dy指定鼠标坐标系统中的一个绝对位置。在鼠标坐标系统中,屏幕在水平和垂直方向上均匀分割成65535×65535个单元
    Public Const MOUSEEVENTF_MOVE = &H1 '移动鼠标
    Public Const MOUSEEVENTF_LEFTDOWN = &H2 '模拟鼠标左键按下
    Public Const MOUSEEVENTF_LEFTUP = &H4 '模拟鼠标左键抬起
    Public Const MOUSEEVENTF_RIGHTDOWN = &H8 '模拟鼠标右键按下
    Public Const MOUSEEVENTF_RIGHTUP = &H10 '模拟鼠标右键按下
    Public Const MOUSEEVENTF_MIDDLEDOWN = &H20 '模拟鼠标中键按下
    Public Const MOUSEEVENTF_MIDDLEUP = &H40 '模拟鼠标中键按下
    Public Const MOUSEEVENTF_WHEEL = &H800 '滑动:


    'dx 根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定水平方向的绝对位置或相对运动
    'dy 根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定垂直方向的绝对位置或相对运动
    'cButtons未使用
    'dwExtraInfo 通常未用的一个值。用GetMessageExtraInfo函数可取得这个值。可用的值取决于特定的驱动程序
    '使窗口显示的函数ShowWindow
    Public Declare Function ShowWindow Lib "user32" Alias "ShowWindow" (ByVal hWnd As IntPtr, ByVal nCmdShow As Int32) As Boolean
    ' 以下是nCmdShow的常数
    Public Const SW_HIDE = 1 '隐藏窗口,活动状态给令一个窗口
    Public Const SW_MINIMIZE = 2 ' 最小化窗口,活动状态给令一个窗口
    Public Const SW_RESTORE = 3 '用原来的大小和位置显示一个窗口,同时令其进入活动状态
    Public Const SW_SHOW = 4 '用当前的大小和位置显示一个窗口,同时令其进入活动状态
    Public Const SW_SHOWMAXIMIZED = 5 '最大化窗口,并将其激活
    Public Const SW_SHOWMINIMIZED = 6 '最小化窗口,并将其激活
    Public Const SW_SHOWMINNOACTIVE = 7 '最小化一个窗口,同时不改变活动窗口
    Public Const SW_SHOWNA = 8 '用当前的大小和位置显示一个窗口,不改变活动窗口
    Public Const SW_SHOWNOACTIVATE = 9 ' 用最近的大小和位置显示一个窗口,同时不改变活动窗口
    Public Const SW_SHOWNORMAL = 10 '与SW_RESTORE相同

    '下面是遍历所有举兵的函数EnumChildWindows 和EnumChildProc
    Public Delegate Function EnumChildProc(ByVal hWnd As IntPtr, ByVal lParam As Integer) As Boolean
    Public Declare Unicode Function EnumChildWindows Lib "user32.dll" (ByVal hWndParent As IntPtr, ByVal lpEnumFunc As EnumChildProc, ByVal lParam As Integer) As Boolean
    '获取类名的函数GetClassName
    Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Integer, ByVal lpclassname As String, ByVal nMaxCount As Integer) As Integer
    Public Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Integer, ByVal lpString As String) As Integer
    Declare Function RedrawWindow Lib "user32 " (ByVal hwnd As Integer, ByVal lprcUpdate As Integer, ByVal hrgnUpdate As Integer, ByVal fuRedraw As Integer) As Integer
    Public Const NULLAPI = 0&
    Public Const RDW_INVALIDATE = &H1
    Public Const RDW_ERASE = &H4
    '根据窗体名称获取句柄的api函数声明,其形式如:hwnd = FindWindow(vbNullString, "QQ用户登录")** 如果我们事先知道该控件的类名或是标题,可以使用 API 函数 FindWindow 来得到该控件的句柄,一般我们只会用到其中一个参数,那么另外一个参数写为空字符串 vbNullString 就可以了。
    Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Integer, ByVal hWndInsertAfter As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
    '常量
    Public Const MF_BYPOSITION = &H400&
    Public Const HWND_TOPMOST = -1
    Public Const HWND_NOTOPMOST = -2
    Public Const SWP_NOMOVE = &H2
    Public Const SWP_NOSIZE = &H1
    Public Const SWP_HIDEWINDOW = &H80
    Public Const SWP_SHOWWINDOW = &H40
    Public Const Flag = SWP_NOMOVE Or SWP_NOSIZE  '不移动和改变窗口大小
    Public Const WS_EX_LAYERED = &H80000
    Public Const GWL_EXSTYLE = (-20)
    Public Const LWA_ALPHA = &H2
    Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
    '控件的父控件的句柄
    Public Declare Function GetParent Lib "user32" (ByVal hwnd As Integer) As Long
    Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Integer) As Long
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
    Public Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Integer, ByVal wMapType As Integer) As Long '
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Long
    Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
    Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    Public Const MAX_PATH = 260
    Public Const VK_C = &H43
    Public Const WM_F1 = 112
    Public Const WM_F2 = 113
    Public Const WM_F3 = 114
    Public Const WM_F4 = 115 '&H73
    Public Const WM_F = 70
    Public Const WM_C = 67
    Public Const WM_P = 80
    Public Const WM_Q = 81
    Public Const WM_X = 88
    Public Const WM_KEYDOWN = &H100
    Public Const WM_KEYUP = &H101
    Public Const WM_CHAR = &H102
    Public Const WM_SYSKEYDOWN = &H104
    Public Const WM_SYSKEYUP = &H105
    Public Const VK_Q = 81
    Public Const VK_ALT = 18
    Public Const WM_SETFOCUS = &H7
    Public Const KEYEVENTF_EXTENDEDKEY = &H1
    Public Const KEYEVENTF_KEYUP = &H2
    Public Const WM_LBUTTONDOWN = &H201 '窗口中按下鼠标左键
    Public Const WM_LBUTTONUP = &H202 '窗口中松开鼠标左键
    Public Const WM_MOUSEMOVE = &H200 '窗口中移动鼠标
    Public Const WM_RBUTTONDOWN = &H204 '窗口中按下鼠标右键
    Public Const WM_RBUTTONUP = &H205 '窗口中松开鼠标右键
    Public Const WM_MOUSEWHEEL = &H20A '鼠标滚轮
    Public Const WM_NCLBUTTONDOWN = &HA1 '窗口标题栏中按下鼠标左键
    Public Const WM_NCLBUTTONUP = &HA2 '窗口标题栏中左开鼠标左键
    Public Const WM_NCMOUSEMOVE = &HA0  '窗口标题栏中移动鼠标
    Public Const WM_NCRBUTTONDOWN = &HA4 '窗口标题栏中按下鼠标右键
    Public Const WM_NCRBUTTONUP = &HA5 '窗口标题栏中松开鼠标右键
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Integer)
    Public Declare Function NumberOcr Lib "d:\NumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer) As Double '"c:\NumberOcr.dll"
    Public Declare Function NumberYellowOcr Lib "d:\NumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer) As Double '"d:\NumberOcr.dll"
    Public Declare Function HangQingJiaGeOcr Lib "d:\NumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer) As Double 'e:\NumberOcr.dll
    Public Declare Sub HangQingHeYueOcr Lib "d:\NumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer, ByVal a As String) 'c"c:\NumberOcr.dll"
    Public Declare Sub GetString2 Lib "d:\MyShiYan\StrSamp\Debug\StrSamp.dll" (ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer, ByVal a As String)  'Alias "_GetString@5" "E:\MyShiYan\StrSamp\Debug\StrSamp.dll"
    Public Declare Function YiShengNumberOcr Lib "I:\临时炒单\YiShengNumberOcr\Debug\YiShengNumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer) As Double
    Public Declare Function YiShengNumberOcrA Lib "I:\临时炒单\YiShengNumberOcr\Debug\YiShengNumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer) As Double '"d:\NumberOcr.dll"
    Public Declare Function YiShengJiaGeOcr Lib "I:\临时炒单\YiShengNumberOcr\Debug\YiShengNumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer) As Double
    Public Declare Function YiShengHeYueOcr Lib "I:\临时炒单\YiShengNumberOcr\Debug\YiShengNumberOcr.dll" (ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer, ByVal a As String, ByVal charactersNum As Integer, ByVal ab As String, ByVal charactersNumB As Integer) As Integer
    Public Declare Function YiShengStrOcr Lib "I:\临时炒单\YiShengNumberOcr\Debug\YiShengNumberOcr.dll" (ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer, ByVal a As String, ByVal charactersNum As Integer) As Integer

    'Public Declare Function GetString2 Lib "c:\NumberOcr.dll" (ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer, ByVal a As String)
    Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As IntPtr) As Integer
    'Public Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynA" (ByVal lpString1 As String, ByVal lpString2 As Integer, ByVal iMaxLength As Integer) As Integer
    Public Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynA" (ByVal lpString1 As String, ByVal lpString2 As Integer, ByVal iMaxLength As Integer) As Integer
    Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Integer, ByVal yPoint As Integer) As Integer
    Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As Integer) As Integer

    Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
    Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Long
    '声明行情软件各指标的变量及坐标变量
    Public PB1dif(10, 2), PB6dea(10, 2) As Double '设置行情软件瀑布线PB1、PB6和macd的def、dea变量
    Public PB1dif_X1(10, 2), PB1dif_Y1(10, 2), PB1dif_X2(10, 2), PB1dif_Y2(10, 2), PB6dea_X1(10, 2), PB6dea_Y1(10, 2), PB6dea_X2(10, 2), PB6dea_Y2(10, 2) As Long '设置行情软件瀑布线PB1、PB6和macd的def、dea变量读取的坐标值
    Public HangQingHeYue(5) As String
    Public HangQingMaiJia1(5), HangQingMaiJia2(5) As Double '设置行情软件价格、卖价、买价变量
    Public HangQingHeYue_X1(5), HangQingHeYue_Y1(5), HangQingHeYue_X2(5), HangQingHeYue_Y2(5) As Long '设置行情软件价格坐标
    Public HangQingMaiJia1_X1(5), HangQingMaiJia1_Y1(5), HangQingMaiJia1_X2(5), HangQingMaiJia1_Y2(5) As Long '设置行情软件卖价坐标
    Public HangQingMaiJia2_X1(5), HangQingMaiJia2_Y1(5), HangQingMaiJia2_X2(5), HangQingMaiJia2_Y2(5) As Long '设置行情软件买价坐标
    '声明交易软件各指标的变量及坐标变量
    Public ZiXuanHeYue(5) As String '定义“自选合约”
    Public ZiXuanHeYue_X1(5), ZiXuanHeYue_Y1(5), ZiXuanHeYue_X2(5), ZiXuanHeYue_Y2(5) As Long '定义“自选合约”的4个坐标、
    Public BiaoQianMing(5) As String '定义“标签名”,6个标签分别为“上海”“大连”“中金”“郑州”“自选1”“自选2”
    Public BiaoQianMing_X1(5), BiaoQianMing_Y1(5), BiaoQianMing_X2(5), BiaoQianMing_Y2(5) As Long '定义“标签名”的4个坐标、
    Public ZiJinXiangMu(7) As String '定义“资金项目”,7个项目分别为“今日初始资金”“总权益”“可用资金”“持仓盈亏”“手续费”“今日盈亏”“今日盈亏比例”
    Public ZiJinXiangMu_X1(7), ZiJinXiangMu_Y1(7), ZiJinXiangMu_X2(7), ZiJinXiangMu_Y2(7) As Long '定义“资金项目”的4个坐标、
    Public DangQianHeYue As String '定义“当前合约”
    Public DangQianHeYue_X1, DangQianHeYue_Y1, DangQianHeYue_X2, DangQianHeYue_Y2 As Long '定义“当前合约”的4个坐标
    Public BiaoQianHeYue(2) As String '定义“标签合约”
    Public BiaoQianHeYue_X1(2), BiaoQianHeYue_Y1(2), BiaoQianHeYue_X2(2), BiaoQianHeYue_Y2(2) As Long '定义“标签合约”的4个坐标、
    Public KaiPingAnNiu(3) As String '定义“开平按钮”,共4个“开多”“平多”“开空”“平空”
    Public KaiPingAnNiu_X1(3), KaiPingAnNiu_Y1(3), KaiPingAnNiu_X2(3), KaiPingAnNiu_Y2(3) As Long '定义“开平按钮”的4个坐标、
    Public ChiCangLan(11, 7) As String '定义“持仓栏”
    Public ChiCangLan_X1(11, 7), ChiCangLan_Y1(11, 7), ChiCangLan_X2(11, 7), ChiCangLan_Y2(11, 7) As Long '定义“持仓栏”的4个坐标、
    Public WeiTuoLan(9, 5) As String '定义“委托栏”
    Public WeiTuoLan_X1(9, 5), WeiTuoLan_Y1(9, 5), WeiTuoLan_X2(9, 5), WeiTuoLan_Y2(9, 5) As Long '定义“委托栏”的4个坐标、
    Public ChiCangLanAnNiu(2) As String '定义“持仓栏按钮”,共3个“平仓”“清仓”“反手”
    Public ChiCangLanAnNiu_X1(2), ChiCangLanAnNiu_Y1(2), ChiCangLanAnNiu_X2(2), ChiCangLanAnNiu_Y2(2) As Long '定义“持仓栏按钮”的4个坐标
    Public WeiTuoLanAnNiu(1) As String '定义“持仓栏按钮”,共3个“平仓”“清仓”“反手”
    Public WeiTuoLanAnNiu_X1(1), WeiTuoLanAnNiu_Y1(1), WeiTuoLanAnNiu_X2(1), WeiTuoLanAnNiu_Y2(1) As Long '定义“持仓栏按钮”的4个坐标
    Public ChengJiaoLan(7, 15) As String '定义“成交栏”
    Public ChengJiaoLan_X1(7, 15), ChengJiaoLan_Y1(7, 15), ChengJiaoLan_X2(7, 15), ChengJiaoLan_Y2(7, 15) As Long '定义“成交栏”的4个坐标、
    Public EMA_MACD(10, 2), QuShiTiaoJianXuHao, CeLueTiaoJianXuHao, JiaGeTiaoJianXuHao, JianJieTiaoJianXuHao, ShiJianTiaoJianXuHao, HaoCha(), QuShiTiaoJianXuHao2, CeLueTiaoJianXuHao2, JiaGeTiaoJianXuHao2, JianJieTiaoJianXuHao2, ShiJianTiaoJianXuHao2 As Integer '    趋势条件序号、策略条件序号、价格条件序号、简捷条件序号、时间条件序号、流号序号差
    Public My1MACD(,), My1EMA(,), ChuFa1(,), KongChuFa(,) As Integer
    Public ZhiXing1, ZhiXing2, ShouShu(), LiuHao, HangHao1, HangHao2, HangHao3 As Integer '执行标识、策略、手数、执行状态标识、流号、行号
    Public hqhwnd, jyhwnd, cjhwnd, byhwnd, yishenghwnd, jinshidahwnd, Myhwnd(0 To 8) As Long '行情句柄、交易句柄、成交栏句柄
    Public JiaGe() As Double
    Public ZhiLingLeiBie(), HeYue(), FangXiang(), TiaoJian1(), ZhiBiao1(,), ZhiXingZhuangTai(), XiaDan_Time(), ZhouQi(), ZhiBiaoZhuangTai(), JianJieZhiBiaoZhuangTai(), JianJieZhiBiao1(), JianJieZhouQi() As String '指令类别、合约、方向、条件1、指标、状态标识
    Public MaiRuMaiChu(), DaYuXiaoYu(), ShiJianTiaoJianDan_time() As String '买入卖出、大于小于
    Public Function GetIni(ByVal SectionName As String, ByVal KeyWord As String, ByVal DefString As String, ByVal FileName As String) As String
        Dim ResultString As String = Nothing
        ResultString = LSet(ResultString, 256)
        If GetPrivateProfileString(SectionName, KeyWord, vbNullString, ResultString, Len(ResultString), FileName) > 0 Then
            GetIni = Left(ResultString, InStr(ResultString, Chr(0)) - 1)
        Else
            WritePrivateProfileString(SectionName, KeyWord, DefString, FileName)
            GetIni = DefString
        End If
    End Function

    Public Function GetINI2(ByVal Section As String, ByVal AppName As String, ByVal lpDefault As String, ByVal FileName As String) As String
        Dim Str As String = Nothing
        Str = LSet(Str, 256)
        GetPrivateProfileString(Section, AppName, lpDefault, Str, Len(Str), FileName)
        Return Microsoft.VisualBasic.Left(Str, InStr(Str, Chr(0)) - 1)
    End Function
    Public Function GetINIW(ByVal Section As String, ByVal AppName As String, ByVal lpDefault As String, ByVal FileName As String) As String
        Dim MyEncoder As System.Text.Encoding = System.Text.Encoding.Default
        Dim strResult As String
        Dim chars(2048) As Char
        strResult = CStr(chars)
        GetPrivateProfileString(Section, AppName, lpDefault, strResult, Len(strResult), FileName)
        Dim rByte() As Byte = System.Text.Encoding.Default.GetBytes(strResult.ToCharArray)
        strResult = New String(MyEncoder.GetChars(rByte))
        Return Microsoft.VisualBasic.Left(strResult, InStr(strResult, Chr(0)) - 1)
    End Function
    Public Sub MySleep(ByVal n As Long)  '延时函数,不会假死
        Dim sTime As Long
        'MsgBox(n)
        sTime = 1
        While sTime <= n
            sTime = sTime + 1
            System.Windows.Forms.Application.DoEvents()
            ' DoEvents()
            Sleep(10)
        End While
    End Sub
    Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long
        '参数VirtualKey表示按键虚拟码,flag表示是按下键还是释放键,用WM_KEYDOWN和WM_KEYUP这两个常数表示
        Dim s As String
        Dim Firstbyte As String         'lparam参数的24-31位
        If flag = WM_SYSKEYDOWN Then   '如果是按下键
            Firstbyte = "00 "
        Else
            Firstbyte = "C0 "               '如果是释放键
        End If
        Dim Scancode As Long
        '获得键的扫描码
        Scancode = MapVirtualKey(VirtualKey, 0)
        Dim Secondbyte As String       'lparam参数的16-23位,即虚拟键扫描码
        Secondbyte = Right("00 " & Hex(Scancode), 2)
        MsgBox("!" & Secondbyte)
        s = Firstbyte & Secondbyte & "0001 "     '0001为lparam参数的0-15位,即发送次数和其它扩展信息
        MakeKeyLparam = Val("&H " & s)
    End Function
    '封装成函数,这里用来启动调用exe文件
    Public Sub ShellEx(ByVal Path As String)
        Dim splitpos As Long
        splitpos = InStrRev(Path, "\")

        ShellExecute(0, "open", Path, "", Mid(Path, 1, splitpos - 1), 1)
    End Sub
End Module
参与人数 1奖励 +5 时间 理由
杨太极 + 5 2012-6-23 18:38 MACD有楼主更精彩!

查看全部评分

金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

 楼主| 发表于 2012-6-23 02:05 | 显示全部楼层
Public Declare Function GetPixel Lib "gdi32" (ByVal hdc As Integer, ByVal X As Integer, ByVal Y As Integer) As Integer
    Public Declare Function ReleaseDC Lib "user32" Alias "ReleaseDC" (ByVal hwnd As Integer, ByVal hdc As Integer) As Integer

    Public Declare Function GetDC Lib "user32" (ByVal hwnd As IntPtr) As Integer
    '查找与指定文件关联在一起的程序的文件名(用来启动exe文件)
    Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As IntPtr, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Integer) As Integer

    '设置鼠标的位置
    Public Declare Function SetCursorPos Lib "user32" (ByVal X As Integer, ByVal Y As Integer) As Integer

    Public Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As Integer)
    Public Const MOUSEEVENTF_ABSOLUTE = &H8000 'dx和dy指定鼠标坐标系统中的一个绝对位置。在鼠标坐标系统中,屏幕在水平和垂直方向上均匀分割成65535×65535个单元
    Public Const MOUSEEVENTF_MOVE = &H1 '移动鼠标
    Public Const MOUSEEVENTF_LEFTDOWN = &H2 '模拟鼠标左键按下
    Public Const MOUSEEVENTF_LEFTUP = &H4 '模拟鼠标左键抬起
    Public Const MOUSEEVENTF_RIGHTDOWN = &H8 '模拟鼠标右键按下
    Public Const MOUSEEVENTF_RIGHTUP = &H10 '模拟鼠标右键按下
    Public Const MOUSEEVENTF_MIDDLEDOWN = &H20 '模拟鼠标中键按下
    Public Const MOUSEEVENTF_MIDDLEUP = &H40 '模拟鼠标中键按下
    Public Const MOUSEEVENTF_WHEEL = &H800 '滑动:


    'dx 根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定水平方向的绝对位置或相对运动
    'dy 根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定垂直方向的绝对位置或相对运动
    'cButtons未使用
    'dwExtraInfo 通常未用的一个值。用GetMessageExtraInfo函数可取得这个值。可用的值取决于特定的驱动程序
    '使窗口显示的函数ShowWindow
    Public Declare Function ShowWindow Lib "user32" Alias "ShowWindow" (ByVal hWnd As IntPtr, ByVal nCmdShow As Int32) As Boolean
    ' 以下是nCmdShow的常数
    Public Const SW_HIDE = 1 '隐藏窗口,活动状态给令一个窗口
    Public Const SW_MINIMIZE = 2 ' 最小化窗口,活动状态给令一个窗口
    Public Const SW_RESTORE = 3 '用原来的大小和位置显示一个窗口,同时令其进入活动状态
    Public Const SW_SHOW = 4 '用当前的大小和位置显示一个窗口,同时令其进入活动状态
    Public Const SW_SHOWMAXIMIZED = 5 '最大化窗口,并将其激活
    Public Const SW_SHOWMINIMIZED = 6 '最小化窗口,并将其激活
    Public Const SW_SHOWMINNOACTIVE = 7 '最小化一个窗口,同时不改变活动窗口
    Public Const SW_SHOWNA = 8 '用当前的大小和位置显示一个窗口,不改变活动窗口
    Public Const SW_SHOWNOACTIVATE = 9 ' 用最近的大小和位置显示一个窗口,同时不改变活动窗口
    Public Const SW_SHOWNORMAL = 10 '与SW_RESTORE相同

    '下面是遍历所有举兵的函数EnumChildWindows 和EnumChildProc
    Public Delegate Function EnumChildProc(ByVal hWnd As IntPtr, ByVal lParam As Integer) As Boolean
    Public Declare Unicode Function EnumChildWindows Lib "user32.dll" (ByVal hWndParent As IntPtr, ByVal lpEnumFunc As EnumChildProc, ByVal lParam As Integer) As Boolean
    '获取类名的函数GetClassName
    Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Integer, ByVal lpclassname As String, ByVal nMaxCount As Integer) As Integer
    Public Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Integer, ByVal lpString As String) As Integer
    Declare Function RedrawWindow Lib "user32 " (ByVal hwnd As Integer, ByVal lprcUpdate As Integer, ByVal hrgnUpdate As Integer, ByVal fuRedraw As Integer) As Integer
    Public Const NULLAPI = 0&
    Public Const RDW_INVALIDATE = &H1
    Public Const RDW_ERASE = &H4
    '根据窗体名称获取句柄的api函数声明,其形式如:hwnd = FindWindow(vbNullString, "QQ用户登录")** 如果我们事先知道该控件的类名或是标题,可以使用 API 函数 FindWindow 来得到该控件的句柄,一般我们只会用到其中一个参数,那么另外一个参数写为空字符串 vbNullString 就可以了。
    Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Integer, ByVal hWndInsertAfter As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
    '常量
    Public Const MF_BYPOSITION = &H400&
    Public Const HWND_TOPMOST = -1
    Public Const HWND_NOTOPMOST = -2
    Public Const SWP_NOMOVE = &H2
    Public Const SWP_NOSIZE = &H1
    Public Const SWP_HIDEWINDOW = &H80
    Public Const SWP_SHOWWINDOW = &H40
    Public Const Flag = SWP_NOMOVE Or SWP_NOSIZE  '不移动和改变窗口大小
    Public Const WS_EX_LAYERED = &H80000
    Public Const GWL_EXSTYLE = (-20)
    Public Const LWA_ALPHA = &H2
    Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
    '控件的父控件的句柄
    Public Declare Function GetParent Lib "user32" (ByVal hwnd As Integer) As Long
    Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Integer) As Long
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
    Public Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Integer, ByVal wMapType As Integer) As Long '
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Long
    Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
    Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    Public Const MAX_PATH = 260
    Public Const VK_C = &H43
    Public Const WM_F1 = 112
    Public Const WM_F2 = 113
    Public Const WM_F3 = 114
    Public Const WM_F4 = 115 '&H73
    Public Const WM_F = 70
    Public Const WM_C = 67
    Public Const WM_P = 80
    Public Const WM_Q = 81
    Public Const WM_X = 88
    Public Const WM_KEYDOWN = &H100
    Public Const WM_KEYUP = &H101
    Public Const WM_CHAR = &H102
    Public Const WM_SYSKEYDOWN = &H104
    Public Const WM_SYSKEYUP = &H105
    Public Const VK_Q = 81
    Public Const VK_ALT = 18
    Public Const WM_SETFOCUS = &H7
    Public Const KEYEVENTF_EXTENDEDKEY = &H1
    Public Const KEYEVENTF_KEYUP = &H2
    Public Const WM_LBUTTONDOWN = &H201 '窗口中按下鼠标左键
    Public Const WM_LBUTTONUP = &H202 '窗口中松开鼠标左键
    Public Const WM_MOUSEMOVE = &H200 '窗口中移动鼠标
    Public Const WM_RBUTTONDOWN = &H204 '窗口中按下鼠标右键
    Public Const WM_RBUTTONUP = &H205 '窗口中松开鼠标右键
    Public Const WM_MOUSEWHEEL = &H20A '鼠标滚轮
    Public Const WM_NCLBUTTONDOWN = &HA1 '窗口标题栏中按下鼠标左键
    Public Const WM_NCLBUTTONUP = &HA2 '窗口标题栏中左开鼠标左键
    Public Const WM_NCMOUSEMOVE = &HA0  '窗口标题栏中移动鼠标
    Public Const WM_NCRBUTTONDOWN = &HA4 '窗口标题栏中按下鼠标右键
    Public Const WM_NCRBUTTONUP = &HA5 '窗口标题栏中松开鼠标右键
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Integer)
    Public Declare Function NumberOcr Lib "d:\NumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer) As Double '"c:\NumberOcr.dll"
    Public Declare Function NumberYellowOcr Lib "d:\NumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer) As Double '"d:\NumberOcr.dll"
    Public Declare Function HangQingJiaGeOcr Lib "d:\NumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer) As Double 'e:\NumberOcr.dll
    Public Declare Sub HangQingHeYueOcr Lib "d:\NumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer, ByVal a As String) 'c"c:\NumberOcr.dll"
    Public Declare Sub GetString2 Lib "d:\MyShiYan\StrSamp\Debug\StrSamp.dll" (ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer, ByVal a As String)  'Alias "_GetString@5" "E:\MyShiYan\StrSamp\Debug\StrSamp.dll"
    Public Declare Function YiShengNumberOcr Lib "I:\临时炒单\YiShengNumberOcr\Debug\YiShengNumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer) As Double
    Public Declare Function YiShengNumberOcrA Lib "I:\临时炒单\YiShengNumberOcr\Debug\YiShengNumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer) As Double '"d:\NumberOcr.dll"
    Public Declare Function YiShengJiaGeOcr Lib "I:\临时炒单\YiShengNumberOcr\Debug\YiShengNumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer) As Double
    Public Declare Function YiShengHeYueOcr Lib "I:\临时炒单\YiShengNumberOcr\Debug\YiShengNumberOcr.dll" (ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer, ByVal a As String, ByVal charactersNum As Integer, ByVal ab As String, ByVal charactersNumB As Integer) As Integer
    Public Declare Function YiShengStrOcr Lib "I:\临时炒单\YiShengNumberOcr\Debug\YiShengNumberOcr.dll" (ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer, ByVal a As String, ByVal charactersNum As Integer) As Integer

    'Public Declare Function GetString2 Lib "c:\NumberOcr.dll" (ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer, ByVal a As String)
    Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As IntPtr) As Integer
    'Public Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynA" (ByVal lpString1 As String, ByVal lpString2 As Integer, ByVal iMaxLength As Integer) As Integer
    Public Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynA" (ByVal lpString1 As String, ByVal lpString2 As Integer, ByVal iMaxLength As Integer) As Integer
    Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Integer, ByVal yPoint As Integer) As Integer
    Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As Integer) As Integer

    Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
    Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Long
    '声明行情软件各指标的变量及坐标变量
    Public PB1dif(10, 2), PB6dea(10, 2) As Double '设置行情软件瀑布线PB1、PB6和macd的def、dea变量
    Public PB1dif_X1(10, 2), PB1dif_Y1(10, 2), PB1dif_X2(10, 2), PB1dif_Y2(10, 2), PB6dea_X1(10, 2), PB6dea_Y1(10, 2), PB6dea_X2(10, 2), PB6dea_Y2(10, 2) As Long '设置行情软件瀑布线PB1、PB6和macd的def、dea变量读取的坐标值
    Public HangQingHeYue(5) As String
    Public HangQingMaiJia1(5), HangQingMaiJia2(5) As Double '设置行情软件价格、卖价、买价变量
    Public HangQingHeYue_X1(5), HangQingHeYue_Y1(5), HangQingHeYue_X2(5), HangQingHeYue_Y2(5) As Long '设置行情软件价格坐标
    Public HangQingMaiJia1_X1(5), HangQingMaiJia1_Y1(5), HangQingMaiJia1_X2(5), HangQingMaiJia1_Y2(5) As Long '设置行情软件卖价坐标
    Public HangQingMaiJia2_X1(5), HangQingMaiJia2_Y1(5), HangQingMaiJia2_X2(5), HangQingMaiJia2_Y2(5) As Long '设置行情软件买价坐标
    '声明交易软件各指标的变量及坐标变量
    Public ZiXuanHeYue(5) As String '定义“自选合约”
    Public ZiXuanHeYue_X1(5), ZiXuanHeYue_Y1(5), ZiXuanHeYue_X2(5), ZiXuanHeYue_Y2(5) As Long '定义“自选合约”的4个坐标、
    Public BiaoQianMing(5) As String '定义“标签名”,6个标签分别为“上海”“大连”“中金”“郑州”“自选1”“自选2”
    Public BiaoQianMing_X1(5), BiaoQianMing_Y1(5), BiaoQianMing_X2(5), BiaoQianMing_Y2(5) As Long '定义“标签名”的4个坐标、
    Public ZiJinXiangMu(7) As String '定义“资金项目”,7个项目分别为“今日初始资金”“总权益”“可用资金”“持仓盈亏”“手续费”“今日盈亏”“今日盈亏比例”
    Public ZiJinXiangMu_X1(7), ZiJinXiangMu_Y1(7), ZiJinXiangMu_X2(7), ZiJinXiangMu_Y2(7) As Long '定义“资金项目”的4个坐标、
    Public DangQianHeYue As String '定义“当前合约”
    Public DangQianHeYue_X1, DangQianHeYue_Y1, DangQianHeYue_X2, DangQianHeYue_Y2 As Long '定义“当前合约”的4个坐标
    Public BiaoQianHeYue(2) As String '定义“标签合约”
    Public BiaoQianHeYue_X1(2), BiaoQianHeYue_Y1(2), BiaoQianHeYue_X2(2), BiaoQianHeYue_Y2(2) As Long '定义“标签合约”的4个坐标、
    Public KaiPingAnNiu(3) As String '定义“开平按钮”,共4个“开多”“平多”“开空”“平空”
    Public KaiPingAnNiu_X1(3), KaiPingAnNiu_Y1(3), KaiPingAnNiu_X2(3), KaiPingAnNiu_Y2(3) As Long '定义“开平按钮”的4个坐标、
    Public ChiCangLan(11, 7) As String '定义“持仓栏”
    Public ChiCangLan_X1(11, 7), ChiCangLan_Y1(11, 7), ChiCangLan_X2(11, 7), ChiCangLan_Y2(11, 7) As Long '定义“持仓栏”的4个坐标、
    Public WeiTuoLan(9, 5) As String '定义“委托栏”
    Public WeiTuoLan_X1(9, 5), WeiTuoLan_Y1(9, 5), WeiTuoLan_X2(9, 5), WeiTuoLan_Y2(9, 5) As Long '定义“委托栏”的4个坐标、
    Public ChiCangLanAnNiu(2) As String '定义“持仓栏按钮”,共3个“平仓”“清仓”“反手”
    Public ChiCangLanAnNiu_X1(2), ChiCangLanAnNiu_Y1(2), ChiCangLanAnNiu_X2(2), ChiCangLanAnNiu_Y2(2) As Long '定义“持仓栏按钮”的4个坐标
    Public WeiTuoLanAnNiu(1) As String '定义“持仓栏按钮”,共3个“平仓”“清仓”“反手”
    Public WeiTuoLanAnNiu_X1(1), WeiTuoLanAnNiu_Y1(1), WeiTuoLanAnNiu_X2(1), WeiTuoLanAnNiu_Y2(1) As Long '定义“持仓栏按钮”的4个坐标
    Public ChengJiaoLan(7, 15) As String '定义“成交栏”
    Public ChengJiaoLan_X1(7, 15), ChengJiaoLan_Y1(7, 15), ChengJiaoLan_X2(7, 15), ChengJiaoLan_Y2(7, 15) As Long '定义“成交栏”的4个坐标、
    Public EMA_MACD(10, 2), QuShiTiaoJianXuHao, CeLueTiaoJianXuHao, JiaGeTiaoJianXuHao, JianJieTiaoJianXuHao, ShiJianTiaoJianXuHao, HaoCha(), QuShiTiaoJianXuHao2, CeLueTiaoJianXuHao2, JiaGeTiaoJianXuHao2, JianJieTiaoJianXuHao2, ShiJianTiaoJianXuHao2 As Integer '    趋势条件序号、策略条件序号、价格条件序号、简捷条件序号、时间条件序号、流号序号差
    Public My1MACD(,), My1EMA(,), ChuFa1(,), KongChuFa(,) As Integer
    Public ZhiXing1, ZhiXing2, ShouShu(), LiuHao, HangHao1, HangHao2, HangHao3 As Integer '执行标识、策略、手数、执行状态标识、流号、行号
    Public hqhwnd, jyhwnd, cjhwnd, byhwnd, yishenghwnd, jinshidahwnd, Myhwnd(0 To 8) As Long '行情句柄、交易句柄、成交栏句柄
    Public JiaGe() As Double
    Public ZhiLingLeiBie(), HeYue(), FangXiang(), TiaoJian1(), ZhiBiao1(,), ZhiXingZhuangTai(), XiaDan_Time(), ZhouQi(), ZhiBiaoZhuangTai(), JianJieZhiBiaoZhuangTai(), JianJieZhiBiao1(), JianJieZhouQi() As String '指令类别、合约、方向、条件1、指标、状态标识
    Public MaiRuMaiChu(), DaYuXiaoYu(), ShiJianTiaoJianDan_time() As String '买入卖出、大于小于
    Public Function GetIni(ByVal SectionName As String, ByVal KeyWord As String, ByVal DefString As String, ByVal FileName As String) As String
        Dim ResultString As String = Nothing
        ResultString = LSet(ResultString, 256)
        If GetPrivateProfileString(SectionName, KeyWord, vbNullString, ResultString, Len(ResultString), FileName) > 0 Then
            GetIni = Left(ResultString, InStr(ResultString, Chr(0)) - 1)
        Else
            WritePrivateProfileString(SectionName, KeyWord, DefString, FileName)
            GetIni = DefString
        End If
    End Function

    Public Function GetINI2(ByVal Section As String, ByVal AppName As String, ByVal lpDefault As String, ByVal FileName As String) As String
        Dim Str As String = Nothing
        Str = LSet(Str, 256)
        GetPrivateProfileString(Section, AppName, lpDefault, Str, Len(Str), FileName)
        Return Microsoft.VisualBasic.Left(Str, InStr(Str, Chr(0)) - 1)
    End Function
    Public Function GetINIW(ByVal Section As String, ByVal AppName As String, ByVal lpDefault As String, ByVal FileName As String) As String
        Dim MyEncoder As System.Text.Encoding = System.Text.Encoding.Default
        Dim strResult As String
        Dim chars(2048) As Char
        strResult = CStr(chars)
        GetPrivateProfileString(Section, AppName, lpDefault, strResult, Len(strResult), FileName)
        Dim rByte() As Byte = System.Text.Encoding.Default.GetBytes(strResult.ToCharArray)
        strResult = New String(MyEncoder.GetChars(rByte))
        Return Microsoft.VisualBasic.Left(strResult, InStr(strResult, Chr(0)) - 1)
    End Function
    Public Sub MySleep(ByVal n As Long)  '延时函数,不会假死
        Dim sTime As Long
        'MsgBox(n)
        sTime = 1
        While sTime <= n
            sTime = sTime + 1
            System.Windows.Forms.Application.DoEvents()
            ' DoEvents()
            Sleep(10)
        End While
    End Sub
    Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long
        '参数VirtualKey表示按键虚拟码,flag表示是按下键还是释放键,用WM_KEYDOWN和WM_KEYUP这两个常数表示
        Dim s As String
        Dim Firstbyte As String         'lparam参数的24-31位
        If flag = WM_SYSKEYDOWN Then   '如果是按下键
            Firstbyte = "00 "
        Else
            Firstbyte = "C0 "               '如果是释放键
        End If
        Dim Scancode As Long
        '获得键的扫描码
        Scancode = MapVirtualKey(VirtualKey, 0)
        Dim Secondbyte As String       'lparam参数的16-23位,即虚拟键扫描码
        Secondbyte = Right("00 " & Hex(Scancode), 2)
        MsgBox("!" & Secondbyte)
        s = Firstbyte & Secondbyte & "0001 "     '0001为lparam参数的0-15位,即发送次数和其它扩展信息
        MakeKeyLparam = Val("&H " & s)
    End Function
    '封装成函数,这里用来启动调用exe文件
    Public Sub ShellEx(ByVal Path As String)
        Dim splitpos As Long
        splitpos = InStrRev(Path, "\")

        ShellExecute(0, "open", Path, "", Mid(Path, 1, splitpos - 1), 1)
    End Sub
End Module
参与人数 1奖励 +5 时间 理由
杨太极 + 5 2012-6-23 18:39 MACD有楼主更精彩!

查看全部评分

金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

 楼主| 发表于 2012-6-23 02:06 | 显示全部楼层
Public Declare Function GetPixel Lib "gdi32" (ByVal hdc As Integer, ByVal X As Integer, ByVal Y As Integer) As Integer
    Public Declare Function ReleaseDC Lib "user32" Alias "ReleaseDC" (ByVal hwnd As Integer, ByVal hdc As Integer) As Integer

    Public Declare Function GetDC Lib "user32" (ByVal hwnd As IntPtr) As Integer
    '查找与指定文件关联在一起的程序的文件名(用来启动exe文件)
    Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As IntPtr, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Integer) As Integer

    '设置鼠标的位置
    Public Declare Function SetCursorPos Lib "user32" (ByVal X As Integer, ByVal Y As Integer) As Integer

    Public Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As Integer)
    Public Const MOUSEEVENTF_ABSOLUTE = &H8000 'dx和dy指定鼠标坐标系统中的一个绝对位置。在鼠标坐标系统中,屏幕在水平和垂直方向上均匀分割成65535×65535个单元
    Public Const MOUSEEVENTF_MOVE = &H1 '移动鼠标
    Public Const MOUSEEVENTF_LEFTDOWN = &H2 '模拟鼠标左键按下
    Public Const MOUSEEVENTF_LEFTUP = &H4 '模拟鼠标左键抬起
    Public Const MOUSEEVENTF_RIGHTDOWN = &H8 '模拟鼠标右键按下
    Public Const MOUSEEVENTF_RIGHTUP = &H10 '模拟鼠标右键按下
    Public Const MOUSEEVENTF_MIDDLEDOWN = &H20 '模拟鼠标中键按下
    Public Const MOUSEEVENTF_MIDDLEUP = &H40 '模拟鼠标中键按下
    Public Const MOUSEEVENTF_WHEEL = &H800 '滑动:


    'dx 根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定水平方向的绝对位置或相对运动
    'dy 根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定垂直方向的绝对位置或相对运动
    'cButtons未使用
    'dwExtraInfo 通常未用的一个值。用GetMessageExtraInfo函数可取得这个值。可用的值取决于特定的驱动程序
    '使窗口显示的函数ShowWindow
    Public Declare Function ShowWindow Lib "user32" Alias "ShowWindow" (ByVal hWnd As IntPtr, ByVal nCmdShow As Int32) As Boolean
    ' 以下是nCmdShow的常数
    Public Const SW_HIDE = 1 '隐藏窗口,活动状态给令一个窗口
    Public Const SW_MINIMIZE = 2 ' 最小化窗口,活动状态给令一个窗口
    Public Const SW_RESTORE = 3 '用原来的大小和位置显示一个窗口,同时令其进入活动状态
    Public Const SW_SHOW = 4 '用当前的大小和位置显示一个窗口,同时令其进入活动状态
    Public Const SW_SHOWMAXIMIZED = 5 '最大化窗口,并将其激活
    Public Const SW_SHOWMINIMIZED = 6 '最小化窗口,并将其激活
    Public Const SW_SHOWMINNOACTIVE = 7 '最小化一个窗口,同时不改变活动窗口
    Public Const SW_SHOWNA = 8 '用当前的大小和位置显示一个窗口,不改变活动窗口
    Public Const SW_SHOWNOACTIVATE = 9 ' 用最近的大小和位置显示一个窗口,同时不改变活动窗口
    Public Const SW_SHOWNORMAL = 10 '与SW_RESTORE相同

    '下面是遍历所有举兵的函数EnumChildWindows 和EnumChildProc
    Public Delegate Function EnumChildProc(ByVal hWnd As IntPtr, ByVal lParam As Integer) As Boolean
    Public Declare Unicode Function EnumChildWindows Lib "user32.dll" (ByVal hWndParent As IntPtr, ByVal lpEnumFunc As EnumChildProc, ByVal lParam As Integer) As Boolean
    '获取类名的函数GetClassName
    Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Integer, ByVal lpclassname As String, ByVal nMaxCount As Integer) As Integer
    Public Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Integer, ByVal lpString As String) As Integer
    Declare Function RedrawWindow Lib "user32 " (ByVal hwnd As Integer, ByVal lprcUpdate As Integer, ByVal hrgnUpdate As Integer, ByVal fuRedraw As Integer) As Integer
    Public Const NULLAPI = 0&
    Public Const RDW_INVALIDATE = &H1
    Public Const RDW_ERASE = &H4
    '根据窗体名称获取句柄的api函数声明,其形式如:hwnd = FindWindow(vbNullString, "QQ用户登录")** 如果我们事先知道该控件的类名或是标题,可以使用 API 函数 FindWindow 来得到该控件的句柄,一般我们只会用到其中一个参数,那么另外一个参数写为空字符串 vbNullString 就可以了。
    Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Integer, ByVal hWndInsertAfter As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
    '常量
    Public Const MF_BYPOSITION = &H400&
    Public Const HWND_TOPMOST = -1
    Public Const HWND_NOTOPMOST = -2
    Public Const SWP_NOMOVE = &H2
    Public Const SWP_NOSIZE = &H1
    Public Const SWP_HIDEWINDOW = &H80
    Public Const SWP_SHOWWINDOW = &H40
    Public Const Flag = SWP_NOMOVE Or SWP_NOSIZE  '不移动和改变窗口大小
    Public Const WS_EX_LAYERED = &H80000
    Public Const GWL_EXSTYLE = (-20)
    Public Const LWA_ALPHA = &H2
    Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
    '控件的父控件的句柄
    Public Declare Function GetParent Lib "user32" (ByVal hwnd As Integer) As Long
    Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Integer) As Long
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
    Public Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Integer, ByVal wMapType As Integer) As Long '
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Long
    Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
    Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    Public Const MAX_PATH = 260
    Public Const VK_C = &H43
    Public Const WM_F1 = 112
    Public Const WM_F2 = 113
    Public Const WM_F3 = 114
    Public Const WM_F4 = 115 '&H73
    Public Const WM_F = 70
    Public Const WM_C = 67
    Public Const WM_P = 80
    Public Const WM_Q = 81
    Public Const WM_X = 88
    Public Const WM_KEYDOWN = &H100
    Public Const WM_KEYUP = &H101
    Public Const WM_CHAR = &H102
    Public Const WM_SYSKEYDOWN = &H104
    Public Const WM_SYSKEYUP = &H105
    Public Const VK_Q = 81
    Public Const VK_ALT = 18
    Public Const WM_SETFOCUS = &H7
    Public Const KEYEVENTF_EXTENDEDKEY = &H1
    Public Const KEYEVENTF_KEYUP = &H2
    Public Const WM_LBUTTONDOWN = &H201 '窗口中按下鼠标左键
    Public Const WM_LBUTTONUP = &H202 '窗口中松开鼠标左键
    Public Const WM_MOUSEMOVE = &H200 '窗口中移动鼠标
    Public Const WM_RBUTTONDOWN = &H204 '窗口中按下鼠标右键
    Public Const WM_RBUTTONUP = &H205 '窗口中松开鼠标右键
    Public Const WM_MOUSEWHEEL = &H20A '鼠标滚轮
    Public Const WM_NCLBUTTONDOWN = &HA1 '窗口标题栏中按下鼠标左键
    Public Const WM_NCLBUTTONUP = &HA2 '窗口标题栏中左开鼠标左键
    Public Const WM_NCMOUSEMOVE = &HA0  '窗口标题栏中移动鼠标
    Public Const WM_NCRBUTTONDOWN = &HA4 '窗口标题栏中按下鼠标右键
    Public Const WM_NCRBUTTONUP = &HA5 '窗口标题栏中松开鼠标右键
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Integer)
    Public Declare Function NumberOcr Lib "d:\NumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer) As Double '"c:\NumberOcr.dll"
    Public Declare Function NumberYellowOcr Lib "d:\NumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer) As Double '"d:\NumberOcr.dll"
    Public Declare Function HangQingJiaGeOcr Lib "d:\NumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer) As Double 'e:\NumberOcr.dll
    Public Declare Sub HangQingHeYueOcr Lib "d:\NumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer, ByVal a As String) 'c"c:\NumberOcr.dll"
    Public Declare Sub GetString2 Lib "d:\MyShiYan\StrSamp\Debug\StrSamp.dll" (ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer, ByVal a As String)  'Alias "_GetString@5" "E:\MyShiYan\StrSamp\Debug\StrSamp.dll"
    Public Declare Function YiShengNumberOcr Lib "I:\临时炒单\YiShengNumberOcr\Debug\YiShengNumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer) As Double
    Public Declare Function YiShengNumberOcrA Lib "I:\临时炒单\YiShengNumberOcr\Debug\YiShengNumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer) As Double '"d:\NumberOcr.dll"
    Public Declare Function YiShengJiaGeOcr Lib "I:\临时炒单\YiShengNumberOcr\Debug\YiShengNumberOcr.dll" (ByVal CompareA As Integer, ByVal CompareB As Integer, ByVal CompareC As Integer, ByVal CompareD As Integer) As Double
    Public Declare Function YiShengHeYueOcr Lib "I:\临时炒单\YiShengNumberOcr\Debug\YiShengNumberOcr.dll" (ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer, ByVal a As String, ByVal charactersNum As Integer, ByVal ab As String, ByVal charactersNumB As Integer) As Integer
    Public Declare Function YiShengStrOcr Lib "I:\临时炒单\YiShengNumberOcr\Debug\YiShengNumberOcr.dll" (ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer, ByVal a As String, ByVal charactersNum As Integer) As Integer

    'Public Declare Function GetString2 Lib "c:\NumberOcr.dll" (ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer, ByVal a As String)
    Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As IntPtr) As Integer
    'Public Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynA" (ByVal lpString1 As String, ByVal lpString2 As Integer, ByVal iMaxLength As Integer) As Integer
    Public Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynA" (ByVal lpString1 As String, ByVal lpString2 As Integer, ByVal iMaxLength As Integer) As Integer
    Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Integer, ByVal yPoint As Integer) As Integer
    Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As Integer) As Integer

    Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
    Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Long
    '声明行情软件各指标的变量及坐标变量
    Public PB1dif(10, 2), PB6dea(10, 2) As Double '设置行情软件瀑布线PB1、PB6和macd的def、dea变量
    Public PB1dif_X1(10, 2), PB1dif_Y1(10, 2), PB1dif_X2(10, 2), PB1dif_Y2(10, 2), PB6dea_X1(10, 2), PB6dea_Y1(10, 2), PB6dea_X2(10, 2), PB6dea_Y2(10, 2) As Long '设置行情软件瀑布线PB1、PB6和macd的def、dea变量读取的坐标值
    Public HangQingHeYue(5) As String
    Public HangQingMaiJia1(5), HangQingMaiJia2(5) As Double '设置行情软件价格、卖价、买价变量
    Public HangQingHeYue_X1(5), HangQingHeYue_Y1(5), HangQingHeYue_X2(5), HangQingHeYue_Y2(5) As Long '设置行情软件价格坐标
    Public HangQingMaiJia1_X1(5), HangQingMaiJia1_Y1(5), HangQingMaiJia1_X2(5), HangQingMaiJia1_Y2(5) As Long '设置行情软件卖价坐标
    Public HangQingMaiJia2_X1(5), HangQingMaiJia2_Y1(5), HangQingMaiJia2_X2(5), HangQingMaiJia2_Y2(5) As Long '设置行情软件买价坐标
    '声明交易软件各指标的变量及坐标变量
    Public ZiXuanHeYue(5) As String '定义“自选合约”
    Public ZiXuanHeYue_X1(5), ZiXuanHeYue_Y1(5), ZiXuanHeYue_X2(5), ZiXuanHeYue_Y2(5) As Long '定义“自选合约”的4个坐标、
    Public BiaoQianMing(5) As String '定义“标签名”,6个标签分别为“上海”“大连”“中金”“郑州”“自选1”“自选2”
    Public BiaoQianMing_X1(5), BiaoQianMing_Y1(5), BiaoQianMing_X2(5), BiaoQianMing_Y2(5) As Long '定义“标签名”的4个坐标、
    Public ZiJinXiangMu(7) As String '定义“资金项目”,7个项目分别为“今日初始资金”“总权益”“可用资金”“持仓盈亏”“手续费”“今日盈亏”“今日盈亏比例”
    Public ZiJinXiangMu_X1(7), ZiJinXiangMu_Y1(7), ZiJinXiangMu_X2(7), ZiJinXiangMu_Y2(7) As Long '定义“资金项目”的4个坐标、
    Public DangQianHeYue As String '定义“当前合约”
    Public DangQianHeYue_X1, DangQianHeYue_Y1, DangQianHeYue_X2, DangQianHeYue_Y2 As Long '定义“当前合约”的4个坐标
    Public BiaoQianHeYue(2) As String '定义“标签合约”
    Public BiaoQianHeYue_X1(2), BiaoQianHeYue_Y1(2), BiaoQianHeYue_X2(2), BiaoQianHeYue_Y2(2) As Long '定义“标签合约”的4个坐标、
    Public KaiPingAnNiu(3) As String '定义“开平按钮”,共4个“开多”“平多”“开空”“平空”
    Public KaiPingAnNiu_X1(3), KaiPingAnNiu_Y1(3), KaiPingAnNiu_X2(3), KaiPingAnNiu_Y2(3) As Long '定义“开平按钮”的4个坐标、
    Public ChiCangLan(11, 7) As String '定义“持仓栏”
    Public ChiCangLan_X1(11, 7), ChiCangLan_Y1(11, 7), ChiCangLan_X2(11, 7), ChiCangLan_Y2(11, 7) As Long '定义“持仓栏”的4个坐标、
    Public WeiTuoLan(9, 5) As String '定义“委托栏”
    Public WeiTuoLan_X1(9, 5), WeiTuoLan_Y1(9, 5), WeiTuoLan_X2(9, 5), WeiTuoLan_Y2(9, 5) As Long '定义“委托栏”的4个坐标、
    Public ChiCangLanAnNiu(2) As String '定义“持仓栏按钮”,共3个“平仓”“清仓”“反手”
    Public ChiCangLanAnNiu_X1(2), ChiCangLanAnNiu_Y1(2), ChiCangLanAnNiu_X2(2), ChiCangLanAnNiu_Y2(2) As Long '定义“持仓栏按钮”的4个坐标
    Public WeiTuoLanAnNiu(1) As String '定义“持仓栏按钮”,共3个“平仓”“清仓”“反手”
    Public WeiTuoLanAnNiu_X1(1), WeiTuoLanAnNiu_Y1(1), WeiTuoLanAnNiu_X2(1), WeiTuoLanAnNiu_Y2(1) As Long '定义“持仓栏按钮”的4个坐标
    Public ChengJiaoLan(7, 15) As String '定义“成交栏”
    Public ChengJiaoLan_X1(7, 15), ChengJiaoLan_Y1(7, 15), ChengJiaoLan_X2(7, 15), ChengJiaoLan_Y2(7, 15) As Long '定义“成交栏”的4个坐标、
    Public EMA_MACD(10, 2), QuShiTiaoJianXuHao, CeLueTiaoJianXuHao, JiaGeTiaoJianXuHao, JianJieTiaoJianXuHao, ShiJianTiaoJianXuHao, HaoCha(), QuShiTiaoJianXuHao2, CeLueTiaoJianXuHao2, JiaGeTiaoJianXuHao2, JianJieTiaoJianXuHao2, ShiJianTiaoJianXuHao2 As Integer '    趋势条件序号、策略条件序号、价格条件序号、简捷条件序号、时间条件序号、流号序号差
    Public My1MACD(,), My1EMA(,), ChuFa1(,), KongChuFa(,) As Integer
    Public ZhiXing1, ZhiXing2, ShouShu(), LiuHao, HangHao1, HangHao2, HangHao3 As Integer '执行标识、策略、手数、执行状态标识、流号、行号
    Public hqhwnd, jyhwnd, cjhwnd, byhwnd, yishenghwnd, jinshidahwnd, Myhwnd(0 To 8) As Long '行情句柄、交易句柄、成交栏句柄
    Public JiaGe() As Double
    Public ZhiLingLeiBie(), HeYue(), FangXiang(), TiaoJian1(), ZhiBiao1(,), ZhiXingZhuangTai(), XiaDan_Time(), ZhouQi(), ZhiBiaoZhuangTai(), JianJieZhiBiaoZhuangTai(), JianJieZhiBiao1(), JianJieZhouQi() As String '指令类别、合约、方向、条件1、指标、状态标识
    Public MaiRuMaiChu(), DaYuXiaoYu(), ShiJianTiaoJianDan_time() As String '买入卖出、大于小于
    Public Function GetIni(ByVal SectionName As String, ByVal KeyWord As String, ByVal DefString As String, ByVal FileName As String) As String
        Dim ResultString As String = Nothing
        ResultString = LSet(ResultString, 256)
        If GetPrivateProfileString(SectionName, KeyWord, vbNullString, ResultString, Len(ResultString), FileName) > 0 Then
            GetIni = Left(ResultString, InStr(ResultString, Chr(0)) - 1)
        Else
            WritePrivateProfileString(SectionName, KeyWord, DefString, FileName)
            GetIni = DefString
        End If
    End Function

    Public Function GetINI2(ByVal Section As String, ByVal AppName As String, ByVal lpDefault As String, ByVal FileName As String) As String
        Dim Str As String = Nothing
        Str = LSet(Str, 256)
        GetPrivateProfileString(Section, AppName, lpDefault, Str, Len(Str), FileName)
        Return Microsoft.VisualBasic.Left(Str, InStr(Str, Chr(0)) - 1)
    End Function
    Public Function GetINIW(ByVal Section As String, ByVal AppName As String, ByVal lpDefault As String, ByVal FileName As String) As String
        Dim MyEncoder As System.Text.Encoding = System.Text.Encoding.Default
        Dim strResult As String
        Dim chars(2048) As Char
        strResult = CStr(chars)
        GetPrivateProfileString(Section, AppName, lpDefault, strResult, Len(strResult), FileName)
        Dim rByte() As Byte = System.Text.Encoding.Default.GetBytes(strResult.ToCharArray)
        strResult = New String(MyEncoder.GetChars(rByte))
        Return Microsoft.VisualBasic.Left(strResult, InStr(strResult, Chr(0)) - 1)
    End Function
    Public Sub MySleep(ByVal n As Long)  '延时函数,不会假死
        Dim sTime As Long
        'MsgBox(n)
        sTime = 1
        While sTime <= n
            sTime = sTime + 1
            System.Windows.Forms.Application.DoEvents()
            ' DoEvents()
            Sleep(10)
        End While
    End Sub
    Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long
        '参数VirtualKey表示按键虚拟码,flag表示是按下键还是释放键,用WM_KEYDOWN和WM_KEYUP这两个常数表示
        Dim s As String
        Dim Firstbyte As String         'lparam参数的24-31位
        If flag = WM_SYSKEYDOWN Then   '如果是按下键
            Firstbyte = "00 "
        Else
            Firstbyte = "C0 "               '如果是释放键
        End If
        Dim Scancode As Long
        '获得键的扫描码
        Scancode = MapVirtualKey(VirtualKey, 0)
        Dim Secondbyte As String       'lparam参数的16-23位,即虚拟键扫描码
        Secondbyte = Right("00 " & Hex(Scancode), 2)
        MsgBox("!" & Secondbyte)
        s = Firstbyte & Secondbyte & "0001 "     '0001为lparam参数的0-15位,即发送次数和其它扩展信息
        MakeKeyLparam = Val("&H " & s)
    End Function
    '封装成函数,这里用来启动调用exe文件
    Public Sub ShellEx(ByVal Path As String)
        Dim splitpos As Long
        splitpos = InStrRev(Path, "\")

        ShellExecute(0, "open", Path, "", Mid(Path, 1, splitpos - 1), 1)
    End Sub
End Module
金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

 楼主| 发表于 2012-6-23 09:39 | 显示全部楼层
精确测时(vb.net声明错了会出大问题滴,这是正确的声明):
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Declare Function QueryPerformanceCounter Lib "Kernel32" (ByRef X As Long) As Boolean
    Declare Function QueryPerformanceFrequency Lib "Kernel32" (ByRef X As Long) As Boolean


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim Ctr1, Ctr2, Freq As Decimal

        Dim d As Integer

        QueryPerformanceFrequency(Freq)
        QueryPerformanceCounter(Ctr1)
        System.Threading.Thread.Sleep(10)
        QueryPerformanceCounter(Ctr2)

        If Freq > 0 Then
            MsgBox((Ctr2 - Ctr1) / Freq * 1000000 & "微妙")
        Else
            MsgBox("!")
        End If
MsgBox(Freq)
End Class

测出来sleep 相当于10毫秒的精度


最后返回的时候要修改这个变量的,byval 是不能修改这个变量的,改成byRef就可以了,这是和vb6的区别
这是vb6的声明:
Private Declare Function QueryPerformanceCounter Lib "kernel32" (X As Currency) As Boolean
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (X As Currency) As Boolean
sleep在vb下可以直接写成sleep 10就行了,而.net必须写成System.Threading.Thread.Sleep(10)
参与人数 1奖励 +5 时间 理由
杨太极 + 5 2012-6-23 18:39 MACD有楼主更精彩!

查看全部评分

金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

 楼主| 发表于 2012-6-23 09:44 | 显示全部楼层
不是不想继续写,而是论坛回复总要审核,根本回复不了,看来只能到此为止了。#*27*#

[ 本帖最后由 wjlhc 于 2012-6-23 09:49 编辑 ]
参与人数 2奖励 +6 时间 理由
LakerainS + 1 2012-7-9 15:21 不愧为股市达人,顶!
杨太极 + 5 2012-6-24 12:55 MACD有楼主更精彩!

查看全部评分

金币:
奖励:
热心:
注册时间:
2002-1-24

回复 使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

本站声明:MACD仅提供交流平台,请交流人员遵守法律法规。
值班电话:18209240771   微信:35550268

举报|意见反馈|手机版|MACD俱乐部

GMT+8, 2025-4-9 21:06 , Processed in 0.064780 second(s), 21 queries , Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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