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


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件高级功能研发区 → 教你实现金字塔的自动监测(24小时无人照看)

   

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


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

主题:教你实现金字塔的自动监测(24小时无人照看)

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


加好友 发短信
等级:新手上路 帖子:31 积分:192 威望:0 精华:0 注册:2010/7/31 15:32:59
  发帖心情 Post By:2013/7/19 12:40:41 [只看该作者]

授人以渔图片点击可在新窗口打开查看

 回到顶部
帅哥哟,离线,有人找我吗?
木鱼石传说
  12楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:416 积分:139 威望:0 精华:0 注册:2013/2/5 20:33:58
  发帖心情 Post By:2013/7/19 17:36:09 [只看该作者]

好贴顶起来,虽然我看不懂

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


加好友 发短信
等级:黑侠 帖子:993 积分:1787 威望:0 精华:5 注册:2012/11/28 17:37:20
  发帖心情 Post By:2013/7/19 17:38:39 [只看该作者]

改了一点点代码,如下:

Sub Chashuju2()
 today=Date()
 if Weekday(today)=1 or Weekday(today)=7 or  todaystop=1 then Exit Sub
 if cdate(time)>=cdate("08:59:00") and cdate(time)<=cdate("09:00:00") then
  Set mail = CreateObject("WWSCommon.SmtpMail")
  strcon= ""
  if order.Account2(2,"你的ctp资金账户")<>1 then strcon = strcon & "交易帐号未登陆" & vbCrLf
  if application.ReceiveDataStatus = 0 then strcon = strcon & "金字塔数据接收未启动" & vbCrLf
     with mail
          .SenderName = "程序化监督"
          .SenderAddress = "发送邮箱@163.com"
          if strcomp(strcon,"")=0 then
           .Subject = "盘中检测已准备就绪" & cdate(date+time)
           strcon = "盘中检测已准备就绪"
          else
           .Subject = "盘中检测异常" & cdate(date+time)
          end if
      end with
      call mail.AddReceiver("139","13688888888@139.com")
      call mail.AddTextContent(strcon)

      call mail.Sender("smtp.163.com","发送邮箱@163.com","163邮箱密码")
      Set mail = nothing
 end if
 if cdate(time)<cdate("09:15:00") or cdate(time)>cdate("15:15:00") then exit Sub
 dim code(7)
 dim market(7)
 dim zhouqimin(2)
 strcon= ""
 if application.ReceiveDataStatus = 0 then application.ReceiveData(1)
 Application.PeekAndPump
 if order.Account2(2,"1848332")<>1 then strcon = strcon & "交易帐号未登陆" & vbCrLf
 if application.ReceiveDataStatus = 0 then strcon = strcon & "金字塔数据接收未启动" & vbCrLf
 code(0)=Document.GetExtString("股指交易合约1")
 market(0)="ZJ"
 code(1)=Document.GetExtString("股指主力合约")
 market(1)="ZJ"
 code(2)="000001"
 market(2)="SH"
 code(3)="1Z2016"
 market(3)="SH"
 code(4)="1Z2056"
 market(4)="SH"
 code(5)="000300"
 market(5)="SH"
 code(6)=Document.GetExtString("股指交易合约2")
 market(6)="ZJ"
 zhouqimin(0)=1
 zhouqimin(1)=5
 for pzindex=0 To 6 step 1
  for zhouqi = 0 to 5 step 1
   if zhouqi<2 or zhouqi>4 then
    set History = marketdata.GetHistoryData(code(pzindex),market(pzindex),zhouqi)
    Xa=today
    set mkt = marketdata.GetMarketInfo2(market(pzindex))
    if zhouqi<2 then Xa=cdate(today+mkt.opentime-cdate("1975-1-1")+cdate("00:0" & zhouqimin(zhouqi) & ":00"))
    a=History.GetPosFromDate(Xa)
    aaa=History.GetPosFromDate(cdate(today+mkt.closetime-cdate("1975-1-1")))
    copentime=cdate(mkt.opentime-cdate("1975-1-1"))
    if zhouqi<2 then Kn = mkt.TradeSeconds / 60 / zhouqimin(zhouqi)
    
    if zhouqi=5 then
     if cdate(time)>cdate(copentime) and History.Date(aaa)<>cdate(today) then strcon=strcon & code(pzindex) & " 当天日线缺失" & vbCrLf
    else
     if History.Date(a)<cdate(today) then aa=aaa-a else aa=aaa-a+1
     mins = DateDiff("n",cdate(copentime),cdate(time))
     if mins>-1 and (cdate(time)<cdate("11:30:00") or cdate(time)>cdate("13:00:00")) then
      if cdate(time)<cdate("11:30:00") then
       mins = mins \ zhouqimin(zhouqi)+1
      elseif cdate(time)>cdate("13:00:00") then
       mins = mins \ zhouqimin(zhouqi)+1-90 \ zhouqimin(zhouqi)
      end if
      if mins<>aa and aa<Kn then
       strcon=strcon & code(pzindex) & " 当天" & zhouqimin(zhouqi) & "分钟K线数目前为" & aa & ",应为" & mins & vbCrLf
      elseif aa>Kn then
       strcon=strcon & code(pzindex) & " 当天" & zhouqimin(zhouqi) & "分钟K线数目前为" & aa & ",应为" & Kn & vbCrLf
      end if
     end if
    end if
   end if
  next
 next
 
 secs = 100
 for i=0 to SigCount-1 step 1
  if states(i)=1 and (cdate(time)<cdate("11:30:00") or cdate(time)>cdate("13:00:00")) then
   secs = DateDiff("s",cdate(newtime(i)),cdate(time))
   if cdate(time)>cdate("09:31:00") and secs>60 then '由于我的所有公式均是1分钟调用一次VBA函数READSIG,所以公式最近一次运行时间应该在60秒内
    strcon = strcon & "策略" & i & "已超过" & secs & "秒没有执行" & vbCrLf
   end if
  end if
 next
 
 if strcomp(strcon,"")=0 then
  errorcount=0
  if (cdate(time)<cdate("09:16:05") or (cdate(time)>cdate("13:00:00") and cdate(time)<cdate("13:01:05"))) and secs<120 then
   Set mail = CreateObject("WWSCommon.SmtpMail")
      with mail
           .SenderName = "程序化监督"
           .SenderAddress = "lectureke@163.com"
           .Subject = "公式已开始运行" & cdate(date+time)
           '.Mailer = strcon
       end with
       call mail.AddReceiver("139","13697463533@139.com")
       call mail.AddTextContent("公式已开始运行")
       'call mail.AppOctStrmContent("D:\mxrb\"&Date&".xls")
       call mail.Sender("smtp.163.com","lectureke@163.com","xiaobai")
       Set mail = nothing
  end if
 else
  errorcount=errorcount+1
  if errorcount=1 or errorcount=5 then
   Set mail = CreateObject("WWSCommon.SmtpMail")
      with mail
           .SenderName = "程序化监督"
           .SenderAddress = "发送邮箱@163.com"
           .Subject = "程序化盘中异常通知" & cdate(date+time)
       end with
       call mail.AddReceiver("139","13688888888@139.com")
       call mail.AddTextContent(strcon)
       call mail.Sender("smtp.163.com","发送邮箱@163.com","163密码")
       Set mail = nothing
      end if
    end if
