当前位置:→ 公式网金字塔公式 → 正文
  • [原创]教你写一个金字塔不卡的复杂图表策略[金字塔模型]

  • 相关简介:前言: 这是一个代码框架,其中部分灵感来自阿火的策略、guotx2010的VBA教程和王峰的一句话(如果你注重效率,那么金字塔提供的全局变量数据库的速度完全可以超越INI文件的),所以在此向各位前辈致谢! 适用本框架的前提: 不使用金字塔规定不能用于if ... then中的函数(如统计函数、未来函数等)、采用走完K线、且K线走完后信号就固定下来的(即未来不会发生改变)、使用新图表交易函数、勾选仅刷最后一根K线 步骤: 第一步:创建3个自定义函数,创建方法在此不详述,VBA代码如下: \'定义4

  • 文章来源:公式网 发布时间:2015-10-23浏览次数:下载次数:0

前言:

这是一个代码框架,其中部分灵感来自阿火的策略、guotx2010的VBA教程和王峰的一句话(如果你注重效率,那么金字塔提供的全局变量数据库的速度完全可以超越INI文件的),所以在此向各位前辈致谢!

适用本框架的前提:

不使用金字塔规定不能用于if ... then中的函数(如统计函数、未来函数等)、采用走完K线、且K线走完后信号就固定下来的(即未来不会发生改变)、使用新图表交易函数、勾选“仅刷最后一根K线”

步骤:

第一步:创建3个自定义函数,创建方法在此不详述,VBA代码如下:

\'定义4个动态数组保存信号和信号发生日期和时间

dim dates()
 dim times()
 dim values()
 dim SigCounts()
 SigCount = 0

 

Function INSERTSIG(Formula,SIGNUM,D,T,H)
  \'通过VBA数组记录信号以及信号发生的时间,当最新信号发出时执行一次
 INSERTSIG=0
  On Error Resume Next
  dates(SIGNUM).AddBack(D)
  if err.number<>0 then
   INSERTSIG=1
   exit function
  end if
  times(SIGNUM).AddBack(T)
  values(SIGNUM).AddBack(H)
  if dates(SIGNUM).Count>SigCounts(SIGNUM) and SigCounts(SIGNUM)>0 then
   dates(SIGNUM).RemoveAt(0)
   times(SIGNUM).RemoveAt(0)
   values(SIGNUM).RemoveAt(0)
  end if
 End Function

 

Function READSIG(Formula,SIGNUM)
     \'将数组信号发生时间转换为K线位置,并记录到单值全局变量系统中,供Perl公式读取,每产生一次新K线时执行一次
 READSIG=0
  On Error Resume Next
  cc = times(SIGNUM).Count
  if err.number<>0 then
      READSIG = 1
      exit function
  end if
  iGlobal=document.ExtDataNum
  for i=iGlobal to 0 step -1
   iKeyValue=document.GetExtDataByIndex(i,sKeyName)
   if (strComp(left(sKeyName,5),"HH" & right(Formatnumber(1000+SIGNUM,0,0,0,0),3))=0) or (strComp(left(sKeyName,5),"PP" & right(Formatnumber(1000+SIGNUM,0,0,0,0),3))=0) then
    call document.RemoveExtData(i)
     end if
  next
 
  Set History = Formula.ParentGrid.GetHistoryData()
  next_sig_pos = 0
  For i = times(SIGNUM).Count-1 To 0 step -1
   str = Formatnumber(19000000+dates(SIGNUM).GetAt(i),0,0,0,0) & Formatnumber(1000000+times(SIGNUM).GetAt(i),0,0,0,0)
   str = mid(str,1,4) & "-" & mid(str,5,2) & "-" & mid(str,7,2)  & " " & mid(str,10,2) & ":" & mid(str,12,2) & ":" & mid(str,14,2)
   bi = History.GetPosFromDate(str) + 1
   Document.SetExtData "PP" & right(Formatnumber(1000+SIGNUM,0,0,0,0),3) & Formatnumber(bi,0,0,0,0),next_sig_pos
   Document.SetExtData "HH" & right(Formatnumber(1000+SIGNUM,0,0,0,0),3) & Formatnumber(bi,0,0,0,0),values(SIGNUM).GetAt(i)
   next_sig_pos = bi
  Next
  Document.SetExtData "PP" & right(Formatnumber(1000+SIGNUM,0,0,0,0),3) & "1",next_sig_pos
 End Function

 

Function INIT_SIG(Formula,SigNum,Count)
     \'初始化数组,加载公式时或其他必要时间(例如加载新品种时)运行一次
 INIT_SIG=0
  On Error Resume Next
  Set dates(SigNum) = nothing
  Set times(SigNum) = nothing
  Set values(SigNum) = nothing
  if err.number<>0 or SigCount    ReDim Preserve dates(SigNum+1)
      ReDim Preserve times(SigNum+1)
      ReDim Preserve values(SigNum+1)
      ReDim Preserve SigCounts(SigNum+1)
      SigCount = SigNum+1
  end if
  Set dates(SigNum) = CreateObject("Stock.Array")
  Set times(SigNum) = CreateObject("Stock.Array")
  Set values(SigNum) = CreateObject("Stock.Array")
  dates(SigNum).RemoveAll
  times(SigNum).RemoveAll
  values(SigNum).RemoveAll
  SigCounts(SigNum) = Count
 End Function

 

