: | : | :期货程序化 | :期货程序化研究 | :期货量化学习 | :期货量化 |
返回列表 发帖

金字塔自动交易系统

金字塔自动交易系统

金字塔程式化交易的特点和与TradeStation等软件的不同点

金字塔为了满足不同层次用户的需要,提供两种程式化交易:图表程式化交易和后台程式化交易。

图表自动交易是为基础用户所设立,使用NTERLONG、EXITLONG、ENTERSHORT、EXITSHORT这4种传统的交易信号来实现下单,交易过程是基于图表之上的,用户事先将写有上述4种交易信号的公式添加到图表上,然后再来启动交易。

后台程式化交易是基于后台的预警模式,金字塔提供了一系列的功能和众多交易函数,可以在不影响用户前台图形操作情况下,可以高效与预警系统一起工作来实现自动交易,并且可以一个交易策略同时交易几个品种。而TradeStation是必须在图表上才能实现交易的。

TradeStation程式化交易时,图表上只有最后一个周期走完才发出交易指令,而金字塔提供了两种模式:一种是基于预警轮询模式,在一个K线周期内会被多次执行交易判断(频率取决于预警时间间隔这个选项),这样可以保证在出现信号时能够以最快速度的发出交易指令,但是用户不用担心一个周期内多次重复交易问题,因为金字塔可以自动防止此现象(可以使用ALLOWREPEAT控制符允许反复开平仓)。另外金字塔也提供K线走完再发信号这种工作模式,与TradeStation保持了一致。

由于程式化交易模式不同,所以用金字塔做自动交易时应特别注意几个问题:

1、使用了即时发出预警信号选项时,自动交易不局限于最后的K线走完,所以可能会导致中间发出信号,而价格变动后信号消失;

2、使用了即时发出预警信号时,预警时间间隔控制轮询的频率,用户应该根据交易公式所用到的周期合理的分配间隔时间,防止由于间隔时间不合适而导致例如上传下破等指标信号漏掉的情况。

金字塔的图表程式化交易和后台程式化交易的简要描述和结构

前台图表交易

金字塔前台图表交易是将交易系统指标放在图表上进行显示和下单交易的,金字塔图表交易适用ENTERLONG、EXITLONG、ENTERSHORT、EXITSHORT这四种交易信号来分别表示多空头的进出场描述。

除此之外,金字塔还提供了功能更为强大的新交易系统函数,可以使用BUY、SELL、BUYSHORT、SELLSHORT函数,对介入价位和仓位进行精确的控制,可以对譬如海龟交易法的头寸管理,金字塔的新交易系统函数,用户可以在公式函数列表的“交易系统”组里找到。但是需要注意的是金字塔的新交易系统,是不能与旧的交易系统比如ENTERLONG混用的,金字塔的新交易系统采取的虚拟仓位和资金,在图表做显示和模拟交易的,使用之前用户需要在公式属性里将资金和费率设置正确,以确保能更加贴近实战,真实自动交易时,系统将根据交易指令发出的交易类型和价格以及数量进行下单交易。

后台程式化交易

金字塔的后台程式化交易在金字塔公式系统里,用户可以在“后台程式化交易”函数组里找到,后台程式化交易是基于预警模式进行工作,由于后台程式化交易是金字塔在后台进行,不需要图表打开不占用过多的资源,由于只需要最后一个周期的信号,所以原则上公式不要多余计算,故效率高,便于对多个品种同一个策略进行轮循监控。用户前期编写的自动交易策略是需要先在图表上和程式化交易评测上通过后才可以放到后台去执行程式化交易。为了让用户更快的编写和熟悉金字塔的后台程式化交易、金字塔的程式化交易函数,前面都在交易系统函数名称前加T字母,比如BUY改为TBUY,使用方法大致相同。与图表显示的交易系统函数不同的是,后台程式化交易的函数都使用实际的用户持仓和资金。

使用金字塔自动交易的常见问题和注意事项:

1、前台图表ENTERLONG控制指令和BUY等图表显示函数是不能放在后台做监控交易的,但是将“允许程式化交易”勾去掉后单独做预警是可以的。

2、不带T的交易系统所有函数,均不能与ENTERLONG等传统的交易系统混用。