End Sub

 

红色部分,第一个地方是修正股指期货第一笔数据(集合竞价)9:14到下一根K线开始9:16相距是两分钟,所以我在这段时间是允许程序两分钟时间不运行的;

第二个地方,or errorcount=5表示,如果数据第一次查到有欠缺了,errorcount为1时会发一个短信通知,如果连续5分钟都有欠缺,那么errorcount将等于5,会再发一个异常通知短信。所以,如果是只收到一个异常通知,而5分钟时未收到第二个异常通知,表示可能金字塔只是短暂网络异常导致数据欠缺,没有发生连续的数据欠缺。如果5分钟间隔收到两次通知,那么表示情况严重,数据接收可能已经完全有问题了。


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


加好友 发短信
等级:黑侠 帖子:993 积分:1787 威望:0 精华:5 注册:2012/11/28 17:37:20
  发帖心情 Post By:2013/7/19 17:45:03 [只看该作者]

如果一天之中,什么短信都收不到(实际上9点前就应该收到两个短信的,一个说历史数据完整,一个说监控准备就绪),表示可能:
1、你的邮箱出故障了,收不了信或发不了短信
2、金字塔完全瘫痪,连vba都运行不了了

 

下午开盘,应该也要收到一个短信,否则也表示可能出现上面两个问题之一了

 

