第十六章:关于编写bar内交易的小技巧
前面讲过多次,在编写交易逻辑的时候需要先分析是否用到了bar内的数据,如果单纯的open价格买入,那只需要非bar内交易即可,如果你的代码遇到了盘中突破等bar内数据的话,就需要开启bar内交易。因此在遇到bar内交易的时候,我们首先想到的就是获取marketposition的bar持仓数据。如果我们只要求bar内只进行一次交易(一次平仓,一次出场)的话。我们需要用到Intrabarpersist这个复合数据类型。而且需要把marketposition持仓数据提取出来,因为marketposition本身是没有可回溯功能的。
因此有下面的代码,开启bar内运行market单。
示例代码1:双均线交叉,bar内模式
[IntrabarOrderGeneration=true] var:intrabarpersist mp0(0),ma0(0),ma1(0); mp0=marketposition; ma0 = Average(close,5); ma1 = Average(close,20); if mp0[1] <> 1 and ma0 > ma1 then buy 1 shares next bar at market; if mp0[1] <> -1 and ma0 < ma1 then sellshort 1 shares next bar at market; print(barstatus," time=",Time_,"markposition= ",marketposition, " markposition_mp0= ",mp0, "mp0[1]= ",mp0[1]);
//观察返回值(部分)
0.00 time= 940.00markposition= 0.00 markposition_mp0= 0.00 mp0[1]= 0.00 1.00 time= 940.00markposition= 1.00 markposition_mp0= 1.00 mp0[1]= 0.00 1.00 time= 940.00markposition= 1.00 markposition_mp0= 1.00 mp0[1]= 0.00 1.00 time= 940.00markposition= 1.00 markposition_mp0= 1.00 mp0[1]= 0.00 1.00 time= 940.00markposition= 1.00 markposition_mp0= 1.00 mp0[1]= 0.00 1.00 time= 940.00markposition= 1.00 markposition_mp0= 1.00 mp0[1]= 0.00 1.00 time= 940.00markposition= 1.00 markposition_mp0= 1.00 mp0[1]= 0.00 1.00 time= 940.00markposition= 1.00 markposition_mp0= 1.00 mp0[1]= 0.00 .....(省略) 1.00 time= 940.00markposition= 1.00 markposition_mp0= 1.00 mp0[1]= 0.00 1.00 time= 940.00markposition= 1.00 markposition_mp0= 1.00 mp0[1]= 0.00 2.00 time= 941.00markposition= 1.00 markposition_mp0= 1.00 mp0[1]= 0.00 0.00 time= 941.00markposition= 1.00 markposition_mp0= 1.00 mp0[1]= 1.00 1.00 time= 941.00markposition= 1.00 markposition_mp0= 1.00 mp0[1]= 1.00
【分析】
1、蓝色的两条数据分别表示在一个bar内交易是的bar的起点和bar的终点
2、在进行初次交易时,我们进行多单交易,此时mp0 = marketposition记录了持仓状态,mp0和marketposition为同步显示,表示意思是一样的
3、第一个红色的mp0[1]表示位置,此时用mp0去回溯上一个bar的持仓状态,此时为0,因为在图表开头,此时并没有marketposition的状态
4、第二个红色mp0[1]表示的位置,此时上一个bar结束,下一个bar开盘后,mp0去回溯删一个bar的状态,表示为持有了多头。
在这里我们充分运用到了复合数据类型Intrabarpersist它的bar内可以回溯上一个bar的信息。因此这里可以用于日内交易。如果我们采取想上一个bar的持仓状态(“委托判断条件”),去进行下一个bar的开仓要求(“委托单触发”)。
示例代码2:
[IntrabarOrderGeneration=true] var:intrabarpersist mp0(0),intrabarpersist mp1(0), intrabarpersist ma0(0), intrabarpersist ma1(0); mp1=marketposition; ma0 = Average(close,5); ma1 = Average(close,20); if mp1[1] <> 1 and ma0[1] > ma1[1] then buy 1 shares next bar at market; if mp1[1] = 1 and ma0[1] < ma1[1] then sell 1 shares next bar at market; if mp1[1] = 1 then sell 1 shares next bar at ma0[1] stop ;
【分析】:
1、如果需要定义一个变量在bar内进行变化的话,那么需要设置Intrabarpersist var0(0)这样一个变量去接收它,比如var0 = high;var0=average()等。
【备注】:子图不能实现bar内交易
=================================================
之前的文章感谢大家的转载,希望转载时请注明出处,本人转自其它网站的图表一并感谢,谢谢~!
https://www.cnblogs.com/noah0532/