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

MultiCharts编程Set系列关键字

MultiCharts编程Set系列关键字

(原创:Alex)

       如表1所示,set系列关键字从功能来说,可以分为3类:前三个算一类,主要用于限定多笔进场是否合并出场;从第4个一直到倒数第2个算一类,为方便下方叙述,我们将这一类定义为出场类set关键字;最后一个关键字setexitonclose单独算一类。Set系列关键字在所有关键字中应该是最难的,它涉及到信号的执行顺序、是否合并出场、与IF判断的结合、手续费滑价、AA模式和假回报、精细回测;下面我们将系统性阐述set系列关键字的用法。


1 Set系列关键字

  

Set关键字名称

  

功能简述

setstopcontract

不同进场由set指令分开出场

setstopshare

setstopcontract

setstopposition

不同进场由set指令合并出场

Setbreakeven(profit)

当从指定的最大获利拉回至损益两平点时,平仓部分或所有仓位

setbreakeven_pt(amount)

不同于setbreakeven的地方是,是以跳数来代替金额进行计算

Setdollartrailing(profit)

当从仓位进场后的最大获利拉回到指定金额后,平仓部分或所有仓位

settrailingstop_pt(amount)

当获利从最大的获利回撤指定的跳数后,则平仓部分或所有仓位

Setpercenttrailing(profit,Percent)

当达到指定的获利金额后,若从最大获利拉回特定的百分比后,平仓部分或所有仓位

setpercenttrailing_pt(amount,percent)

当达到指定的获利跳数后,若从最大获利回撤了指定的百分比,则平仓部分或所有仓位

Setprofittarget(profit)

当从仓位进场后的最大获利达到特定金额时,平仓部分或所有仓位

setprofittarget_pt(amount)

当获利达到指定的获利跳数后,则平仓部分或所有仓位

Setstoploss(loss)

当损失达到指定金额时,平仓部分或全部的仓位

setstoploss_pt(amount)

当亏损达到指定的亏损跳数后,则平仓部分或所有仓位

setexitonclose

交易时段最后一根bar发送市价全部平仓


论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
 
期货论坛 - 版权/免责声明   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

一、信号计算优先级

1、访问未来数据

     MC可以访问历史数据和当根bar的数据,不可以访问未来数据,但是可以访问下一根bar的 Open、Date、Time、DateTime和Time_s数据;举例,当我们需要访问收盘价Close的前第3根bar的数据时,使用语句Close 3 bar ago或者Close[3]来访问;访问当根bar的收盘价,直接使用Close关键字就可以了,后面不需要附带0 bar ago 或者[0]字样;当我们试图通过Close[-1]来访问未来第一根bar时,就会弹出“试图访问未来数据”提示窗口,但是并不能说完全不能访问未来数据,MC只可以在信号脚本中(不能使用在指标中,也不可以在函数中)访问Open、Date、Time、DateTime和Time_s关键字的下一根bar的数据,而且必须在关键字的后面加上next bar来访问,如通过 Open next bar 来访问下一根bar的开盘价,不能通过Open[-1]来访问。


2、信号脚本执行顺序

    当在一个图表上插入多个信号脚本时,信号脚本的执行顺序默认对应到它们在设置对象窗口信号栏位的排列顺序;图1中,test39排列在test40前面,所以信号test39的执行顺序也在test40前面;若test40排列在test39前面,那么信号test40的执行顺序就在test39的前面;排列顺序可以通过右侧的上移下移进行调整。如图1和图2所示,信号test39test40的上面,所以默认test39行执行,test40后执行,这个优先顺序可以在图2print输出语句中看出来,每一根bar的输出语句中,test39的输出语句总是在test40的输出语句前面;另一方面,由于在策略属性中限制了一笔进场,所以当在同一根bar上两个信号同时满足市价进场时,信号test39中的市价委托会执行。这是信号脚本的默认执行顺序,除此之外,信号脚本还有下面的特殊的执行顺序。


图1. 默认执行顺序(图表)