如果盘中其他时间都没收到短信,那么恭喜,一切正常

 

如果盘中收到一次异常提醒,但没有在5分钟后收到第二个,那么只是短暂的问题,无需担心

 

如果收到一次一次提醒,5分钟后又收到第二次提醒,那么请马上找台电脑,远程控制,看看金字塔出了什么问题


 回到顶部
帅哥哟,离线,有人找我吗?
绿草地77
  15楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:126 积分:0 威望:0 精华:0 注册:2013/6/8 9:24:22
  发帖心情 Post By:2013/7/19 20:20:42 [只看该作者]

谢谢了,现在还看不明白,到时向你请教。

 回到顶部
帅哥哟,离线,有人找我吗?
蜡笔小新
  16楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:10 积分:0 威望:0 精华:0 注册:2013/6/17 10:17:24
  发帖心情 Post By:2013/7/31 13:01:29 [只看该作者]

不好意思,我是新手,就连第一部创建VBA宏都不知道如何操作~求指教~

 回到顶部
帅哥哟,离线,有人找我吗?
蜡笔小新
  17楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:10 积分:0 威望:0 精华:0 注册:2013/6/17 10:17:24
  发帖心情 Post By:2013/7/31 13:02:28 [只看该作者]

老师有QQ吗?

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


加好友 发短信
等级:黑侠 帖子:993 积分:1787 威望:0 精华:5 注册:2012/11/28 17:37:20
  发帖心情 Post By:2013/8/8 11:31:15 [只看该作者]

改了下盘中监测,新代码如下,修改或新增的代码用了红色字体