3、只有少数的带T的后台交易函数允许使用在Enterlong和BUY前台图表交易策略中。TAVGENTERPRICE,Taccount,Tholding,Tasset,但是金字塔强烈不建议使用,因为这样会造成图表上的交易信号与实际的下单记录不符。

4、金字塔的后台交易部分,使用手工闪电下单的记录,将无法通过比如TENTERPRICE等与交易记录有关函数中得到结果,但可以通过程式化交易监控中的手工下单干预功能完成此项目的。

5、金字塔的后台交易,查询持仓和资产均为用户当前的实际数值,如果多个策略同时多一个品种或通一个帐户进行操作会产生相互干扰现象,解决办法就是通过使用交易系统使用虚拟持仓和资金,这样就完全可以避免这种共振现象,但是推荐高级用户使用,因为需要很多技巧需要处理。

6、传统的交易信号ENTERLONG虽然功能较弱,但是由于不需要头寸管理,故金字塔可以使用公式的特殊算法达到高效运行,故在不需要介入点和仓位控制的策略中,尽量避免使用BUY等新交易系统,尤其在使用了BUY的新交易系统的策略中,使用未来函数更会导致效率下降。同样如此,如果在同一个策略中使用TBUY和BUY函数,也会导致在后台自动交易时的效率下降。

7、用以图表显示的交易系统和后台程式化交易的交易指令函数,参数有明显的不同,用户不能简单的将BUY函数加个T就可以直接后台交易,使用前应该将鼠标放在TBUY函数上认真看看函数说明。

8、BUY和TBUY等用以图表显示的交易系统和后台程式化交易的交易指令函数,参数有明显的不同,用户不能简单的将BUY函数加个T就可以直接后台交易,使用前应该将鼠标放在TBUY函数上认真看看函数说明。

9、TBUY(COND,V,[Type,P1,P2,AC,STOCK]),中括号的参数可以省略,但只可以是后面省略,不可以中间省略。tbuy(zd,1,mkt,'003028',hy);这样是一种错误的方法,应该改成tbuy(zd,1,mkt,0,0,'003028',hy);

用以图表显示的交易系统和后台程式化交易的交易指令函数,参数有明显的不同,用户不能简单的将BUY函数加个T就可以直接后台交易,使用前应该将鼠标放在TBUY函数上认真看看函数说明。

==========================================

有关公式函数参数默认值的使用说明

拿后台程式化交易开多指令比如:tbuy(zd,1,mkt,'003028',hy); 初学者容易犯这样一个错误,以为只要使用了mkt指令后,价格就不需要填写了,这是错误的方法,几乎所有的编程语言函数缺省值都是中间不能空缺的,只能从后面空缺。

tbuy(zd,1,mkt)这样是没问题的,后面的参数金字塔将自行按默认处理。

tbuy(zd,1,lmt,c,0) 也是没问题的,后面的帐号和品种均按默认处理。

tbuy(zd,1,mkt,'003028',hy) 但是这样就不行,因为中间的两个委托价格没有填写,金字塔会吧'003028',hy当做价格来处理,势必造成委托结果与你希望的不符。

tbuy(zd,1,mkt,0,0,'003028',hy) ; 这样经过改写,就没问题了。

==========================================

有关后台程式化交易使用的注意事项

后台程式化交易由于用户无法直接在图表上看到信号的整个出现过程,故对用户的公式编写水平有一定的要求,用户需要对金字塔的后台交易系统工作机理有比较深的了解,并且要对自己的公式系统有清晰的认识,这样一旦遇到问题也能及时找到问题的原因。强烈建议用户,只有具有比较熟练的使用图表公式编写基础之后再来使用后台程式化交易!后台程式化交易的调试工作非常重要,请参考下面有关的专门介绍。

如果你对金字塔的后台 程式化交易还不了解,那么建议用户仔细阅读

http://www.weistock.com/bbs/dispbbs.asp?boardid=2&Id=370  金字塔公式编写与程式化交易设计指南

http://www.weistock.com/bbs/dispbbs.asp?boardid=2&Id=124  金字塔程式化交易简要教程

==========================================

金字塔公式编写调试

http://www.weistock.com/bbs/dispbbs.asp?boardid=4&id=1246&page=1&star=1

===========================================

有关平仓反手的模型

input:man(26,2,200);

ma1:=ma(close,man);
ccm:=cross(close,ma1);
cmc:=cross(ma1,close);