图2. 默认执行顺序(代码)

    如图3和图4所示,当信号脚本test39中有引用下一根bar的数据的语句时,如Open next bar语句时,那么信号实际执行的顺序是test40先执行,test39后执行,尽管信号test39排列在test40前面,在这种情况下,每一根bar上的输出语句中,test40的输出语句总是在test39的前面;另一方面,由于在策略属性中限制了一笔进场,所以当在同一根bar上两个信号同时满足市价进场时,信号test40中的市价委托会执行。这是信号脚本在特殊情况下的执行顺序。


图3. 特殊执行顺序(图表)


图4. 特殊执行顺序(代码)

注意事项:

Ø  当test39和test40信号中都有引用下一根bar的数据的语句存在时,信号的执行顺序默认按照它们的排列顺序,即test39先执行,test40后执行。

Ø  “存在引用下一根bar的数据的语句”这句话的意思是信号脚本中存在这个语句,例如,test39中的代码

//test39

if currentbar=146 then

    buy("test39") next bar at market;

if false then

   print("test39 "," currentbar=",currentbar," open nextbar=",open next bar);

尽管这个print语句中的内容不会执行(因为if的判断永远是false),但存在语句”open next bar”,所以即使test39排列在test40的前面,但是在执行的时候,会先执行test40,再执行test39,因为信号脚本中存在引用下一根bar的数据的语句。


3、最后一个有效和同时有效

      因为一个策略是由若干个信号脚本组成的,当然也可以将这些分开的信号组成编写成一个信号,但是这两种方式对set关键字的执行是有不同的影响的(当然一个策略分成不同的信号也有其它的一些用法,在此不再叙述),这里涉及两个问题:当同一个set关键字在同个信号中出现多次时,以哪一个有效还是同时有效;当同一个set关键字同时出现在不同信号中时,以哪一个有效还是同时有效。下面举例一个策略是由两个信号脚本组成的,这里以test39和test40两个信号为例,它们组成一个策略。


      当同一个出场set关键字在同一个信号中出现很多次时,最后一个有效;当同一个出场set关键字在不同信号中出现时,在两个信号中的关键字同时有效;当同一个出场set关键字在两个信号中出现多次时,每个信号中的最后一个关键字有效,这种情况只是前两种情况的合并;下面以关键字setprofittarget_pt举例阐述。如图5和图6所示,进场价是30020,这里通过关键字setprofittarget_pt指令设置了70、80、90跳(关于跳数可以看下文的minmove关键字)的止盈出场,而最后只有70跳和90跳的止盈出场指令有效,对应到图表上的价格分别为30090和30110。当然对于不同的出场set指令,它们是同时有效的,例如,同个信号或不同信号中同时存在setprofitarget和setprofittarget_pt时,那么它们会同时有效。


图5. 有效性(图表)


图6. 有效性(代码)

    对于setstopcontractsetstopposition两个关键字,和上面有一点区别;当这两个关键字在同一个信号中出现多次时,以最后一个关键字有效;当这两个关键字在两个信号中都出现时,以最后一个执行的信号中的最后一个关键字有效。


图7. setstopcontract有效

图8. setstopposition有效

      如图7所示,信号test39先执行,test40后执行,所以test40信号中的setstopcontract关键字有效,它的作用是使出场类set指令针对每一笔进场分别出场;这里通过setprofittarget_pt关键字设置了20跳的止盈,也就是说每一笔进场达到20跳的止盈就会平仓出场;这里”test39”和”test40”的进场价分别为3712和3692,所以分别在3732和3712的价格出场,互不干扰。

      如图8所示,这两个关键字都在test39这个信号脚本中,所以最后一个有效,即setstopposition关键字有效,它的作用是使出场类set指令针对所有的进场合并出场;这里通过setprofittarget_pt关键字设置了15跳的止盈,也就是在平均进场价格的基础上15跳时一起出场。这里大家只需要简单的了解setprofittarget_pt的功能,以此来了解setstopcontract和setstopposition的有效性即可,下文会详细介绍。


二、与IF判断语句结合使用

