Begin
{
If(High>=上轨)//突破上轨开多单
{
Buy(lots,Max(Open,BuyPosition)+i_offset);
Return;
}
If(Low<=下轨)//突破下轨开空单
{
SellShort(lots,Min(Open,SellPosition)-i_offset);
Return;
}
}
If(MarketPosition == -1)
{
If(High>=上轨)//持有空单,突破上轨平空
{
BuyToCover(lots,Max(Open,BuyPosition)+i_offset);
Return;
}
}
If(MarketPosition == 1)
{
If(Low<=下轨)//持有多单,突破下轨平空
{
Sell(lots,Min(Open,SellPosition)-i_offset);
Return;
}
}
End
上下轨突破策略,以上代码执行时出现问题,当开仓后,同一根K线价格反方向运行达到平仓时,信号消失,在同一根K线即开仓又平仓,怎样解决?
图表系统无法描述K线内部的情况
如果同时满足2种情况,K线不能展现先上还是先下,则根据程序顺序执行
解决方法:
1、你的交易周期需要更小的周期
2、使用更严格的条件去控制,比如当根出过信号不再出
Begin
If(BarsSinceToday == 0)
{
TriggeredShort = False; 控制单根K线只交易一次
}
If(MarketPosition == 0 && !TriggeredShort)//开仓
{
If(Low<=SellPosition &&! TriggeredShort )//低于下轨开空
{
SellShort(lots,Min(Open,SellPosition));
TriggeredShort = True; // 标记触发
Return;
}
If(High>=BuyPosition &&! TriggeredShort )//高于上轨开多
{
Buy(lots,Max(Open,BuyPosition)+i_offset);
TriggeredShort = True; // 标记触发
Return;
}
}
//平仓;
。。。。。。。
我用一个bool变量控制只开仓次数,还出现闪烁,什么原因?
你这个控制不住
图表交易函数
IF块任何条件改变
都大概率导致闪烁
这是机制问题
你要小周期数据
1 小到同一个bar不会同时触发多个信号
2 but/sell外面的IF块,里面的变量不得有任何改变,也就是说,同一个bar,IF()里永恒不变
原本High/Low被理论上用来锁定唯一性
避免闪烁
但也带来同一个bar高低点同时触发多个信号
第二套方案
你也可以考虑
1 📊设置为双向交易
允许多空同时开仓
2 当前bar刚开仓则不平仓
下一个bar再处理
谢谢
Params
Numeric K1(0.05);//声明数值参数k1,初值为0.5,其实就是上轨系数,当然不喜欢这个数值的可以根据自己统计结果改的。//
Numeric K2(0.25);//声明数值参数k2,初值0.5,即下轨系数。//
Numeric Mday(1);//声明数值参数Mday,初值为1.//
Numeric lots(1);//声明数值参数lots,初值1,其实就是买卖手数。//
Numeric offset(0);//声明数值参数offset,初值0。//
Numeric TimesMaxToday(1); //限制当天开仓最多次数;
Vars
Numeric RangeX(0);//声明数值变量BuyRange,初值为0,即上轨幅度。//
Numeric BuyTrig(0);//声明数值变量BuyTrig,初值为0.//
Numeric SellTrig(0);//声明数值变量SellTrig,初值为0.//
Numeric HH;//声明数值变量HH。//
Numeric LL;//声明数值变量LL。//
Numeric HC;//声明数值变量HC。//
Numeric LC;//声明数值变量LC。//
Numeric i_offset;//声明数值变量i_offset。//
Numeric BuyPosition;//声明数值变量BuyPosition,即买入价格。//
Numeric SellPosition;//声明数值变量SellPosition,即卖出价格。//
Numeric myExitPrice; // 平仓价格
Numeric myPrePrice; //止盈价格
Series<Numeric> TimesToday(0); //记录当天开仓次数;
Bool BarTraded(False);//控制一根k线只开一次仓
Bool TriggeredShort(False);// 空条件触发标记
Events
onBar(ArrayRef<Integer> indexs)
{
i_offset = offset*MinMove*PriceScale;//其实就是之前一直说的最小跳动价固定公式了,这里就多添加了参数offset而已,即可以让你滑点委托成交。//
HH = Highest(HighD(1),Mday);//变量HH值即为昨天最高价。//
HC = Highest(CloseD(1),Mday);//变量HC值即为昨天的收盘价。//
LL = Lowest(LowD(1),Mday);//变量LL值为昨天最低价。//
LC = Lowest(CloseD(1),Mday);//变量LC值为昨天收盘价。跟变量HC一样的。//
RangeX=Max(HH - LC,HC - LL);//假如昨天最高价-昨天收盘价 >= 昨天收盘价-昨天最低价。//
BuyTrig = K1*RangeX;//根据上面求得的,直接代入解读了。//
SellTrig = K2*RangeX;//其实你看这两个公式都知道,上下幅度系数是一致的。//
BuyPosition = OpenD(0)+BuyTrig;//上轨,即开盘价 + BuyTrig。//
SellPosition = OpenD(0)-SellTrig;//下轨,即开盘价 - SellTrig。//
PlotNumeric("BuyPosition",BuyPosition);//画线上轨。//
PlotNumeric("SellPosition",SellPosition);//画线下轨。//
If(BarsSinceToday == 0)
{
TimesToday = 0;
TriggeredShort = False;
BarTraded = False;//控制一根k线只开一次仓
}
If(MarketPosition == 0 &&TimesToday<TimesMaxToday)
{
If(!TriggeredShort &&!BarTraded &&Low<=SellPosition)
{
TriggeredShort = True; // 标记触发
BarTraded = True; // 锁定当前K线
Commentary("空条件触发,停止当日交易");
Return;
}
If(!TriggeredShort &&!BarTraded &&High>=BuyPosition)//假如当前高价 >= 上轨。
{
Buy(lots,Max(Open,BuyPosition)+i_offset);
TimesToday = TimesToday+1;
BarTraded = True;
Return;//返回,不执行了。//
}
}
//平仓;
If(MarketPosition==1)
{
if(Low <= SellPosition)
{
Sell(lots, Min(Open, SellPosition) - i_offset);
}
Return;
}
Commentary("当天开仓次数="+Text(TimesToday));
}
//完整代码。自己找不出来闪烁的原因,恳请老师帮忙,策略逻辑如下:
/*上下轨只做多策略,价格先达到上轨,当日就只做多一次,如果先碰触下轨,当日停止交易,即使后面再碰触上轨了也不做多了*/
你两个帖子交叉问
问题跟你说了
buy/sell模式,不需要你去控制,加了控制,反而制造了闪烁,多此一举弄巧成拙;即使要控制,普通变量也毫无意义
你好好看看给你的建议
先把基本机制理顺了
不要一味编码
越搞越错
ok