Sub Chashuju2()'盘中数据检查
 today=Date()
 if Weekday(today)=1 or Weekday(today)=7 or  todaystop=1 then Exit Sub'星期6和7不检查
 if cdate(time)>=cdate("08:59:00") and cdate(time)<=cdate("09:00:00") then '开盘前8点59分先做一次账户检查
  Set mail = CreateObject("WWSCommon.SmtpMail")
  strcon= ""
  if order.Account2(2,"你的ctp账户")<>1 then strcon = strcon & "交易帐号未登陆" & vbCrLf
  if application.ReceiveDataStatus = 0 then strcon = strcon & "金字塔数据接收未启动" & vbCrLf
     with mail
          .SenderName = "程序化监督"
          .SenderAddress = "email@163.com"
          if strcomp(strcon,"")=0 then
           .Subject = "盘中检测已准备就绪" & cdate(date+time)
           strcon = "盘中检测已准备就绪"
          else
           .Subject = "盘中检测异常" & cdate(date+time)
          end if
      end with
      call mail.AddReceiver("139","13688888888@139.com")
      call mail.AddTextContent(strcon)
      call mail.Sender("smtp.163.com","email@163.com","123456")
      Set mail = nothing
 end if
 if cdate(time)<cdate("09:15:00") or cdate(time)>cdate("15:15:00") then exit Sub'只在所交易的合约开盘的时间内做检查,我交易合约是股指,所以定这个时间
 dim code(6)
 dim market(6)
 dim zhouqimin(2)
 strcon= ""
 if application.ReceiveDataStatus = 0 then application.ReceiveData(1)
 Application.PeekAndPump
 if order.Account2(2,"你的ctp账户")<>1 then strcon = strcon & "交易帐号未登陆" & vbCrLf
 if application.ReceiveDataStatus = 0 then strcon = strcon & "金字塔数据接收未启动" & vbCrLf
 code(0)=Document.GetExtString("股指交易合约")
 market(0)="ZJ"


 Holding = Document.GetExtData("IFHOLDING")
 dim BuyHoding
 dim BuyTodayHoding
 dim SellHoding
 dim SellTodayHoding
 dim BuyCost
 dim SellCost
 dim PNL
 Dim UseMargin
 Result = Order.HoldingInfoByCode2(code(0),market(0),BuyHoding,BuyCost,BuyTodayHoding,SellHoding,SellCost,SellTodayHoding,PNL,UseMargin,"你的ctp登陆资金账号")
 If Result = 1 Then
  if Round(BuyHoding-SellHoding)<>Round(Holding) then
   strcon = strcon & code(0) & "持仓不同步,实际持仓" & Round(BuyHoding-SellHoding) & "手,应为" & Holding & "手" & vbCrLf
  end if
 End If

 code(1)=Document.GetExtString("股指主力合约")
 market(1)="ZJ"
 code(2)="000001"
 market(2)="SH"
 code(3)="1Z2016"
 market(3)="SH"
 code(4)="1Z2056"
 market(4)="SH"
 code(5)="000300"
 market(5)="SH"
 zhouqimin(0)=1
 zhouqimin(1)=5
 for pzindex=0 To 5 step 1
  for zhouqi = 0 to 5 step 1
   if zhouqi<2 or zhouqi>4 then
    set History = marketdata.GetHistoryData(code(pzindex),market(pzindex),zhouqi)
    Xa=today
    set mkt = marketdata.GetMarketInfo2(market(pzindex))
    if zhouqi<2 then Xa=cdate(today+mkt.opentime-cdate("1975-1-1")+cdate("00:0" & zhouqimin(zhouqi) & ":00"))
    a=History.GetPosFromDate(Xa)
    aaa=History.GetPosFromDate(cdate(today+mkt.closetime-cdate("1975-1-1")))
    copentime=cdate(mkt.opentime-cdate("1975-1-1"))
    if zhouqi<2 then Kn = mkt.TradeSeconds / 60 / zhouqimin(zhouqi)
    
    if zhouqi=5 then
     if cdate(time)>cdate(copentime) and History.Date(aaa)<>cdate(today) then strcon=strcon & code(pzindex) & " 当天日线缺失" & vbCrLf
    else
     if History.Date(a)<cdate(today) then aa=aaa-a else aa=aaa-a+1
     mins = DateDiff("n",cdate(copentime),cdate(time))
     if mins>-1 and (cdate(time)<cdate("11:30:00") or cdate(time)>cdate("13:00:00")) then'中午休市时不检查
      if cdate(time)<cdate("11:30:00") then
       mins = mins \ zhouqimin(zhouqi)+1
      elseif cdate(time)>cdate("13:00:00") then
       mins = mins \ zhouqimin(zhouqi)+1-90 \ zhouqimin(zhouqi)
      end if
      if mins<>aa and aa<Kn then
       strcon=strcon & code(pzindex) & " 当天" & zhouqimin(zhouqi) & "分钟K线数目前为" & aa & ",应为" & mins & vbCrLf
      elseif aa>Kn then
       strcon=strcon & code(pzindex) & " 当天" & zhouqimin(zhouqi) & "分钟K线数目前为" & aa & ",应为" & Kn & vbCrLf
      end if
     end if
    end if
   end if
  next
 next
 
 secs = 100
 for i=0 to SigCount-1 step 1
  if states(i)=1 and (cdate(time)<cdate("11:30:00") or cdate(time)>cdate("13:00:00")) then'进对已加载的公式检查状态,中午休市不检查
   secs = DateDiff("s",cdate(newtime(i)),cdate(time))
   if cdate(time)>cdate("09:31:00") and secs>60 then '由于我的所有公式均是1分钟调用一次VBA函数READSIG,所以公式最近一次运行时间应该在60秒内,如果你的公式是5分钟的,那么这个时间要加大
    strcon = strcon & "策略" & i & "已超过" & secs & "秒没有执行" & vbCrLf
   end if
  end if
 next
 
 if strcomp(strcon,"")=0 then
  errorcount=0
  if (cdate(time)<cdate("09:16:05") or (cdate(time)>cdate("13:00:00") and cdate(time)<cdate("13:01:05"))) and secs<120 then