第二步:Perl公式代码修改为以下框架:

///////////////固定的开头,您仅可以修改“保留信号数”以及“策略号”/////////////////////////////////////////////////

GLOBALVARIABLE:d=0,t=0,next_sig_pos=0,保留信号数=20,策略号=0;
 mylot:holding,NODRAW;
 if BARPOS=1 then
 begin
  if EXTGBDATA(\'股指合约切换\')=1 then
  begin
   d:=0;
   t:=0;
   //EXTGBDATASET(\'股指合约切换\',0);
  end;
  if d=0 and t=0 then
  begin
   xxx:=INIT_SIG(策略号,保留信号数);
  end
  else begin
   xxx:=round(READSIG(策略号));
   if xxx=1 then
   begin
    d:=0;
    t:=0;
    next_sig_pos=0;
    xxx:=INIT_SIG(策略号,保留信号数);
   end
   else
    next_sig_pos:=1;
  end;
 end;

if barpos=next_sig_pos then
 begin
  myholding:=round(extgbdata(\'HH\' & strright(numtostr(1000+策略号,0),3) & numtostr(barpos,0)))-holding;
  next_sig_pos:=round(extgbdata(\'PP\' & strright(numtostr(1000+策略号,0),3) & numtostr(barpos,0)));
  if myholding>0 then
  begin
   pc:=min(abs(min(holding,0)),myholding);
   kc:=myholding-pc;
   sellshort(pc>0 and holding<0,pc,market);
   buy(kc>0 and holding>=0,kc,market);
  end
  else if myholding<0 then
  begin
   pc:=min(max(holding,0),abs(myholding));
   kc:=abs(myholding)-pc;
   sell(pc>0 and holding>0,pc,market);
   buyshort(kc>0 and holding<=0,kc,market);
  end;
 end;

if date()

//////////////////////////////////////////////////////////////////////////////////////////////////////

 

//这里本应省略N行代码,这是您原来的策略代码,为了使您马上能测试,我随便写了个简单的策略,请不要照用

issell:=close isbuy:=close>open and CALLSTOCK(STKLABEL,vtCLOSE,1,-1)>CALLSTOCK(STKLABEL,vtOpen,1,-1);//2连阳多
sell(holding>0 and issell,1,market);
 SELLSHORT(holding<0 and isbuy,1,market);
 buyshort(holding=0 and issell,-1,market);
 buy(holding=0 and isbuy,1,market);
 j:=0;
 for i:=1 to 3000 do              //////////这里加了个循环3000次,目的是故意拖慢效率
 j:=j+1;

 

//您的策略代码可以非常复杂,唯一需要注意的是请保证后面的结束语句能被执行,即至少产生交易信号时不要使用exit

 

/////////////////固定的结束语句,请原封不动//////////////////////////////////////////////////////////

 ☟问题反馈 ☞┄┄┄┄┄┄┄┄┄┄→收藏资源:

[原创]教你写一个金字塔不卡的复杂图表策略[金字塔模型]

  • 下载资源所需积分

    0

  • 当前拥有积分

    0

上传会员: 
公式网
文件大小: 
Bytes
上传时间: 
2015-10-23
下载积分: 
-
免责声明: 
请仔细阅读并同意后才能下载
本附件为用户分享上传,公式网没有对文件进行验证,不能保证下载资源的准确性、安全性和完整性,也不保证下载资源能正常安装和使用,且下载后扣除的积分无法退还,除非您充分理解并完全接受本声明,否则您无权下载。
本站对提供下载的软件、指标、资料等不拥有任何权利,其版权归该下载资源的合法拥有者所有。本附件仅供学习和研究使用,不得用于商业或者非法用途,如有侵犯您的版权, 请参看 《公式网侵权处理流程》《公式网免责声明条款》
点击下载无反应时,更换主流浏览器重新登录操作,如360浏览器、Edge浏览器、谷歌浏览器,个别浏览器有不兼容现象。
勾选以下表示您已经阅读并同意以上声明才能下载本文件,扣除积分无法退还!
我已阅读所有条款规定, 请点我同意 所有条款内容!我自愿下载!
提示:如下载失败,请点关闭刷新此页面或提交问题反馈给管理员→
关闭

关于我们 - 联系我们 - 隐私政策 - 免责声明 - 下载帮助 - 广告合作 - SiteMap - TOP
增值电信业务经营ICP许可证:湘B2-20210269 湘ICP备09016573号-3 湘公网安备43108102000039号
Copyright © 2025 铭网科技,All Rights Reserved.