1、关键字setpercenttrailing

      当进场的盈利到达设置的profit金额之后,并且从最大获利回撤percent比例之后,以stop停损单平仓部分或所有仓位;这里的“平仓部分”是由关键字setstopconract限定的,“平仓所有仓位”是由关键字setstopposition限定的,这里为方便叙述,只考虑一笔进场(手数为1,进场名称为”test39”,商品名称为螺纹),这种情况下setstopconract和setstopposition效果是一样的。这个关键字需要两个步骤,首先盈利到达profit,才可以触发stop停损出场单,这个停损单的价格是通过最大获利回撤percent百分比计算出来的,举例,”test39”的1手买入进场价格是3780,profit参数设置为160金额,percent参数设置为50,那么当市价到达3796时就会触发停损单,此时停损单的价格是3788(螺纹的整点价值是10,即每波动一个整点值,1手盈亏波动10元金额),这个停损单的价格会根据从进场以来的最大获利实时转换成相应的价格(不需要等到每根bar收盘时,这个停损单会在bar的形成过程中根据最大获利实时调整价格),当市价接着下降到3790时(从进场以来的最大获利仍然是160元),此时停损单的价格是3788,接着市价上升到3882,此时停损单的价格是3791。


2、标准使用情境

var:
profit(160
),
percent(50);

if
condition1
then setpercenttrailing(profit,percent);

      将setpercenttrailing关键字嵌套上if判断语句中,并且使用变量作为参数是它的标准使用情境,其它使用情境都是标准使用情境的特殊情况,例如不使用变量作为参数、不嵌套if判断语句。实际上,MC是每根bar上判断一次condition1条件是否满足,若满足则在下一根bar上执行setpercenttrailing指令;若condition1条件不满足,则在下一根bar上不执行setpercenttrailing指令(当然,这里仅考虑未开启bar内模式下,因为在开启bar内模式下使用set关键字的作用不大);举例,在编号为10的bar上收盘时信号计算一次,condition1条件满足,那么在编号为11的bar上执行setpercenttrailing指令,当在编号为11的bar的形成过程中有一笔买入进场,进场价格为3712,并且价格一直上升使盈利达到profit金额,此时会在编号为11的bar还没有收盘前就触发了停损单,而一切的过程并不需要等到编号为11的bar收盘计算时再判断,setpercenttrailing会在编号为11的bar的bar内实时执行出场功能;接着,若在编号为11的bar的收盘时信号进行计算,condition1的条件不再满足,那么前面已经触发的停损单会被取消,因为在编号为12的bar上不再执行setpercenttrailing指令。


      对于参数profit和percent为变量的情况,信号基于每根bar收盘时进行计算,变量会更新,若关键字setpercenttrailing关键字后面的两个参数的值变化了,也就是与之前不一样了,那么setpercenttrailing指令需要重新通过市场触发停损单(也就是说之前即使已经触发了停损单,会在参数变化之后,停损单被删除,setpercenttrailing指令会重新通过之后的市场价格判断是否触发停损单),关于“重新通过市场触发停损单”这个概念,我们将在下面的代码和图表的例子(代码1、图9,代码2、图10)对比中进行直观的解释。代码1和代码2唯一的不同就是代码2更改了参数变量profit的值(由310减小到300),其它没有变化,而图9是基于代码1的图表,图10是基于代码2的图表,两个图表都是1分钟周期的螺纹合约。图表在9:31分钟的bar上以4021的价格买入了1手螺纹,当市价到达4052及以上的价格时,该笔进场的盈利才能到达310元及以上((4052-4021)*10),所以图9中setpercenttrailing指令会在9:58的bar上触发到盈利额310(即价格到达4052),然后setpercenttrailing会委托停损单(停损单的价格是从触发之后的最大盈利回撤50%计算到的价格,对于最高价4052的50%的回撤价格是4036),随后当价格回撤到4036时停损单成交;但是,当我们10:09分钟的bar上将代码2中加入红色标记的代码时(即将变量profit的值由310减少到300时),setpercenttrailing会将之前的停损单删除,然后从10:09分钟之后重新根据市场判断当前价格是否触及到profit盈利金额(10:09分钟之前是否出现过盈利金额到达300以上的价格,setpercenttrailing指令不管了,它只会判断后面的市场是否会出现盈利金额到达300以上的价格),所以如图10所示,13:31的bar使盈利金额到达了300元及以上(即13:31的bar上出现了价格4051及以上的价格,使盈利金额达到300以上),从而使setpercenttrailing指令重新触发了停损单(停损单的价格根据10:09之后出现的最大盈利金额回撤50%计算到的价格,此时停损单的价格是4021+(4055-4021)*50%=4038),最后价格下降到4038时,4038的停损单成交了。小结一下,“if condition1 then setpercenttrailing(profit,percent);”这个是标准使用情境,当condition1条件、profit、percent三个变量中有一个变量变得和之前不一样了,那么setpercenttrailing指令会从当前变化的时间点(比如是在10:09分钟变化的)重新通过市场触发停损单,也就是setpercenttrailing会删除10:09分钟之前的已经触发的停损单,会根据10:09分钟之后根据市场价格判断盈利金额是否到达profit金额,若到达了则会委托停损单(停损单的价格会根据10:09分钟之后的最大盈利金额回撤percent比例计算得到的)。


