在官网的TB语言编程文档的264页里面,有个案例三:加仓减仓。里面的这段代码,我有点弄不明白:
While(CurrentEntries < 4 && High >= LastPrice + AddSet*MinPoint) // 加仓
{ LastPrice = LastPrice + AddSet*MinPoint; If(Open > LastPrice) LastPrice = Open; Buy(1,LastPrice); }
上面这个加仓的代码,用的是Lastprice即最后一次开仓的价格作为基准点,实现加仓,我可以理解。但是下面减仓的这段代码用的是Firstprice即第一次的开仓价格,我就有点不明白了,
While(CurrentEntries > 0 && Low <= FirstPrice - SubSet*MinPoint) // 减仓
{ FirstPrice = FirstPrice - SubSet*MinPoint; If(Open < FirstPrice) FirstPrice = Open; Sell(1,FirstPrice); }
减仓时,难道不是以最后一次的开仓价格为基准点吗?怎么是以第一次的开仓价格作为基准点呢?求解答,谢谢
楼主的思路我理解应该是属于前面一个案例,也就是案例二的跟踪止盈止损的思路,一直跟踪一波单边趋势的浮盈,一旦趋势反向回撤规定跳数则止盈止损1手,趋势后期分批止盈保住利润。案例三的加仓减仓的仓位管理,如果趋势判断对了就加仓,如果判断错了就减仓,我觉得适用于趋势初期不明朗的试错阶段。所以案例三与案例二(或 案例一)可以组合使用。
但是这个案例三里面,因为使用了While结构引起了我的注意,如果一根历史Bar振幅很大High(Low)跨越2次加仓(减仓)幅度,那么While就会执行2遍Buy(Sell)函数,不知道TB内部机制在CurrentEntries的返回值是否在随While的2次循环,在一个OnBar事件域中2次Buy(Sell)函数的执行而联动变化。我猜想想这里之所以使用While而不使用If判断应该是考虑了单根Bar振幅太大的原因。
另外,如果是盘中的OnBar应该很难在一次tick中使得High(Low)一下子跳跃2个以上的加仓(减仓)间隔,但是LastPrice(FirstPrice)是序列类型变量,因此盘中每次tick,初始值都会继承前一根Bar的值,导致执行while时,循环条件又被满足执行,我不确定TB内部机制是不是不允许同根Bar多次同方向开仓?这个问题对历史Bar也同样存在。
案例三变量命名的歧义问题,LastPrice(FirstPrice)在执行加减仓的While结构内部实际是不断抬高(抬低),实际上作为下一次加减仓的价格基准来使用的,而不是所谓的第一次开仓价,最后一次开仓价格,改成AddPosPriceBase(SubPosPriceBase)更好。
总结一下,一是这里使用While存在问题,二是变量命名与实际业务逻辑不符。
减仓时,难道不是以最后一次的开仓价格为基准点吗?怎么是以第一次的开仓价格作为基准点呢?求解答,谢谢
这个是你的思路,案例的思路就是,比如开仓价格1000点,从1000开始,每涨20个点,加仓一手,没减20个点,减仓一手
也就是涨到1020,会加仓一手,跌到980,减仓一手。
如果你想动态更新基准价格,那first换成last就行了
没有对错,就是思路不同