欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件高级功能研发区 → 金字塔VBA常用对象使用范例

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有102105人关注过本帖树形打印复制链接

主题:金字塔VBA常用对象使用范例

帅哥哟,离线,有人找我吗?
guotx2010
  31楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蜘蛛侠 帖子:1366 积分:5210 威望:0 精华:7 注册:2010/12/11 18:00:33
  发帖心情 Post By:2012/5/26 21:58:49 [只看该作者]

对于26楼的思考题,我的方法是:

    开仓时逐笔分拆存储,平仓时按照先开先平的方式寻找开仓价,计算盈亏这样就解决了上面的问题我那个帖子《交易成交逐笔记录到Excel》http://www.weistock.com/bbs/dispbbs.asp?boardid=5&Id=10234

就是这么处理的,你能看出来吗?

 

    其实记录成交记录到Excel还可以用于分析滑点,但是难度也不小,你是否想过呢?这里需要解决的问题有:

1、记录策略信号出现时的价格到Excel;

2、记录开仓成交价到Excel;

3、记录平仓价到Excel;

4、分别计算开仓和平仓的信号价与成交价的差,就是你需要的滑点。

 

 


 回到顶部
帅哥哟,离线,有人找我吗?
guotx2010
  32楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蜘蛛侠 帖子:1366 积分:5210 威望:0 精华:7 注册:2010/12/11 18:00:33
  发帖心情 Post By:2012/5/26 22:03:22 [只看该作者]

关于Order对象,想说的东西太多,所以迟迟不想进行下一个对象的讲解,同时,提出一些问题来引导大家,一起来挖掘Order对象的妙用,却不见有人提出好的想法,或者贴出好的帖子来一起讨论。

 

高手们可不能老是潜水哟,出来秀秀你的奇思妙想吧!

 


 回到顶部
帅哥哟,离线,有人找我吗?
sun884588
  33楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:132 积分:775 威望:0 精华:0 注册:2011/12/27 11:53:44
  发帖心情 Post By:2012/5/27 13:48:45 [只看该作者]

学习了!向您致敬。

 回到顶部
帅哥哟,离线,有人找我吗?
sun884588
  34楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:132 积分:775 威望:0 精华:0 注册:2011/12/27 11:53:44
想请教下满仓时先平后开的写法  发帖心情 Post By:2012/5/30 21:52:16 [只看该作者]

再顶一下。

 回到顶部
帅哥哟,离线,有人找我吗?
guotx2010
  35楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蜘蛛侠 帖子:1366 积分:5210 威望:0 精华:7 注册:2010/12/11 18:00:33
  发帖心情 Post By:2012/6/1 16:01:19 [只看该作者]

看来大家只是来看的,没有一个人发代码出来,既然这样,那就继续下一个对象吧。

 回到顶部
帅哥哟,离线,有人找我吗?
guotx2010
  36楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蜘蛛侠 帖子:1366 积分:5210 威望:0 精华:7 注册:2010/12/11 18:00:33
  发帖心情 Post By:2012/6/1 16:20:38 [只看该作者]