//代码1

var: profit(310), percent(50);

if date=1180301 and time=930 then

buy next bar at market;

condition1=true;

if condition1 then setpercenttrailing(profit,percent);



图9. 代码1


//代码2

var: profit(310), percent(50);

if date=1180301 and time=930 then

buy next bar at market;

condition1=true;

if date=1180301 and time=1009 then

profit=300;

if condition1 then setpercenttrailing(profit,percent);



图10. 代码2



3、关键字setstopcontract和setstopposition

      关键字setstopcontract的作用是使出场类set指令针对每一笔进场单独出场,而关键字setstopposition的作用是使出场类set指令针对所有进场合并一起出场,而当既没有在信号中声明setstopcontract,也没有声明setstopposition的情况下,默认是setstopposition的功能有效,即默认是出场类set指令针对所有进场合并一起出场。这两个关键字也可以与IF判断语句一起使用,它的效果可以两个关键字的功能互相切换,但是从setstopcontract切换到setstopposition或者从setstopposition切换到setstopcontract都会使setpercenttrailing指令重新触发停损单,例如下面的代码可以达到两个关键字的相互切换:


if currentbar<=600 then

   setstopposition

else setstopcontract;

setpercenttrailing(200,50);

    也就是在编号为601bar之前都是执行setstopposition的功能,而从编号为601bar之后都是执行setstopcontract的功能,那么从编号为601bar收盘之后setpercenttrailing指令的执行需要重新触发停损单(这个概念见上面的例子)。


三、其它使用情况

1、关键字bigpointvalue、minmove、point、pricescale和pointvalue

    这5个关键字分别用于返回商品合约的整点价值、最小波动、价格精度、价格精度的倒数、1价格精度的价值,前面3个关键字是取报价管理器中的设定值,后面2个关键字的返回值是根据前3个关键字进行简单运算得到的。下面举沪深300期货为例对这5个关键字进行阐述。

图11. 价格精度、最小波动、整点价值

      如图11是point(这个关键字在使用时前面需要有数字,例如2 point,否则会报错)、minmove、bigpointvalue这3个关键字在报价管理器中的设定值,第三步需要选中再右键“编辑商品”,然后可以在“设置”栏位进行查看,若需要更改这3个值可以在商品源中进行更改,不过更改是没有必要的,因为这些设置值默认情况下都是正确的。


      沪深300期货的价格精确到小数点后面一位,例如,4235.6,那么该商品合约的价格精度point就是0.1(即1/10),而相邻两个价格之间最小距离是0.2,它是价格精度的2倍,所以该商品合约的最小波动minmove就是2;整点价值就是持仓1手价格波动一个整点的盈亏金额,即300,bigpointvalue整点价值的这个解释可以应用于所有商品合约,同时300也对应到沪深300期货的合约乘数。价格精度的倒数pricescale等于1/point,在这里就等于10,1价格精度的价值pointvalue等于bigpointvalue与1 point的乘数,在这里就等于30;这5个关键字在其它商品合约上的返回值可以通过这个例子进行类推。


2、关键字commission和slippage

图12. 手续费和滑价

    关键字slippage返回策略属性中的滑价值,这个关键字的返回值和后面的选项“每笔交易”和“每股/每手”没有关键,只会取圈出来的数值,在这里是20;若手续费是固定金额,关键字commission返回设置的固定金额,若手续费是百分比例,那么该关键字返回百分比例,在这里返回的是0.011,忽略了后面的百分号。尽管关键字slippagecommision的返回值不考虑其它的选项(比如,每笔还是每手等等设定情境),但是计算盈亏的关键字,如netprofit在计算的时候会将这些选项考虑在内。


