量化投资_EasyLanguage/PowerLanguage教学课程__【第二篇专题】__【第十六章关于编写bar内交易的小技巧】

第十六章:关于编写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/

posted @ 2020-09-23 18:27  时海涛|Thomas  阅读(526)  评论(0编辑  收藏  举报