问题:同根BAR,先止损,后触发开仓,实盘无法开仓。因为MarketPosition是先看上一根SAR最后的状态,然后是盘中,tick每次刷新,即便是已经止损了,本根bar应该先无持仓了。但因为TB机制,还是会先当运行中有持仓。故此,设置了一个MP(也相当认定是否有持仓)。但是实盘,还是一样止损后,再触发开仓条件,结果还是无法开仓
Params
//主体需要
Numeric Length(120);//ATR周期
Numeric baifenbi(61.8);//百分比
Numeric KaiGuan(1); //平仓开关,1=不过夜,0=过夜
Vars
//主体需要
NumericSeries ATR15M;//15分钟周期ATR
NumericSeries Close1;//通道中轨,这里当成昨日收盘价,以此作为止损
NumericSeries UpperAvg;//通道上轨
NumericSeries LowerAvg;//通道下轨
Numeric TradeCloseTime(144500);//平仓时间
Numeric MinPoint; //一跳
NumericSeries MP;//设置持仓状态
Begin
ATR15M=AvgTrueRange(Length);//15分钟周期ATR
Close1=CloseD(1);//定义昨天的收盘价,这里也当通道中轨,作为止损
UpperAvg=Close1+(ATR15M*baifenbi/100);
LowerAvg=Close1-(ATR15M*baifenbi/100);
PlotNumeric("Close1",Close1);//通道中轨,这里是昨天白天收盘价
PlotNumeric("lineup",UpperAvg);//通道上轨,昨天收盘价+ATR*0.382
PlotNumeric("linelow",LowerAvg);//通道上轨,昨天收盘价-ATR*0.382
MinPoint = MinMove*PriceScale; //1跳
// 集合竞价和小节休息过滤
If(!CallAuctionFilter()) Return;
//先设置个前置的截止时间,时间逻辑
If(Time>=TradeCloseTime*0.000001 And Time<=0.153000 And KaiGuan == 1)//超过下午截止时间,平仓
{
Sell(0,Open);
MP=0;
// BuyToCover(0,Open);
}
Else //截止时间以外的操作
{
//多头进场
If(MP == 0 And High > UpperAvg)//当无持仓,大于上轨,这里防止跳空,进行max开仓与上轨进行比较
{
Buy(0,Max(Open,UpperAvg+MinPoint));
MP=1;
}
//多头出场 And High<=UpperAvg
If(Mp[1] == 1 And Low[1] < Close1 AND Close[1] <= UpperAvg[1] And High<=UpperAvg)//如果有持仓,价格小于昨天收盘价平仓
{
Sell(0,Min(Open,Close1-MinPoint));
MP=0;
}
}
Commentary("上根bar持仓: "+Text(MP[1]));
Commentary("本根bar持仓: "+Text(MP));
End
你说的不对
只用程序运行完相关平仓语句,marketposition就会立即刷新为最新状态
你应该考虑一下,是不是开仓语句写在了平仓语句前。按照顺序执行的机制,还没运行止损语句,当然开仓语句是不能执行成功的。
这种问题只要把开仓语句和平仓语句前后顺序换一换,注意一下运行逻辑就行了,很简单的问题。