3、手续费和滑价

      set关键字考虑手续费和滑价的情况,以前的版本支持,目前MC8.8、MC8s和MCpro版本中的set系列关键字都不支持手续费和滑价,也就是说策略属性中的手续费和滑价设置对set指令的委托单价格没有任何影响;关于目前公式编译器中帮助说明中关于set关键字考虑手续费和滑价的情况,这个会在后期更改去除,与目前实际情况同步。

我们可以在set出场类关键字的参数中使用关键字commission和slippage(这两个关键字都是取策略属性中的设定值),以此使set类指令的委托单价格中考虑手续费和滑价,代码如:setprofittarget(200+commission+slippage);


4、Setprofittarget和setprofittarget_pt的区别

      出场类set关键字有两类,一类是通过金额进行止损止盈出场(例如,setprofittarget关键字),另一类是通过跳数进行止损止盈出场(例如,setprofittarget_pt关键字),这两类的区别在于后面是否有”_pt”后缀(这类关键字MC8s不支持,MCpro版本支持)。当然我们可以通过关键字bigpointvalue、point、minmove将金额与跳数进行相互转换,但是这两类关键字还有一个区别在于,基于跳数出场的set关键字是基于平均价计算的跳数而不是基于金额转换的跳数。关于这两类的区别,在这里我们以setprofittarget和setprofittarget_pt为例进行阐述,其它的关键字以此类推。


图13. setprofittarget

图14. setprofittarget_pt

      如图13和图14所示,两个图中的进场都是一样的,但是使用了不同的set指令进行出场并且都是合并出场(默认都是合并出场),”first”和”second”的进场价格分别为3780和3784,每笔进场的手数都是2手。图13中,setprofittarget关键字参数中设置值是400,也就是所有进场的总的盈利达到400金额时,合并限价出场(出场手数这里是4手);出场价格是3792,即2*(3792-3780)*bigpointvalue*minmove*1 point+2*(3792-3784)*bigpointvalue*minmove*1point=400,这里通过关键字bigpointvalue、minmove和point(这里使用的是商品期货螺纹,所以它们对应的取值分别为10、1、1)将价格波动转换成盈亏金额刚才等于400,也就是在3792价格出场刚才满足盈利400出场的要求。图14中,setprofittarget_pt关键字参数中设置值是20,也就是所有进场的平均价格向上20跳时,合并限价出场;两笔进场的平均价格是(3780*2+3784*2)/(2+2)等于3782,而3782加上20跳即3782+minmove*20 point等于3802,也就是实际的出场价格。


5、AA模式、假回报和策略部位

      对于AA模式和假回报,这里不深入叙述,只是因为Set关键字会涉及到,所以为方便系统的阐述set系列关键字,所以在这里只是简单叙述。


      我将MC中进出场、委托单成交等信息分为三类,分别为图表部位、策略部位和经纪商部分,对于显示在图表上的进出场、委托单成交、盈亏等信息,归为图表部位,这部分信息可以在图表上直接看到或者统计出来;对于显示在经纪商处,也就是实际在交易所(或模拟交易所)成交、盈亏等信息,归为经纪商部位,这部分信息可以在交易总管上查看,也可以在交易追踪器的“持仓”栏位和“账户”栏位查看;对于显示在交易追踪器“委托”栏位和“策略部位”栏位中的策略部位信息、初始留仓信息,归为策略部位;图15中,编号为1的都是策略部位的信息,编号为2的都是经纪商部位的信息。


