非bar内模式(默认情况下,信号的执行都是非bar内模式)下,信号脚本是在每根bar收盘时(即 barstatus关键字返回2时)计算一次,若委托单条件成立就会发送委托单,即只可能在收盘时发送委托单;而bar内模式下,信号脚本会在接收到每笔tick时计算一次,若委托单条件成立就会发送委托单(this bar指令只会在收盘时发送委托单,关于this bar和next bar的区别请见下面的帖子,会有详细的阐述https://www.multicharts.cn/post?idno=153,即可以bar内发送委托单。一句话概括,bar内模式的作用就是允许在bar的形成过程中发送委托单,为方便下面的叙述,全文以1分钟周期bar为例进行阐述,以其它周期bar逻辑相同。
精细资料的作用对于实时行情没有影响,它的作用是为回测提供精细的资料,使回测更加准确、更加接近实盘行情;开启精细资料和关闭精细资料,最大的区别在于回测时bar内模式和精细资料联系很紧密,两者的结合经常使问题复杂化,但是其实这两个概念是独立的,可以分开理解,bar内发送委托单,而开启精细资料是使当根tick数据一致)。为方便叙述,全文中开启精细资料是指勾选图1笔,图1中其它选项暂时不考虑。
图1. 精细资料
限价单是以指定价格或者更有利的价格成交,而停损单是以指定价格或者更不利的价格成交(stop单会在触价时立即成交);现在举4个委托单作为例子(假设下一根bar的开盘价为47.40,并且未开启bar内模式),"buy("first") next bar at 47.30 limit;"、"buy("second") next bar at 47.50 limit;"、"buy("third")next bar at 47.30 stop;"、"buy("fourth") next bar at 47.50 stop;",那么”second"和“third"这两笔委托单会立即以市价成交,而"first"这笔限价委托会等到行情下跌到47.40或以下时才会成交,而”fourth”这笔停损委托单会等到行情上涨到47.50或以上时才会成交。
stoplimit停损限价单实际上是停损单和限价单的组合,当停损单触价之后再执行限价单,原理其实可以参考前一部分的说明,它只是将两个委托单组合起来罢,有先后执行顺序;举例(假设下一根bar的开盘价为47.40),”buy next bar at 47.30 stop 47.50 limit;",那么这个委托单的停损单会立即被触价,然后47.50的限价接着也被立即触价,最后实际上是以市价成交的(停损限价单在图表上一直是以停损价显示价格的,直到最后成交之后才会以成交价显示价位)。
为方便阐述下面的内容及它们之间的区别,本文以stoplimit停损限价单为例进行举例测试,并且附带截图。
这种情况下,信号脚本会在每根 bar收盘时计算一次,若条件满足则发送委托单(为方便叙述,全文假设委托单都是stoplimit停损限价单,其它条件单的成交遵循类似的逻辑),那么stoplimit停损限价单在下一根bar又是如何成交的,实际上委托单在下一根bar上根据bar内价格走势成交。
关闭bar内模式并且关闭精细资料,bar内价格走势会因为开盘价与最高价、最低价的距离远近而不同;当开盘价与最高价更近时,bar内价格走势为开盘价—最高价—最低价—收盘价,并且MC会认为相邻两个价格之间的价格也存在(也就是说委托单可以成交在相邻两个价格之间的某个价格),如图2所示;当开盘价与最低价更近时,或者开盘价处在最高价与最低价正中间时,bar内价格走势为开盘价—最低价—最高价—收盘价,并且MC会认为相邻两个价格之间的价格也存在(也就是说委托单可以成交在相邻两个价格之间的某个价格),如图2所示。
图2. bar内价格走势(关闭精细资料)
图3. 关闭bar内,关闭精细资料
如图3所示,在date=1240529 and time = 2125 的bar收盘时发送stoplimit停损限价单,而date=1240529 and time = 2126 的bar的开高低收4个价格分别为3791、3808、3790、3802,由于开盘价离最低价更近,所以bar内价格走势为“开盘价→最低价→最高价→收盘价”;进一步,bar内价格从开盘价运行到最低价时,没有触价3808的停损价;bar内价格从最低价运行到最高价过程中,3808的停损价被触价了,但是由于从3808到最高价中并没有包含3802的限价,所以在这个过程中3802没有被触价;bar内价格从最高价运行到收盘价过程中,3802的限价被触价了,最终停损限价委托单成交了。但是,对于委托单“buy next bar at 3809 stop 3802 limit;”或者“buy next bar at 3808 stop 3801 limit;”,这两种情况下的停损限价单都成交不了,对于原因,可以根据上面的过程进行演示,很简单。
在开启bar内模式并且关闭精细资料情况下,每根bar会计算4次,MC会认为每根bar有4笔tick数据,分别是开盘tick、最高价tick、最低价tick和收盘tick,信号脚本会在每笔tick上执行一次计算,若条件满足则发送委托单;对于这4笔tick的计算顺序,会根据开盘价与最高价、最低价的距离远近来判断;当开盘价与最高价更近时,4笔tick的计算顺序依次为开盘tick、最高价tick、最低价tick、收盘tick;当开盘价与最低价更近时,或者开盘价处在最高价与最低价正中间时,4笔tick的计算顺序依次为开盘tick、最低价tick、最高价tick、收盘tick; bar内价格的走势和上一章节一样,这是因为开启bar内模式并不影响bar内价格走势,bar内价格走势是由是否开启精细资料决定的。
图4. 开启bar内,关闭精细资料
如图4所示,date=1240529 and time=2126的bar的开高低收4个价格分别为3791、3808、3790、3802,由于开盘价离最低价更近,所以 bar内价格走势为开盘价(3791)—最低价(3790)—最高价(3808)—收盘价(3802)。由于开启bar内模式,所以信号脚本会依次在date=1240529 and time=2126的bar开盘tick、最低价tick、最高价tick、收盘tick执行一次计算;当在开盘tick(价格为3791)上计算时,发送3806的买入停损单,但是bar内价格从开盘价运行到最低价过程中,没有成交;当在最低价tick上计算时,并且发送3806的停损单,bar内价格从最低价运行到3805过程中(最低价到最高价中间)并没有触价3806的停损单,而运行到3806时将停损单成交,接着运行到最高价;当在最高价tick上计算时,并且发送3808的停损单,会在最高价处触价成交(由于这里我们只允许每根bar上最多一笔成交,所以这里实际上不再成交);当在收盘价tick上计算时,并且发送3806的停损单,这笔停损单只会根据下一根bar的开盘价进行判断。
在开启bar内模式并且开启精细资料情况下,信号脚本会根据每笔tick计算一次,若条件满足则发送委托单。
图5. 开启bar内,开启精细资料
如图5所示,date=1240529 and time=2126的bar的所有tick资料都输出到面板(打印出来的价格顺序分别是:3791、3791、3790、3791、3792、3791、3792、3792、3792、3793、3794、3794、3795、3795、3795、3796、3796、3797、3798、3798、3799、3798、3798、3800、3799、3800、3801、3800、3801、3800、3800、3799、3799、3799、3800、3799、3799、3798、3798、3797、3796、3797、3797、3796、3797、3797、3797、3797、3797、3796、3797、3797、3798、3797、3797、3796、3797、3798、3797、3798、3797、3797、3798、3798、3798、3798、3798、3799、3800、3800、3800、3800、3801、3801、3802、3802、3803、3803、3804、3805、3806、3807、3806、3807、3807、3808、3807、3807、3807、3807、3806、3806、3806、3806、3806、3804、3804、3804、3804、3804、3805、3805、3805、3805、3804、3805、3805、3805、3806、3805、3805、3806、3804、3804、3805、3804、3804、3804、3803、3802、3802)。当bar内价格走势从3790上升到3808时,3807的停损价成交于3807(这里假设相邻两笔tick之间的价格存在(即委托单可以成交在相邻两笔tick之间),而bar内价格走势就是由每笔tick价格依次连接而成)。若这里发送的停损委托单的价格是3809,那么最终不会成交;若这里发送的买入停损委托单的价格是3790(或者更低的价格),那么会成交在开盘价3791,因为开盘价就触价。
关闭bar内模式并且开启精细资料,这种情况下,信号脚本会在每根bar收盘时计算一次,若条件满足则发送委托单;而由于开启了精细资料,所以bar内价格走势和第四章节“开启bar内模式,开启精细资料”是一致的。
图6. 关闭bar内模式,开启精细资料
如图6所示,信号脚本在date=1240529 and time=2125的bar收盘时计算一次,并且发送stoplimit停损限价单;首先在bar内价格运行过程中将3800的停损价触价(当价格从3790运行到3808时,关于更详细的bar价格走势,可以在开启bar内模式下输出到面板上),然后在后续的价格走势中又将3796触价(当价格从3800运行到3796时)。相比于第二章节“关闭bar内模式,关闭精细资料”,在未开启精细资料下“buy next bar at 3800 stop 3796 limit;”不会成交,因为两者的bar内价格走势不同。
Set系列关键字主要用于实时止盈止损,这里所说的“实时”指的是即使在未开启bar内模式下,set系列关键字也会在bar内对盈利和亏损进行实时判断并且实时出场,不会等到当根bar收盘才执行判断和出场。关于set系列关键字的定义和用途并不是本文的重点,本文主要是阐述set系列关键字在开启精细资料和关闭精细资料下的不同表现,为简单叙述,这里假设关闭bar内模式,这个假设不影响对下方的理解;这里主要以setprofittarget和setpercenttrailing两个关键字为例进行说明,其它关键字可以以此类推,原理相同,所以不再赘述。
Setprofittarget关键字类似于limit限价单,它只是对bar内价格走势进行实时追踪判断,若到达止盈点位,就执行限价单,唯一不同的是bar内价格走势的区别。Setpercenttrailing关键字也是对bar内价格走势进行实时追踪判断,与setprofittarget不同的是,setpercenttrailing会进行两次判断:一次是判断是否到达指定的获利金额;若判断满足了指定的获利金额之后,会进一步判断回撤百分比,当回撤百分比满足时会stop单出场。对于setpercenttrailing的二次实时追踪判断执行,与stoplimit相同;下面以一个例子来说明setpercenttrailing在开启精细资料和关闭精细资料下的不同表现。
如图7所示,市价单成交在date=1240529 and time=2126(开高低收分别为3791、3808、3790、3802)的bar的开盘价3791处;由于“setpercenttrailing(bigpointvalue*minmove*10 point,50);”需要首先实时判断是否满足10跳的盈利金额,很显然,最高价3808与3791的差是17跳,所以会在bar内价格运行过程中满足10跳的盈利条件;进一步,满足10跳的盈利金额之后,setpercenttrailing关键字会实时追踪判断从当前最大盈利回撤50%的条件是否满足,而17*0.5取整后等于8,也就是说当触及3799价格时就会stop停损单出场。然而在关闭精细资料情况下,不会在date=1240529 and time=2126的bar内触及3808之后再触及3799价格(当价格从3790(最低价)→3808(最高价)的过程中,满足setpercenttrailing最大利润的条件10跳,在从3808(最高价)→3802(收盘价)的过程中,未有触碰到3799的价格);但是可以开启精细资料情况下,如图8所示,多头持仓会在date=1240529 and time=2126的bar内先触及3801之后再触及3796价格出场(具体的bar内走势可以参看第四章节中打印的数值,在bar内价格达到3801的时候触发10跳的利润,回撤50%即回撤到3796的价格出场)。
图7. 关闭精细资料
图8. 开启精细资料
1、回放和回测时都是根据bar内价格走势进行成交的,但是这个bar内价格走势有一个地方不一样,就是连续还是间断:回测中,bar内价格走势是连续的,所以可以成交在指定的价格上;在回放中,bar内价格走势是间断的,所以只能成交在指定tick价格上。
2、未开精细资料的回测和as is回放(若图表是1分钟周期,那么就是逐分回放)是类似的,每根bar相当于有4笔tick,由开高低收4个价格组成的,它们出现的顺序,这个顺序的原理回测和回放是相同的(见上面的帖子),假设这里开盘价离最高价最近,那么4笔tick的顺序是开盘tick——最高价tick——最低价tick——收盘tick;对于回测来说,相邻两笔tick之间的价格是存在的,而对回放来说,相邻两笔tick之间的价格是不存在的,也就是说回放中只能成交在这4笔tick的价格上。
3、开精细资料的回测和逐笔回放是类似的,bar内价格走势是由实际的tick按顺序组合成的;对于回测来说,相邻两笔tick之间的价格是存在的,而对于回放来说,相邻两笔tick之间的价格是不存在的,也就是说回放中只能成交在tick价格上。
4、对于回放中的bar内价格走势,您可以通过开启bar内模式并且逐笔回放将当根bar内的tick资料输出出来进行验证;这个tick资料理论上是从报价管理器中是一致的,但是实际逐笔回放时并不会严格按照报价管理中存储的tick进行逐笔回放,回放中会忽略相同的tick价格,比如说,报价管理器中存储的tick价格依次是3787、3787、3789、3787,那么实际回放中使用的tick价格是3787、3789、3787,也就是回放中会忽略连续相同的tick资料。
© 2011-2023 MultiCharts All Rights Reserved.