三、MarketData对象

 

   

    获取行情数据,这个你一定得用。

    1、GetReportData:获取指定品种的行情数据。

      比如要获取股指6月份合约的最新价,代码如下:

    sub GetNewPrice()

           Set Report1=MarketData.GetReportData("IF06","ZJ")

           NewPrice=Report1.NewPrice

           Application.Msgout Cdate(time) & ",IF06最新价:" & NewPrice

    End Sub

    这个事件返回的数据为一个ReportData对象,你如果需要返回买1价、卖1价、合约代码、市场代码等其他信息,只要看ReportData对象的属性有哪些就可以直接调用了。

 

    如果要每隔一段时间读取一次价格,比如每隔1秒读取一次价格,用于决定是否符合开平仓条件,那么就得使用定时器了,定时器的使用方法,本帖子的第一个对象讲得很清楚,可以参考。    

 

     2、ReportNotify事件

     使用ReportNotity来监控价格变化比上面的定时读取价格的方法好的地方是价格的每一次跳动都逃不过这个事件的监控,而使用定时器,则会漏掉一些价格,不如:股指每一秒钟有2笔成交回报,用上面的方法就会漏掉一次价格变化,当然如果你把定时器设置成500毫秒一次也可以获取每一次的价格变化,但是这样对系统资源的消耗会很大的,而是用这个事件相对占用较少系统资源。

    如果你是做套利的,那么对价格变动更加敏感,使用这个事件是最好的选择。

    这个事件的使用,需要首先注册你要监控的品种,使用RegReportNotify方法,代码如下:

    sub RegIF()            '还是监控IF06合约的价格变化

            Call MarketData.RegReportNotify("IF06","ZJ")

            '要监控多个品种,继续写代码就行了,如:

            Call MarketData.RegReportNotify("RB10","SQ")    '监控上期的螺纹钢10月份合约

    end sub

    把这个过程用到VBAStart事件中,就会在启动VBA时自动注册对IF06合约的监控

 

    到这里为止,你只做了一半事情,很多人就是在这之后不知道怎么获取行情数据了。别担心,继续看下去你就明白了。

 

    注册了合约之后,需要通过另一个事件来获取行情数据,那就是ReportNotify事件,这个事件会返回一个ReportData对象,这个更上面的一样。

    Sub MarketData_ReportNotify(ReportData)

            '有人在这里还是用1的方法设置一个report1变量,然后取report1的返回值,这是多余的,ReportData本身就是返回的数据,直接取reportData的值就行了。

            NewPrice=ReportData.NewPrice

            stkLable=ReportData.Label

            Application.Msgout Cdate(time) & ",Code:" & stkLabel & ",NewPrice:" & NewPrice

    End Sub

 

   当你监控了某一个品种之后,应该在Application_VBAEnd事件或Application_Close事件中进行注销,不然这个合约在你启动VBA时依然有效,除非你退出金字塔,重新进入就没有了。

   注销的方法是:使用unRegReportNotify方法。

   Sub UnRegIF()

          Call MarketData_UnRegReportNotify("IF06","ZJ")

   End Sub

   可以把这个过程用到Application_VBAEnd中,就会很好的在你不用的时候注销监控的品种了。

 

   以上代码都是我在本贴子中现场写的,没有经过测试,主要是启发你的思路,如果测试有错误,可以跟帖指出。

 