'固定在上午和下午开盘后的第一次检查时发邮件通知,即使是一切正常时
   Set mail = CreateObject("WWSCommon.SmtpMail")
      with mail
           .SenderName = "程序化监督"
           .SenderAddress = "email@163.com"
           .Subject = "公式已开始运行" & cdate(date+time)
       end with
       call mail.AddReceiver("139","13688888888@139.com")
       call mail.AddTextContent("公式已开始运行")
       call mail.Sender("smtp.163.com","email@163.com","123456")
       Set mail = nothing
  end if
 else
  errorcount=errorcount+1
  if errorcount<3 or errorcount=5 then'连续异常时,会有第1、第2、第5次通知;如果出现异常后,又恢复正常,异常通知次数会重新计算
   Set mail = CreateObject("WWSCommon.SmtpMail")
      with mail
           .SenderName = "程序化监督"
           .SenderAddress = "email@163.com"
           .Subject = "盘中异常通知第" & errorcount & "次 " & cdate(date+time)
       end with
       call mail.AddReceiver("139","13688888888@139.com")
       call mail.AddTextContent(strcon)
       call mail.Sender("smtp.163.com","email@163.com","123456")
       Set mail = nothing
      end if
    end if
End Sub

1、增加了持仓同步检查,如果持仓不同步,会发异常通知,每分钟检查一次(需要先在公式中将holding的值用extdbdataset保存为IFHOLDING,如果你交易多个品种,需要保存为不同的变量名称,并在代码中对每一个交易的合约进行持仓检查)

2、修复了早盘第一根K线正常执行时,由于距离竞价开盘超过60秒而认为是异常的问题

3、异常通知只通知一次的规则改为:当第一次监测到异常时,发出“第一次通知”,如果连续出现异常,再发出第2、第5次通知,之后就不会再通知。如果5分钟内收到3次通知(或者连续2分钟收到两次异常通知),就说明程序出现问题且恢复不了了。如果只收到“第1次通知”且无第二次通知,说明短暂的异常随后消失了。


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


加好友 发短信
等级:黑侠 帖子:993 积分:1787 威望:0 精华:5 注册:2012/11/28 17:37:20
  发帖心情 Post By:2013/8/8 11:40:55 [只看该作者]

对于担心由于断网、断电、死机等情况,而造成即使出现了问题也无法发出通知的情况,我用双机监测的办法得到了完美的解决:

1、在两个不同的地点,同时运行金字塔、你的策略、和我的监测代码,主机备用机同时登陆你的交易资金账号(但需要用不同的账号登陆金字塔,或者备用机用免费账号登陆);

2、主机开启金字塔的图表程序化交易,以及持仓同步,备用机不开启以上两项功能(就是备用机不交易,只检查)

3、备用机的监控代码中,发出的邮件标题加上“(备用)”两个字以示区别

 

两台机同时断网断电死机的情况几乎不存在,这样你就可以放心的无人照看了!


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


加好友 发短信
等级:论坛游侠 帖子:406 积分:196 威望:0 精华:0 注册:2013/1/22 18:44:07
  发帖心情 Post By:2013/8/9 15:31:54 [只看该作者]

以下是引用klc在2013/8/8 11:40:55的发言:

对于担心由于断网、断电、死机等情况,而造成即使出现了问题也无法发出通知的情况,我用双机监测的办法得到了完美的解决:

1、在两个不同的地点,同时运行金字塔、你的策略、和我的监测代码,主机备用机同时登陆你的交易资金账号(但需要用不同的账号登陆金字塔,或者备用机用免费账号登陆);

2、主机开启金字塔的图表程序化交易,以及持仓同步,备用机不开启以上两项功能(就是备用机不交易,只检查)

3、备用机的监控代码中,发出的邮件标题加上“(备用)”两个字以示区别

 

两台机同时断网断电死机的情况几乎不存在,这样你就可以放心的无人照看了!

 

klc兄,非常好的帖子。

 

但非程序员出身的大部分人都不懂VBA,能否搞个小白操作指南。。。


 回到顶部
总数 31 上一页 1 2 3 4 下一页