图15. 交易追踪器

      在SA模式下,图表部位和策略部位是一致的;在真回报下,策略部位和经纪商部位是一致。而AA模式使图表部位和策略部位相独立,而假回报使策略部位和经纪商部位相独立。简单理解但是不严格准确的话来区分三者就是,图表部位只是信息进出场等信息显示在图表上(和回测时一样),而策略部位管理是否发送委托单,经纪商部位记录真实成交情况;AA模式下,图表上有持仓,但是策略没有持仓,那么即使出现平仓信号策略也不会发送委托单到交易所;真回报下,策略发送委托单,MC识别该笔委托是否成交是依据交易所返回的成交信息(包括是否成交、成交价格、成交手数等信息),所以在没有接收到交易所的成交信息之前,MC并不识别该笔委托单已经成交;而假回报下,策略发送委托单,MC立即识别该笔委托单已经成交(关于成交价格、成交手数等信息,MC有自己的逻辑)而并不依据交易所返回的成交信息。


      好了,说了这么多,有点偏题了,总而言之,在假回报下,图表上依然有set指令的出场显示信息,但是这些信息属于图表部位的,和策略部位没有关系,也就是说,图表上有一笔1手净多头持仓,而策略部位没有持仓,此时set指令会在图表上止盈止损价格上显示出场信息,但是由于策略部位没有持仓,所以set指令并不会发送委托单到交易所;但是若策略部位有持仓,那么set指令不仅在图表上显示set止盈止损出场信息,也会发送出场委托单到交易所,但是图表部位上的显示和直接发送到交易所的委托单依然在AA模式下是独立的。那么在假回报下,在编号为10的bar的形成过程中有一笔委托单(进场名称为”test39”)发送到交易所,由于是假回报,所以这笔委托单会立即识别为成交(可以在交易追踪器的“委托”栏位查看到“已成交”),set指令会依据识别到的进场委托单成交信息做出反应(例如使用的是setprofittarget指令),发送限价止盈单到交易所,但实际上该笔进场委托单”test39”可能在交易所并没有成交,但量set指令已经做出反应并且发送了止盈限价单到交易所了。


6、回测

      关于set指令在回测中的情况,之前已经写过一篇帖子了,论坛链接http://forums.icetech.com.cn/forum.php?mod=viewthread&tid=3371&extra=page%3D1,帖子名称为“MC回测逻辑及条件单(包括set关键字)的执行逻辑”所以在此不再赘述。


四、总结

1、关键字setbreakeven和setbreakeven_pt

      当从指定的获利金额回撤损益两平(即盈利和亏损都是0)时Setbreakeven指令通过停损stop单平仓部分或所有仓位;整个过程需要当前市场价格触及到指定的获利金额,以此来触发停损单;例如,setbreakeven(100),当在编号为10的bar收盘后委托一笔1手买入进场螺纹,进场价格为3712,那么setbreakeven指令(这里假设该关键字没有和IF结合使用)会在下一根bar的形成过程中就有效(即编号为11的bar),当后续的市场价格触及到3782(即盈利100),此时触发停损出场单,停损单的价格为3712(即损益两平)。当然setbreakeven可以和IF结合使用,也可以使用变量作为参数,但是一旦IF判断语句的条件变化或者参数变量变化或者setstopcontract和setstopposition相互切换,那么setbreakeven指令就需要重新通过市场触及指定的盈利金额,以此重新触发停损单,这点和前面介绍的setpercenttrailing关键字是相同的;进一步说,set关键字的功能前面已经全部叙述了,唯一不同的只是不同set关键字的定义不同,有的是执行损益两平,有的是止盈,有的是止损,有的追踪止损等等。


      关键字setbreakeven_pt的用法可以参考setbreakeven关键字,这两个关键字之间的区别可以参考Setprofittarget和setprofittarget_pt的区别。


2、关键字setdollartrailing和settrailingstop_pt

      当从最大获利回撤指定的金额后,setdollartrailing指令通过停损stop单平仓部分或所有仓位;setdollartrailing指令会根据最大获利实时调整停损stop单的价格,这个调整并不需要等到bar收盘时再调整。例如,setdollartrailing(100),当在编号为10的bar收盘后委托一笔1手买入进场螺纹,进场价格为3712,那么setdollartrailing指令(这里假设该关键字没有和IF结合使用)会在下一根bar开始时就发送停损stop单,这个停损单的价格会根据当前最大获利金额实时进行调整,这个调整并不需要等到bar的收盘时;进一步,当价格实时一直上升到3800,那么这个停损单的价格就是3790(螺纹的整点价值是10),当价格接着下降到3795时,这个停损单的价格还是3790,因为是从最大获利回撤100金额;当价格进一步上升到3810时,此时对应的停损单的价格是3800。


      当然setdollartrailing可以和IF语句结合使用,也可以使用变量作为参数,但是一旦IF判断语句的条件变化或者参数变量变化或者setstopcontract和setstopposition相互切换,那么setdollartrailing指令就需要重新通过市场计算最大获利(就是从setdollartrailing指令重新有效的那个时间点开始统计最大获利,因为它对历史没有记录也没有记忆性),这点和前面介绍的setpercenttrailing关键字是类似的。


      Settrailingstop_pt指令的用法可以参考setdollartrailing的用法,而这两个关键字的区别可以参考Setprofittarget和setprofittarget_pt的区别。


