同一根K线信号消失问题
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、使用更严格的条件去控制,比如当根出过信号不再出
回复:BeginIf(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再处理
回复:谢谢
回复:ParamsNumeric 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); //限制当天开仓最多次数;VarsNumeric 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