[此贴子已经被作者于2012-6-1 16:45:35编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
guotx2010
  37楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蜘蛛侠 帖子:1366 积分:5210 威望:0 精华:7 注册:2010/12/11 18:00:33
  发帖心情 Post By:2012/6/1 16:49:55 [只看该作者]

接上楼,继续MarketData对象

 

目前金字塔没有一个方法自动注销所有的已注册品种,我想到的方法是使用全局变量,注册时记录到全局变量,停止vba时,从全局变量取出曾经注册的品种,逐个注销,可以参考下面的帖子10楼。

http://www.weistock.com/bbs/dispbbs.asp?boardid=5&Id=12044

 

2.93开始,停止VBA时,会自动注销已经注册的品种。大家就不用自己写代码来注销了。

[此贴子已经被作者于2012-9-5 8:13:00编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
sun884588
  38楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:132 积分:775 威望:0 精华:0 注册:2011/12/27 11:53:44
  发帖心情 Post By:2012/6/5 16:58:51 [只看该作者]

我来顶了,感谢楼主,继续学习

 回到顶部
帅哥哟,离线,有人找我吗?
guotx2010
  39楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蜘蛛侠 帖子:1366 积分:5210 威望:0 精华:7 注册:2010/12/11 18:00:33
  发帖心情 Post By:2012/6/9 16:05:08 [只看该作者]

四、Document对象

    使用这个对象可以很方便地读写配置文件(ini文件)、读写全局变量、写日志文件等。

 

    我最喜欢使用全局变量了,先说说全局变量怎么使用吧,全局变量类似于单值数据库,以键值对形式形式存放数值,存放的数据主要是数值或字符串,对于这个两种类型的数据分别使用不同方法来读写。

    对于数值性的数据使用SetExtData来赋值,使用GetExtData来读取。

    看下面的代码段:

    Sub WriteAndReadGlobal()

          '将数值型数据写入全局变量

          Call Document.SetExtData("变量1",1000)

          '从全局变量读取出来存入到临时变量

          Var1=Document.GetExtData("变量1")

          application.msgout "Var1:" & Var1

    End Sub

 

    对于字符性的数据使用SetExtString来赋值,使用GetExtString来读取。

    看下面的代码段:

    Sub WriteAndReadGlobal1()

        '将数值型数据写入全局变量

        Call Document.SetExtString("变量1","测试字符")

        '从全局变量读取出来存入到临时变量

        Var1=Document.GetExtString("变量1")

        application.msgout "Var1:" & Var1

    End Sub

 

    如果要将当前时间存储到全局变量,可以这么写: Call Document.SetExtString("当前时间",Cdate(time))

 

    清除全局变量的方法:ClearExtData,使用这个方法可以一次全部清除所有的全局变量。

    Call Document.ClearExtData()

    这个方法是很彻底,可是有一个问题,就是如果我不想全部清除,而是想清除某一个全局变量,就没有办法了。我曾向金字塔论坛提出过此问题,到现在这个版本还是没有增加单个清除的方法。

    一个复杂的策略可能会使用大量的全局变量,这些全局变量可能是动态生成的名字,具有某一特征,比如,记录订单情况的全局变量使用字符"Order"加该订单的OrderID,这里的OrderID就是动态的,设置时可以这样在Order_OrderStatusEx事件中设置:

Call Document.SetExtData("Order-" & OrderID & "-Vol",Filled),可是要清除这个全局变量,仅仅根据名称,你是不能完成的,因为清除一般是在收盘时,可是,当时那个OrderID,系统已经无法知道了,所以,希望金字塔再扩充此部分功能时,不仅要增加清除单个全局变量,还要增加清除具有某一特征的多个全局变量,如Order开头的全局变量。

    另外、全局变量多了,要想知道到底有多少个全局变量,无法知道,要是有一个属性来记录全局变量的个数,然后有一个方法来遍历每一个全局变量就完美了。

 

    上面的遗憾,在2.93版已经不再有了,因为已经增加了相应的处理方法了:

1、增加了ExtDataNum和ExtDataStringNum两个属性,分别返回数值型和字符性全局变量个数,就可以遍历了。

2、增加了GetExtDataByIndex和GetExtStringByIndex取得指定位置的全局变量的值和键。

3、增加了RemoveExtData和RemoveExtString两个方法,来删除数值型和字符型全局变量。

     具体的代码例子看:http://www.weistock.com/bbs/dispbbs.asp?boardid=5&Id=11642&page=1&star=8

 

 

 

 

[此贴子已经被作者于2012-9-5 8:30:06编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
guotx2010
  40楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蜘蛛侠 帖子:1366 积分:5210 威望:0 精华:7 注册:2010/12/11 18:00:33
  发帖心情 Post By:2012/6/9 16:20:38 [只看该作者]

继续Document对象。楼上说了对全局变量的读写操作,现在说说对ini文件的读写操作

 

对ini文件,我们都不会陌生,用它来记录你的策略中需要长期保存的参数是它的最佳使用场景,比如,记录交易账号、交易的合约代码、止盈、止损标准等。

 

1、GetPrivateProfileString:使用这个方法来读取ini文件中的字符值

2、WritePrivateProfileString:使用这个方法来写入字符值到ini文件

 

priavate AccountID

private DiCangVol,BuCangVol,JiaCangVol,ZhiYingStd,ZhiSunStd

Sub GetIni()

     AccountID=document.GetPrivateProfileString("Gen", "AccountID", "", "C:\SystemSet.ini") 
     DiCangVol=cdbl(document.GetPrivateProfileString("Gen", "DiCangVol",1, "C:\SystemSet.ini"))    '底仓手数
     BuCangVol=cdbl(document.GetPrivateProfileString("Gen", "BuCangVol",1, "C:\SystemSet.ini"))   '补仓手数
     JiaCangVol=cdbl(document.GetPrivateProfileString("Gen", "JiaCangVol",8, "C:\SystemSet.ini"))   '加仓手数
     ZhiYingStd=cdbl(document.GetPrivateProfileString("Gen", "ZhiSunStd",8, "C:\SystemSet.ini"))   '止盈标准
     ZhiSunStd=cdbl(document.GetPrivateProfileString("Gen", "ZhiSunStd",8, "C:\SystemSet.ini"))    '止损标准

     if AccountID="" then
          msgbox "SystemSet.ini文件中没有设置AccountID(交易账号),请修改C:\SystemSet.ini"
          Document.WritePrivateProfileString "Gen","AccountID","88888888","C:\SystemSet.INI"   '交易账户
          Document.WritePrivateProfileString "Gen","Market","ZJ","C:\SystemSet.INI"   '市场代码
          Document.WritePrivateProfileString "Gen","WriteSql","1","C:\SystemSet.INI"   '是否写到Sql Server
     end if

 End Sub

 


 回到顶部
总数 108 上一页 1 2 3 4 5 6 7 8 9 10 下一页 ..11