资产:ASSET,LINETHICK0;
可用现金:CASH(0),LINETHICK0;
持仓:HOLDING,LINETHICK0;

//顺序必须主要需要根据仓位先平后开的原则

if ccm then
begin
//平空开多
sellshort(holding<0 and ccm,0);
buy(holding<=0,1);
end

if cmc then
begin
//平多开空
sell(holding>0 and cmc,0);
buyshort(holding>=0,1);
end

如果是传统的ENTERLONG交易信号,同样需要先平后开的原则

EXITLONG: cross(A2,AO) OR B2>0;
EXITSHORT: CROSS(AO,A2) OR B2>0;
ENTERLONG: cross(AO,A2) AND B1=1;
ENTERSHORT: CROSS(A2,AO) AND B1=1;

如果用户帐户资金不足或者希望顺序成交,可以使用ORDERQUEUE指令

EXITLONG: cross(A2,AO) OR B2>0, ORDERQUEUE;

==================================================

由于金字塔不鼓励使用未来函数,所以

文华的:

NN1:=BARSLAST(DATE<>REFX(DATE,1));
NN:=MAX(NN1,1);

在金字塔中用这一条指令替换

NN:=barslast(DATE<>REF(DATE,1))+1;

=======================================

关于函数不能在控制语句之内被引用的问题

答:请参阅专贴介绍 http://www.weistock.com/bbs/dispbbs.asp?boardid=4&Id=130

==================================================

TIME 和 CURRENTTIME 的区别

很多用户需要在一个精确的时间内做某些下单动作,比如开盘后5分钟下单,收盘前1分钟平仓,这种时候不能使用TIME函数做时间点判断,因为TIME是取的周期时间,金字塔在生成每根K线时为了规范化时间,都将时间做了一定程度的修整,所以已经不是严格的成交时间。如果用户需要精确的时间做某些事情,那么必须使用CURRENTTIME,取用户本地计算机时间来完成。为了保证时间准确可靠,用户应该定期的校正您的本地时间,方法可在工具->选项->升级和时间。

===================================================

对于最后一个周期才起作用的函数,如果使用了全局变量进行控制,千万记得加上islastbar控制条件

variable:a=10;

debugout('a1=%.0f',a);

if a=10 then begin
debugout('a2=%.0f',a);
tbuy(1,1,mkt);
a:=6;
debugout('a3=%.0f',a);
end;

debugout('a4=%.0f',a);


上述公式将无法正常工作,因为variable声明的变量是在整个计算周期内的全局变量,对于tbuy和debugout函数,他们都是在公式的最后的一个周期才执行的函数,所以将导致最后一个周期到来时a实际已经等于6而不会去正确执行开仓语句。

解决办法是 if a=10 and islastbar then begin 这样加上最后周期判断,或者去掉 variable 变量声明,让a变为一个周期之内的变量

===============================================

对于公式中经常引用到的市场代码,比如上海证券市场是'SH',具体每个市场的代码在工具菜单->市场与板块中,查看市场的代号,设置和进行管理.

=================================================

金字塔公式测试系统,没有测试结果的问题解决

1、确认所测试品种的测试时间段的历史数据齐全,若不起请在工具菜单-》补充数据上补齐。2、在第二步的测试时间段确保时间正确。3、确保在第一步所选测试周期选择正确,公式系统该周期未被禁用。4、确保第四步交易费率设置合理,资金至少要能够进行必要的开仓条件。该资金设置同样在图表做交易系统测试显示时同样应该注意。

=========================================

文华模型转金字塔模型

http://www.weistock.com/bbs/dispbbs.asp?boardid=4&Id=210

=========================================

金字塔公式测试系统,没有测试结果的问题解决

1、确认所测试品种的测试时间段的历史数据齐全,若不起请在工具菜单-》补充数据上补齐。

2、在第二步的测试时间段确保时间正确。

3、确保在第一、步所选测试周期选择正确,公式系统该周期未被禁用。

4、确保第四步交易费率设置合理,资金至少要能够进行必要的开仓条件。该资金设置同样在图表做交易系统测试显示时同样应该注意。

5、如果不能双向交易,问题是:只有“交易系统”属性得公式支持双向交易测试,其他类型得公式只能单向测试,测试模型在第5步有选项。另外开打公式系统检查公式是否支持双向交易语句。

