StopPrice=EntryPrice+StopLength*MinMove*PriceScale;
//系统入场
If(MarketPosition !=-1)
{
If(Low <= DispBottom[1])
{
SellShort(0,Min(Open,DispBottom[1])); //强制开空
}
}
//系统出场
If(MarketPosition == -1)
{
If (High>=StopPrice)
{BuyToCover(0,StopPrice);}
If(BarsSinceEntry >0 && High >= DispTop[1])
{BuyToCover(0,Max(Open,DispTop[1]));} //买平
}
}
这段代码如果不在 If (High>=StopPrice)括号里加入 BarsSinceEntry >0这个条件 那么每根K线都会不停进出,检查了好几次,都满足不了条件,但是还是运行
结果如下
真是让人头皮发麻
如果加了BarsSinceEntry >0 那么如果当前K线的止损点位达到了 还是不会出 要硬扛到第二根去止损
与其相对的做多策略,却没有任何问题
StopPrice=EntryPrice-StopLength*MinMove*PriceScale;
//系统入场
If(MarketPosition !=1 )
{
If(High >= DispTop[1])
{
Buy(0,Max(Open,DispTop[1]));
}
}
//系统出场
If(MarketPosition == 1)
{
If (Low<=StopPrice)
{ Sell(0,Min(StopPrice,DispBottom[1]));}
If(BarsSinceEntry > 0 && Low <= DispBottom[1])
{ Sell(0,Min(Close,DispBottom[1]));}
执行结果如下
你在“//系统出场”这句下面,写一句 Commentary("StopPrice= " + Text( StopPrice));
把鼠标放到K线上,看看输出的StopPrice是多少,你一秒钟就能明白为什么它会当根k线平仓。因为你的StopPrice,在当根K线上,是一个很小的值,你的H永远大于这个StopPrice,它当然要平仓,完全符合逻辑。
怎么改?
把 StopPrice=EntryPrice+StopLength*MinMove*PriceScale; 这一句,放到开仓语句下面,平仓语句上面即可。也就是放到“//系统出场”这句的位置。
做多为什么看上去一切正常呢?因为你开仓那根K线上,StopPrice可能是个负数,L永远不会小于它,所以不会平仓。
实际上你这个在做多的情况下也不正常,因为你想要他实现当根K线该止损的时候还是要止损,但是你去看看你过去的所有做多的信号,有任何一个交易在当根K线止损了吗?恐怕没有。
代码有先后顺序,你先开了空,然后判断平空
然后平空又满足,自然就平空去了
关于当根K线止损的问题,建议放到下一根
因为K线系统无法解释K线内部的情况
为什么先开多就没有问题了
那个条件不可能达到的 因为是写的止损价格是1000, 但她还是不停开平 ,做多策略就没有这个问题