3、关键字setpercenttrailing和setpercenttrailing_pt

      关键字setpercenttrailing用法前面已经介绍了,这里不再赘述;关键字setpercenttrailing_pt的用法可以参考setpercenttrailing,而这两个关键字的区别可以参考Setprofittarget和setprofittarget_pt的区别。


4、关键字setprofittarget和setprofittarget_pt

      当盈利到达指定的金额时,setprofittarget指令通过限价平仓部分或平仓所有仓位,这个关键字的功能相对比较简单。举例,setprofittarget(100),在编号为10的bar收盘后委托买入一笔1手螺纹,成交价格为3712,那么setprofittarget指令(假设这里没有和IF结合使用)在下一根bar开始时就会发送一笔限价出场单,限价单的价格是3722,这个限价是不变的,等待市场触及成交;进一步,假设(同时假设使用的是setstopposition合并出场)在编号为13的bar收盘时委托买入一笔螺纹,成交价格也是3710,并且之前的3722的限价单还没有成交,那么当第二笔买入进场成交时,setprofittarget指令会实时撤销之前的限价单,重新发送一笔限价出场单,限价单的价格是3716,这种情况对其它set出场类关键字也是一样的,set指令合并出场会受中途进场和出场的影响重新发送委托单。除此之外,该关键字也可以和IF结合使用,也可以使用变量作为参数,但是一旦IF判断语句的条件变化或者参数变量变化或者setstopcontract和setstopposition相互切换,那么setprofittarget指令会重新发送限价委托单。


      Setprofittarget_pt关键字的用法请参考setprofittarget关键字,两者的区别前面已经叙述过了。


5、关键字setstoploss和setstoploss_pt

      当损失到达指定金额时,setstoploss指令会平仓部分或全部仓位,这个关键字的功能也很简单;setstoploss和setstoploss_pt这两个关键字可以参考setprofittarget和setprofittarget_pt的用法,前者是止损(停损单),后者是止盈(限价单),其它地方没有区别。


6、关键字setexitonclose

      这个关键字的作用是将持仓在交易时段的最后一根bar的收盘tick结束市价平掉所有仓位;关于什么是交易时段的最后一根bar,关键字sessionlastbar返回true的那根bar即是交易时段的最后一根bar,这部分内容可以查看论坛帖子“OpenD、HighD、LowD和CloseD系列函数”http://forums.icetech.com.cn/forum.php?mod=viewthread&tid=3155&extra=page%3D1,关于收盘tick的定义可以看论坛帖子“This bar和next bar的区别”http://forums.icetech.com.cn/forum.php?mod=viewthread&tid=3314&extra=page%3D2


    这个关键字可以用于回测,但是不能用于实盘,这是因为它需要根据最后一根bar的收盘tick来发送平仓委托单,而收盘tick(即barstatus关键字返回值为2tick)是通过下一根bar的开盘tick来确认的,也就是当根bar的收盘tick和下一根bar的开盘tick是同时确认的,而最关键的是,交易时段的最后一根bar结束之后,下一根bar需要等到交易所开盘才可以接收到,但是MC5分钟内接收不到下一根bartick,也会认识当根bar结束,也就是确认当根bar的收盘tick,但是5分钟之后发送平仓委托单,交易所还没有开盘,那么发送的委托单就会被拒绝,详细的可以看上面的帖子。

关于这个帖子的直播课程,请看策略星学院视频链接http://school.algostars.com.cn/course/content?id=942

如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

TOP

返回列表