=========================================

为什么我的交易系统有信号了但是没有委托或者成交,我们以图表交易为重点介绍,对于初学用户,总结原因一般有如下几点:

1、用户需确认在出现交易信号之后金字塔是否有发出委托指令,用户可以在交易记录中查询到,如果有委托但未成交主要有两点,对于模拟交易,如果使用综合交易平台系统,由于目前并不完善,会经常造成即便市价下单也无法及时成交的情况。对于实盘交易,用户需要在报单策略上多仔细考虑尽量的发出对价单来保证其成交。

2、如果有信号没有委托发出,请确认是否是下列几点造成

  1)金字塔会在打开一个品种的图表后自动补充历史数据,确认是否是因为自动补数据造成的在交易时没有信号出现,但是补数据后历史上出现交易信号,但是用户通过查询历史成交记录觉得对不上了。

  2)如果用户使用模拟交易,目前模拟交易得稳定性没有实盘交易好,所以如果盘中中断,那么会导致出现后错过时机。

  3)使用固定轮循模式执行指标交易,由于最后一个K线没有最终形成,信号出现后下单,但是信号又消失,造成历史信号与持仓不吻合,这时建议大家使用K线走完模式,保证信号稳定。

  4) 对于BUY,TBUY等高级的策略交易系统,切记要先平后开的下单原则。

  5)对于无法发出平仓指令的情况,一般情况是因为开仓指令的委托单,没有及时成交,由于平仓信号发出时没有仓位,金字塔无法仓可平,等信号错过后,开仓单才成交,造成了看起来漏掉了一个平仓信号。

  6)因为平仓反手不对称造成,最常见的是发出平仓信号后没有及时成交,但是反手单却提前成交了,造成了锁仓,导致金字塔判断仓位方向不确定会导致平仓单信号漏掉,对于反手情况,初学用户请尽量使用市价委托,并使用ORDERQUEUE指定顺序成交,否则就建议初学者尽量使用对价报单,尽量避免不成交的几率出现,否则初学用户就应该初期只使用单向交易,等日后能够熟练应用金字塔的追单功能后再使用挂单性质的反手交易手法。

  7)如果使用固定时间间隔,间隔时间设置过大,造成信号在周期的末尾时出现,但正好在扫描的时间间隔之内,造成了出现信号金字塔没有及时的得知,对于此情况建议用户将间隔时间设为1秒

  8)如果用秒线或者分笔周期,请务必选择“高频”选项,避免行情快速变化时由于固定轮循最小1秒间隔带来的信号漏单。

  9) 如果使用了ORDERQUEUE顺序下单指令,那么应该尽量的让其一次性成交,必要时请使用市价委托,因为一旦队列下单不成交撤单后,再次委托会将委托追单排到最后,导致后面的比如反手指令无法正确得到执行,造成信号漏单。

  10)后台自动交易不要将THOLDING写在交易语句里比如TBUY(bk and THOLDING=0,1,MKT),详细解释请看问题15

  11) 图表交易里使用了后台自动交易的函数THOLDING2或者THOLDING或者使用了DYNAINFO等常数函数,由于图表交易不会在产生信号时立即发单,等再次检测时由于之前的发单成交THOLDING已经发生变化导致刚才出现的信号因为THOLDING的信号消失,所以产生了信号漏掉。

  12) 推荐用户仔细看看金字塔的调试技巧文章

http://www.weistock.com/bbs/dispbbs.asp?boardid=4&id=1246&page=1&star=1

    尤其是需要打开下单日志,这样便于在出现问题时,及时的查到问题的原因。

  13)用户要确认自己的策略中没有使用跨周期数据引用或者BACKSET,REFX等未来函数,有些这些未来数据,或造成信号的反复消失及过往的K线突然出现信号,导致用户看起来错过的那跟K线没有下单

  14)是否在模型中使用了小周期引用大周期的情况,同样属于未来数据的使用,会导致信号消失

=========================================


有关后台自动交易THOLDING的使用

初学者在使用后台自动交易时,通常认为将函数前简单加T就可以,但实际不行的,比如:

tSELL(bp and THOLDING>0,0,LMT,C);

tSELLSHORT(sp and THOLDING<0,0,LMT,C);

tBUY(bk and THOLDING=0,1,LMT,C);

