以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  高级功能研发区  (http://weistock.com/bbs/list.asp?boardid=5)
----  TestReport 在日线以下周期交易时间的疑问  (http://weistock.com/bbs/dispbbs.asp?boardid=5&id=75664)

--  作者:chacterchen
--  发布时间:2015/2/15 6:35:16
--  TestReport 在日线以下周期交易时间的疑问
能否帮忙看看下面的代码中在窗体中输出的K线周期是否符合实际的交易日期?其他品种包括橡胶之类的我也有同样的疑问.谢谢!




PEL公式
ma5 := ma(c,5);
ma10 := ma(c,10);
ma20 := ma(c,20); 
StopLossValue : ma20;     //,nodraw;


KD:= cross(ma5,ma10) and ma5>=ma20;          //开多条件
PD:= cross(ma10,ma5);                              //平多条件
KK:= cross(ma10,ma5) and ma5<=ma20;          //开空条件
PK:= cross(ma5,ma10);                           //平空条件

开多条件: KD,nodraw;
开空条件: KK,nodraw;
平空条件:PK AND holding<>0,nodraw;
平多条件:PD AND holding<>0,nodraw;

平空:SELLSHORT(PK,1,THISCLOSE);                  //平空信号
开多:BUY(KD AND HOLDING=0,1,THISCLOSE);          //开多信号
平多:SELL(PD,1,THISCLOSE);                       //平多信号
开空:BUYSHORT(KK AND HOLDING=0,1,THISCLOSE);     //开空信号

持仓:holding,linethick0;
资产:asset,noaxis;
可用现金:cash(0),linethick0;


Flag:holding,linethick0;//表示当前账户持仓量
FlagPrice:enterprice,linethick0;//开仓成交价
Bars:if (type(1)=1 or type(1)=3,enterbars,exitbars),nodraw; //type(1)为 1 或者 3为开多或者开空

{
信号语句排列规则——先平后开
“费率设置”按钮——用于合理设置模型“费率”,以便在图形上正确输出如下帐户信息:

持仓:holding,linethick0;
资产:asset,noaxis;
可用现金:cash(0),linethick0;

您可以在查看菜单->交易系统模板 中设置自己需要的模板
}





VBS公式 


\'===============================
\'使用PLE语言做为信号,VBA进行测评
\'===============================

sub VbaTest
     \'输入选项
     InitalCapital=15          \'起始资金XX万
     startdate="2014-1-1"     \'测试起始日期
     finishdate="2015-1-1"     \'测试结束日期
    
    
     \'以下开始正式测试,不需要修改
     Testreport.StartAndInit \'开始测评系统的准备工作
     Testreport.InitCash=InitalCapital*10000 \'初始资金由万转为元
    
     Set Formula = marketdata.STKINDI("CU13","SQ","MA交易范例()",0,4) \'调用上期所CU13合约的60min线自定义指标
     \'Set Formula = marketdata.STKINDI("CU13","SQ","MA交易范例()",0,3) \'调用上期所CU13合约的30min线自定义指标
     \'Set Formula = marketdata.STKINDI("CU13","SQ","MA交易范例()",0,2) \'调用上期所CU3合约的15min线自定义指标
    
     Set HistroyData = Formula.ParentGrid.GetHistoryData \'直接得到公式区的数据对象,提高运行效率
    
    
     for i = 0 to 4     \'将msgout与之前的数据隔开,便于观察
          application.MsgOut "     "   
     next
     application.MsgOut "HistoryData:"&cstr(HistroyData.count)
     application.MsgOut "Formula.DataSize:"&Formula.DataSize
     application.MsgOut "Formula.GetBufDateData(0):"&Formula.GetBufDateData(0)
     application.MsgOut "Formula.GetBufDateData(Formula.DataSize-1):"&Formula.GetBufDateData(Formula.DataSize-1)
    
    
     \'tempvar= cdate(startdate)
     \'application.MsgOut "Start date:"&tempvar&" HistoryData起始日期:"&Formula.GetBufDateData(0)     \'看看是否是转换成为了日期格式
    
     \'查找在Formula中的起始日期序列号
    
     \'判断测试起始日期是否正确
     if Formula.GetBufDateData(Formula.DataSize-1)< cdate(startdate) then
         MsgBox "起始日期不正确"
     end if
    
     \'判断测试结束日期是否正确
     if Formula.GetBufDateData(0)> cdate(finishdate) then
         MsgBox "结束日期不正确"
     end if
    
     \'确定起始日期在数组中的序列号
     if Formula.GetBufDateData(0)> cdate(startdate) then          \'如果数据列的起始日期晚于我设定的开始日期,则说明数据不足,从已有数据序列的第一个值开始测试
          application.MsgOut"测试数据不足,请检查起始日期或者更改\'工具>选项>维护>内存保留\'"
          BeginDataNum=0
     else     \'如果我设定的开始数据晚于数据起始日期,则需要查找从何时开始测试
          i = 0
          while (i<= HistroyData.Count-1) and (Formula.GetBufDateData(i) < cdate(startdate))
               i = i+1
          wend   
          BeginDataNum=i
     end if
     application.MsgOut "BeginDataNum:"&BeginDataNum   
     application.MsgOut "Formula.GetBufDateData(BeginDataNum):"&Formula.GetBufDateData(BeginDataNum)     \'看看哪一天是起始日期
    
     \'确定结束日期在数组中的序列号
     if Formula.GetBufDateData(Formula.DataSize-1)< cdate(finishdate) then          \'如果数据列的结束日期早于我设定的结束日期,则说明数据不足,设定数据序列的最后一个值为结束日期
          application.MsgOut"测试数据不足,请检查结束日期是否正确"
          FinishDataNum=Formula.DataSize-1
     else     \'如果我设定的结束数据早于数据序列结束日期,则需要查找从何时结束测试
          i = 0
          while (i<= HistroyData.Count-1) and (Formula.GetBufDateData(i) < cdate(finishdate))
               i = i+1
          wend   
          FinishDataNum=i-1
     end if
     application.MsgOut "FinishDataNum:"&FinishDataNum   
     application.MsgOut "Formula.GetBufDateData(FinishDataNum):"&Formula.GetBufDateData(FinishDataNum)     \'看看哪一天是结束日期
    
     If TestReport.AddTestStock(HistroyData,"RU13","SQ",0) < 1 Then \'向测试报告系统添加一个新测试品种
         MsgBox "请正确添加品种"
     End if
    
     \'下面的代码控制循环测试
     \'使用PEL策略的信号进行交易
     For i = 0 to FinishDataNum
          application.MsgOut "K线时间:" & Formula.GetBufDateData(i)
    
    
          if i >= BeginDataNum Then
     \'          if i= BeginDataNum then
     \'               application.MsgOut "(i=BeginDataNum):     "&Formula.GetBufDateData(i)   
     \'          end if
     \'        
     \'          if i= FinishDataNum then
     \'               application.MsgOut "(i=FinishDataNum ):     "&Formula.GetBufDateData(i)   
     \'          end if   
             
              if Formula.GetBufData("开多条件",i) = 1 Then \'开多
                   \'开仓计算公式  总资本*风险资金百分比/(本周期收盘价-本周期止损价)
                   StopLossValue=Formula.GetBufData("StopLossValue",i)
                  
                  TestReport.Buy 1, HistroyData.Close(i)
              End if
        
              if Formula.GetBufData("平多条件",i) = 1 And TestReport.Holding > 0 Then \'平多
                  TestReport.Sell 0, HistroyData.Close(i)
              End if
        
              if Formula.GetBufData("开空条件",i) = 1 Then \'开多
                  TestReport.Buyshort 1, HistroyData.Close(i)
              End if
        
              if Formula.GetBufData("平空条件",i) = 1 And TestReport.Holding < 0 Then \'平多
                  TestReport.Sellshort 0, HistroyData.Close(i)
              End if
        
               \'显示测试时当前的资产
               \'Application.msgout TestReport.ASSET
          end if
        
        
         \'测试完毕强平持仓
         If i = FinishDataNum Then
             If TestReport.Holding < 0 Then
                 TestReport.SellShort 0,HistroyData.Close(i)
             End IF
             If TestReport.Holding > 0 Then
                 TestReport.Sell 0, HistroyData.Close(i)
             End If
         End If
    
               \'为步进下一个数据做准备
               TestReport.StepIt i
     Next
    
     \'在此添加新的证券代码
    
     \'测试完毕显示测试报告
     Testreport.ShowReport

end sub

Sub APPLICATION_VBAStart()
call VbaTest

End Sub


Sub APPLICATION_VBAEnd()

End Sub

\'获取最大手数
Function TP_GetMaxVol(sCode,nNewPrice)\'获取在test report状态下的最大手数
     iQuanYi=TestReport.ASSET                    \'得到测试模式下当前的净自有资产, 算法:可用现金+占用保证金-融资(现金+品种市值-融资)
     iCash=Testreport.Cash                         \'账户现金
     \'接下去在ini文件中查询保证金比例
     GetPrivateProfileFloat
     iBzj=0.15                                        \'保证金的比例
     iCangWei=0.8                                   \'仓位为总仓位的80%
     set Report1=marketdata.GetReportData(sCode,sMarket)
     nNewPrice=report.NewPrice                    \'获得合约最新价格
     iHandBzj=nNewPrice*iMultipliter*iBzj/100          \'计算每手保证金     计算方法为  最新价格*合约乘数*保证金比例/100  ?有疑问 为何要除以100?
     if iHandBzj>0 then
          iMaxVol=int((iQuanYi*iCangWei/100)/iHandBzj)     \'此也有问题应该是icash?
     else   
          iMaxVol=1
     end if
     GetMaxVol=iMaxVol
end Function

--  作者:王锋
--  发布时间:2015/2/15 10:56:25
--  

请问上述代码你具体遇到了什么问题?

能否详细描述一下便于我们进行有针对性的解答?


--  作者:chacterchen
--  发布时间:2015/2/15 11:36:22
--  
你好! 
我使用
Set Formula = marketdata.STKINDI("CU13","SQ","MA交易范例()",0,4) \'调用上期所RU13合约的60min线自定义指标
获得PEL公式交易数据

我截取一段消息窗口中输出的某天交易时间,

我的问题是

1 感觉金字塔输出的交易时间与实际交易时间有不符合的情况.为何在2013年的时候一天只有两小时的交易时间?现在的交易时间也似乎与实际交易时间对不上?

2 另外我已经从百度云盘中下载了所有的5分钟数据,并且导入到金字塔中去,为何下面缺失2013/12/17-2014/11/15之间的数据?






K线时间:2013/12/11 14:00:00
K线时间:2013/12/11 15:00:00
K线时间:2013/12/12 14:00:00
K线时间:2013/12/12 15:00:00
K线时间:2013/12/13 14:00:00
K线时间:2013/12/13 15:00:00
K线时间:2013/12/16 14:00:00
K线时间:2013/12/16 15:00:00
K线时间:2013/12/17 14:00:00
K线时间:2013/12/17 15:00:00
K线时间:2014/11/4 19:00:00
K线时间:2014/11/5 2:00:00
K线时间:2014/11/5 3:00:00
K线时间:2014/11/5 4:00:00
K线时间:2014/11/5 5:00:00
K线时间:2014/11/5 14:00:00
K线时间:2014/11/5 15:00:00
K线时间:2014/11/5 18:00:00
K线时间:2014/11/5 19:00:00
K线时间:2014/11/6 2:00:00
K线时间:2014/11/6 3:00:00
K线时间:2014/11/6 4:00:00
K线时间:2014/11/6 5:00:00
K线时间:2014/11/6 14:00:00
K线时间:2014/11/6 15:00:00
K线时间:2014/11/6 18:00:00
K线时间:2014/11/6 19:00:00

网上我查到的数据是
上海期货交易所的沪铜期货交易时间:09:00-10:15;10:30-11:30为上午交易时段,13:30-15:00为下午交易时段。夜间为21:00-02:30.

[此贴子已经被作者于2015/2/15 11:38:19编辑过]

--  作者:chacterchen
--  发布时间:2015/2/15 13:25:30
--  
重新下载了数据,问题2 数据不完整的情况解决了.
--  作者:yukizzc
--  发布时间:2015/2/15 13:41:58
--  

网盘上历史数据还没做更替还是老的数据格式,你通过工具-数据补充来补充历史的这段数据。

[此贴子已经被作者于2015/2/15 13:42:56编辑过]