tBUYSHORT(sk and THOLDING=0, 1,LMT,C);
在图表交易系统上这样改过来的代码

THOLDING与图表HOLDING最大的不同在于,THOLDING是与你真实持仓一致的函数,只有当我们的委托下单成交后才会有所变化,而HOLDING是虚拟持仓,BUY执行过后立即变化。

由于我们前面的代码在执行了平仓操作后,THOLDING不会马上变成0,故会导致TBUY的THOLDING=0条件不被成立,导致没有反手信号。

正确的反手写法

if bp > 0 and THOLDING>0 then

begin

tSELL(1,0,MKT),ORDERQUEUE;

tBUYSHORT(1, 1,MKT),ORDERQUEUE;

end

if sp > 0 and THOLDING<0 then

begin

tSELLSHORT(1,0,MKT),ORDERQUEUE;

tBUY(1,1,MKT),ORDERQUEUE;

end

有关这部分的用户详细讨论,详见http://www.weistock.com/bbs/dispbbs.asp?boardid=2&Id=2775

清注意上述代码使用了市价委托,如在CTP接口上模拟交易,请注意一定要在上期所品种下进行

THOLING与THODING2的不同:THOLING会返回我们当前的可用持仓,发出平仓指令之后,即便没有成交,持仓也会被扣掉,故如果用THOLING做为开仓条件,会有前次平仓没有成交而马上开仓带来的资金不足情况,如果用户需要知道当前自己的实际持仓,那么请用THODING2,他不会因为你的挂单未成交而导致的实际持仓被扣情况。

=========================================

用VARIABLE定义的变量和直接赋值定义的变量有何不同?

http://www.weistock.com/bbs/dispbbs.asp?BoardID=2&ID=2501

http://www.weistock.com/bbs/dispbbs.asp?boardid=4&Id=3611

==========================================

引用指定周期品种数据,指定指标数据的注意事项

在使用"INDIE.VAR"(P1,P2)或者"000001$CLOSE"或者使用CALLSTOCK,STKINDI函数引用其他周期的指标数据时,一些初学者容易犯的一个错误就是认为当前的品种数据全了以后被引用品种的数据也全的,导致在使用引用数据指标时编写的公式无法正常工作。金字塔的在用户翻看一个品种时是可以自动补数据的,但是无法自动补被引用品种的或者该品种不同周期的数据,再首次使用金字塔或者在不确定被引用数据是否齐全时,请手工进行数据补充工作,手工补充数据方法:http://www.weistock.com/download/receivedata.jpg

=========================================

为何输出的字符串是100000等数字的

金字塔下,字符串是以地址形式保存的,如果直接按照数字方式显示,则直接显示出地址;因此字符串的输出必须是使用字符串显示函数进行,DRAWTEXT或者DRAWTEXTEX都可以正常显示出字符串变量中的值。

=========================================

receivedata.jpg (366.43 KB)

receivedata.jpg

receivedata.jpg (366.43 KB)

receivedata.jpg


论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
 
期货论坛 - 版权/免责声明   1.本站发布源码(包括函数、指标、策略等)均属开放源码,用意在于让使用者学习程序化语法撰写,使用者可以任意修改语法內容并调整参数。仅限用于个人学习使用,请勿转载、滥用,严禁私自连接实盘账户交易
  2.本站发布资讯(包括文章、视频、历史记录、教材、评论、资讯、交易方案等)均系转载自网络主流媒体,内容仅为作者当日个人观点,本网转载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网不对该类信息或数据做任何保证。不对您构成任何投资建议,不能依靠信息而取代自身独立判断,不对因使用本篇文章所诉信息或观点等导致的损失承担任何责任。
  3.本站发布资源(包括书籍、杂志、文档、软件等)均从互联网搜索而来,仅供个人免费交流学习,不可用作商业用途,本站不对显示的内容承担任何责任。请在下载后24小时内删除。如果喜欢,请购买正版,谢谢合作!
  4.龙听期货论坛原创文章属本网版权作品,转载须注明来源“龙听期货论坛”,违者本网将保留追究其相关法律责任的权力。本论坛除发布原创文章外,亦致力于优秀财经文章的交流分享,部分文章推送时若未能及时与原作者取得联系并涉及版权问题时,请及时联系删除。联系方式:http://www.qhlt.cn/thread-262-1-1.html
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

返回列表